2013-04-20 9 views
9

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で

+0

あなたは、バイナリ出力を比較しましたか? –

+0

@JensBjörnhager、私はバイナリ出力を比較しませんでした。私はアセンブリの初心者であり、私はバイナリをあまり知りません。低レベルの教師でなくてもバイナリを比較して得られるものがありますか? – Alex

+0

おそらく、「mov rdi、オフセットメッセージ」が言及されましたか? –

答えて

12

$メッセージのアドレスを意味し、即時を意味します。ガスのインテル構文で

mov rdi, messageメッセージコンテンツを意味し、絶対アドレッシングを意味します。実際の住所のメッセージをにするには、offsetというキーワード(mov rdi, offset message)を入力する必要があります。

2つのバイナリのDisasseblyは違いを示しています

& AT T:

0000000000000000 <main>: 
0: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 

インテル:

0000000000000000 <main>: 
0: 48 8b 3c 25 00 00 00 mov 0x0,%rdi 
+0

おかげで、ジェンス!それだけで私のためにたくさんのことが明らかになりました。 – Alex

関連する問題