让我们考虑以下程序,它计算参数的无符号平方:
.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
之间有什么区别吗?
答案 0 :(得分:13)
在长(64位)模式下,通过从堆栈弹出四字地址到ret
返回(%rip
)。
在32位模式下,您可以通过将堆栈地址从堆栈弹出到ret
来返回(%eip
)。
objdump -d
等某些工具会调用第一个retq
。它只是一个名称,指令编码的方式相同(C3
)。