问题 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   

两者之间有什么区别吗? ret 和 retq


4272
2018-03-07 16:13


起源

retq 是明确的操作数大小,但它是相同的指令。 - Jester


答案:


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

在32位模式下,您返回(ret)通过从堆栈弹出双字地址到 %eip

一些工具如 objdump -d 打电话给第一个 retq。它只是一个名称,指令编码是相同的两种方式(C3)。


10
2018-03-07 17:15



堆栈指针 rsp 得到更新时 retq/ret 执行?或者必须手动完成? - stillanoob
明显。毕竟它确实流行起来。 - jv110