2013-04-20 4 views
9

Я изучаю некоторые из уроков на 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, поэтому, возможно, я чего-то не хватает. Есть идеи?

+0

ли вы сравнить двоичные выходы? –

+0

@ JensBjörnhager, я не сравнивал двоичные выходы. Я новичок в сборке, и я знаю еще меньше двоичных файлов. Есть ли что-то конкретное, что я могу получить от сравнения двоичных файлов, не являясь гуру низкого уровня? – Alex

+0

Возможно, упоминалось 'mov rdi, offset message'? –

ответ

12

В AT & T синтаксис, mov $message, %rdi, то $ означает немедленное , то есть адрес сообщения.

В синтаксисе Intel газа, в mov rdi, message означает абсолютную адресацию, то есть содержание в сообщение. Чтобы получить фактический адрес сообщение, вам необходимо указать ключевое слово offset: mov rdi, offset message.

Disassebly из двух двоичных файлов показывает разницу:

AT & T:

0000000000000000 <main>: 
0: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 

Intel:

0000000000000000 <main>: 
0: 48 8b 3c 25 00 00 00 mov 0x0,%rdi 
+0

Спасибо, кучка, Дженс! Это просто прояснило мне многое. – Alex

 Смежные вопросы

  • Нет связанных вопросов^_^