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

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

最佳答案

在长(64位)模式下,通过从堆栈中将四字地址 pop 到ret来返回(%rip)。

在32位模式下,通过从堆栈中将dword地址 pop 到ret来返回(%eip)。

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

关于linux - retq和ret有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42653095/

10-11 18:39