retq和ret有什么区别?

mar*_*trz 16 linux assembly x86-64

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

.global foo
.text
foo:
    mov %rdi, %rax
    mul %rdi
    ret
Run Code Online (Sandbox Code Playgroud)

这是由适当编译as,但反汇编

0000000000000000 <foo>:
   0:   48 89 f8                mov    %rdi,%rax
   3:   48 f7 e7                mul    %rdi
   6:   c3                      retq   
Run Code Online (Sandbox Code Playgroud)

有什么区别retretq

eph*_*ent 17

在长(64位)模式下,ret通过从堆栈弹出四字地址返回()返回()%rip.

在32位模式下,ret通过从堆栈弹出双字地址返回()返回()%eip.

有些工具比如说objdump -d第一个retq.它只是一个名称,指令编码是相同的方式(C3).