2013-04-20 13 views
9

Sto lavorando ad alcuni tutorial su http://www.ibm.com/developerworks/linux/library/l-gas-nasm/index.html per familiarizzare con x86/x64. Questo codice esercitazione compilato ed eseguito senza un singhiozzo utilizzando il codice fornito, che usa AT & sintassi T:Perché il passaggio da AT & T a sintassi Intel rende questo tutorial segfault usando 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 

Tuttavia, quando converto questo codice per la sintassi Intel, ottengo un errore "Segmentation fault".

.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 

Non ho familiarità con x86, quindi forse mi manca qualcosa. Qualche idea?

+0

Hai confrontare le uscite binarie? –

+0

@ JensBjörnhager, non ho confrontato le uscite binarie. Sono un novizio in assemblea, e so anche meno binario. C'è qualcosa di specifico che posso ottenere confrontando i binari senza essere un guru di basso livello? – Alex

+0

Probabilmente, è stato menzionato 'mov rdi, offset message'? –

risposta

12

In AT & T sintassi, mov $message, %rdi, il $ significa immediato, cioè l'indirizzo del messaggio .

Nella sintassi Intel di GAS, mov rdi, message significa indirizzamento assoluto, cioè il contenuto di a messaggio. Per ottenere l'indirizzo effettivo del messaggio , è necessario fornire la parola chiave offset: mov rdi, offset message.

Disassebly dei due binari mostra la differenza:

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

Grazie mille, Jens! Questo ha appena chiarito un bel po 'per me. – Alex