http://www.ibm.com/developerworks/linux/library/l-gas-nasm/index.htmlのチュートリアルで、x86/x64に慣れるために取り組んでいます。このチュートリアルのコードはコンパイルされ、& T構文AT使用して提供されたコード、使用してしゃっくりせずに実行されます。私はインテルの構文にこのコードを変換する際になぜAT&TからIntelの構文に切り替えると、このチュートリアルで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
をしかし、私は「セグメンテーション違反」エラーが発生します。
.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に精通していないので、何かが足りなくなっています。何か案は? & T構文、mov $message, %rdi
ATで
あなたは、バイナリ出力を比較しましたか? –
@JensBjörnhager、私はバイナリ出力を比較しませんでした。私はアセンブリの初心者であり、私はバイナリをあまり知りません。低レベルの教師でなくてもバイナリを比較して得られるものがありますか? – Alex
おそらく、「mov rdi、オフセットメッセージ」が言及されましたか? –