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?
Haben Vergleichen Sie die Binärausgänge? –
@ 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
Wahrscheinlich wurde 'mov rdi, offset message' erwähnt? –