Я работаю над некоторыми учебниками на http://www.ibm.com/developerworks/linux/library/l-gas-nasm/index.html, чтобы ознакомиться с x86/x64. Этот обучающий код компилируется и работает без сбоев, используя предоставленный код, который использует синтаксис AT&T:
.global main
.text
main: # This is called by C library's startup code
mov $message, %rdi # First integer (or pointer) parameter in %edi
call puts # puts("Hello, World")
ret # Return to C library code
message:
.asciz "Hello, World" # asciz puts a 0x00 byte at the end
Однако, когда я преобразовываю этот код в синтаксис Intel, я получаю сообщение об ошибке «Ошибка сегментации».
.intel_syntax noprefix
.global main
.text
main: # This is called by C library's startup code
mov rdi, message # First integer (or pointer) parameter in %edi
call puts # puts("Hello, World")
ret # Return to C library code
message:
.asciz "Hello, World" # asciz puts a 0x00 byte at the end
Я не знаком с x86, поэтому, возможно, я что-то упускаю. Есть идеи?
mov rdi, offset message
? - person Egor Skriptunoff   schedule 20.04.2013mov rdi, message
наmov rdi, offset message
работает. Не могли бы вы указать мне правильное направление, почему это работает? Я предполагаю, что это как-то связано с указаниемrdi
на место в памяти прямо перед запускомmessage
? Почему смещение необходимо в синтаксисе Intel, а не AT&T? - person Alex   schedule 20.04.2013