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
?
The retq instruction pops the return address from the stack into the destination %rip , thus resuming at the saved return address.
After the pop command, now %rsp points to a new address and retq takes this address as return address.
cltq is the AT&T mnemonic for CDQE, which sign-extends EAX into RAX. It's a short-form of movslq %eax, %rax , saving code bytes. It exists because of how x86-64 evolved from 8086 to 386 to AMD64. It copies the sign bit of EAX to all the upper bits of the wider register, because that's how 2's complement works.
The RAX register is used for return values in functions regardless of whether you're working with Objective-C or Swift.
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
).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With