retq和ret有什么区别?

30

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

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


3
"retq" 明确了操作数的大小,但它是相同的指令。 - Jester
1个回答

35

在长模式(64位)下,通过从栈中弹出一个8字节地址到%rip来返回(ret)。

在32位模式下,通过从栈中弹出一个4字节地址到%eip来返回(ret)。

一些工具,如objdump -d,将第一个称为retq。这只是一个名称,指令编码都是相同的(C3)。


当执行retq/ret指令时,栈指针rsp是否会自动更新?还是需要手动更新? - stillanoob
显然,它确实弹出了。 - jv110
1
@stillanoob,ret指令有两个作用:(1)弹出堆栈(通过从rsp中减去4或8来修改它)(2)改变rip(因为弹出的值进入rip)。 - Fixee
push指令会减少%rsp/%esp的值,而pop指令会增加它的值。因此,在64位系统中,ret指令会将%rsp的值增加8个字节,在32位系统中,会将%esp的值增加4个字节。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接