让我们考虑以下程序,该程序计算参数的无符号平方:
.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
有什么区别? 最佳答案
在长(64位)模式下,通过从堆栈中将四字地址 pop 到ret
来返回(%rip
)。
在32位模式下,通过从堆栈中将dword地址 pop 到ret
来返回(%eip
)。
诸如objdump -d
之类的一些工具将第一个称为retq
。这只是一个名称,指令编码是相同的(C3
)。
关于linux - retq和ret有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42653095/