2013-04-20 10 views
9

Ich arbeite durch einige der Tutorials auf http://www.ibm.com/developerworks/linux/library/l-gas-nasm/index.html, um mich mit x86/x64 vertraut zu machen. Dieses Tutorial Code kompiliert und läuft ohne Schluckauf des bereitgestellten Code verwenden, die AT & T-Syntax verwendet:Warum wird bei der Umstellung von AT & T auf die Intel-Syntax dieses Lernprogramm mit GAS segfault?

.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 

Allerdings, wenn ich diesen Code auf Intel-Syntax umwandeln, erhalte ich einen "Segmentation fault" Fehler.

.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 

Ich bin nicht vertraut mit x86, also vielleicht fehlt mir etwas. Irgendwelche Ideen?

+0

Haben Vergleichen Sie die Binärausgänge? –

+0

@ JensBjörnhager, ich habe die binären Ausgänge nicht verglichen. Ich bin ein Anfänger in der Versammlung, und ich weiß noch weniger binär. Gibt es etwas Spezifisches, das ich durch den Vergleich der Binärdateien bekommen kann, ohne ein Low-Level-Guru zu sein? – Alex

+0

Wahrscheinlich wurde 'mov rdi, offset message' erwähnt? –

Antwort

12

In AT & T-Syntax, mov $message, %rdi bedeutet die $sofort, die Adresse Nachricht bedeutet.

In GAS Intel Syntax bedeutet mov rdi, message absolute Adressierung, die Inhalt Bedeutung bei Nachricht. Um die tatsächliche Adresse Nachricht zu erhalten, müssen Sie das offset Schlüsselwort angeben: mov rdi, offset message.

Disassebly der beiden Binärdateien zeigt den Unterschied:

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

Vielen Dank, Jens! Das hat mir eine ganze Menge klargemacht. – Alex