retq和ret有什么区别?

时间:2017-03-07 16:13:46

标签: linux assembly x86-64

让我们考虑以下程序,它计算参数的无符号平方:

.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之间有什么区别吗?

1 个答案:

答案 0 :(得分:13)

在长(64位)模式下,通过从堆栈弹出四字地址到ret返回(%rip)。

在32位模式下,您可以通过将堆栈地址从堆栈弹出到ret来返回(%eip)。

objdump -d等某些工具会调用第一个retq。它只是一个名称,指令编码的方式相同(C3)。