Я изучаю некоторые из уроков на http://www.ibm.com/developerworks/linux/library/l-gas-nasm/index.html, чтобы ознакомиться с x86/x64. Этот код учебника компилируется и работает без икоты, используя предоставленный код, который использует AT & T синтаксиса:Почему переход с AT & T на синтаксис Intel делает этот учебник segfault с использованием GAS?
.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, поэтому, возможно, я чего-то не хватает. Есть идеи?
ли вы сравнить двоичные выходы? –
@ JensBjörnhager, я не сравнивал двоичные выходы. Я новичок в сборке, и я знаю еще меньше двоичных файлов. Есть ли что-то конкретное, что я могу получить от сравнения двоичных файлов, не являясь гуру низкого уровня? – Alex
Возможно, упоминалось 'mov rdi, offset message'? –