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)
有什么区别ret和retq?
eph*_*ent 17
在长(64位)模式下,ret通过从堆栈弹出四字地址返回()返回()%rip.
在32位模式下,ret通过从堆栈弹出双字地址返回()返回()%eip.
有些工具比如说objdump -d第一个retq.它只是一个名称,指令编码是相同的方式(C3).