让我们考虑以下程序,它计算参数的无符号平方:
.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
and retq
?
在长(64 位)模式下,您返回 (ret
)通过从堆栈中弹出一个四字地址到%rip
.
在 32 位模式下,您返回 (ret
)通过从堆栈中弹出一个双字地址到%eip
.
一些工具,例如objdump -d
呼叫第一个retq
。这只是一个名称,指令编码无论哪种方式都是相同的(C3
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)