Let’s consider the following program, which computes an unsigned square of the argument:
.global foo .text foo: mov %rdi, %rax mul %rdi ret
This is properly compiled by as
, but disassembles to
0000000000000000 <foo>: 0: 48 89 f8 mov %rdi,%rax 3: 48 f7 e7 mul %rdi 6: c3 retq
Is there any difference between ret
and retq
?
Advertisement
Answer
In long (64-bit) mode, you return (ret
) by popping a quadword address from the stack to %rip
.
In 32-bit mode, you return (ret
) by popping a dword address from the stack to %eip
.
Some tools like objdump -d
call the first one retq
. It’s just a name, the instruction encoding is the same either way (C3
).