引数の符号なし二乗を計算する次のプログラムを考えてみましょう。
.global foo
.text
foo:
mov %rdi, %rax
mul %rdi
ret
これはas
によって適切にコンパイルされますが、逆アセンブルされます
0000000000000000 <foo>:
0: 48 89 f8 mov %rdi,%rax
3: 48 f7 e7 mul %rdi
6: c3 retq
ret
とretq
に違いはありますか?
ロング(64ビット)モードでは、スタックからクワッドワードアドレスを%rip
にポップすることで(ret
)を返します。
32ビットモードでは、スタックからdwordアドレスを%eip
にポップすることで(ret
)を返します。
objdump -d
などのいくつかのツールは、最初のツールretq
を呼び出します。これは単なる名前であり、命令のエンコードはどちらの方法でも同じです(C3
)。