web-dev-qa-db-ja.com

retqとretの違いは何ですか?

引数の符号なし二乗を計算する次のプログラムを考えてみましょう。

.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   

retretqに違いはありますか?

14
marmistrz

ロング(64ビット)モードでは、スタックからクワッドワードアドレスを%ripにポップすることで(ret)を返します。

32ビットモードでは、スタックからdwordアドレスを%eipにポップすることで(ret)を返します。

objdump -dなどのいくつかのツールは、最初のツールretqを呼び出します。これは単なる名前であり、命令のエンコードはどちらの方法でも同じです(C3)。

15
ephemient