Zajmuję się niektórymi samouczkami dotyczącymi http://www.ibm.com/developerworks/linux/library/l-gas-nasm/index.html, aby zapoznać się z x86/x64. Kod ten poradnik kompiluje i działa bez czkawki przy użyciu dostarczonego kodu, który wykorzystuje AT & składni T:Dlaczego przełączanie z AT & T na składnię Intel powoduje, że ten samouczek zostaje uszkodzony za pomocą 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
Jednakże gdy przekonwertować ten kod do składni Intela, pojawia się komunikat „Usterka” Segmentacja błąd.
.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
Nie znam x86, więc być może czegoś brakuje. Jakieś pomysły?
Czy porównania wyjść binarnych? –
@ JensBjörnhager, nie porównałem wyjść binarnych. Jestem nowicjuszem w montażu i wiem jeszcze mniej binarnie. Czy jest coś konkretnego, co mogę osiągnąć dzięki porównaniu plików binarnych bez bycia guru niskiego poziomu? – Alex
Prawdopodobnie wspomniano o "mov rdi, offset message"? –