Prenons le programme suivant, qui calcule un carré non signé de l'argument:
.global foo
.text
foo:
mov %rdi, %rax
mul %rdi
ret
Ceci est correctement compilé par as
, mais se désassemble pour
0000000000000000 <foo>:
0: 48 89 f8 mov %rdi,%rax
3: 48 f7 e7 mul %rdi
6: c3 retq
Y a-t-il une différence entre ret
et retq
?
En mode long (64 bits), vous retournez (ret
) en insérant une adresse de quatre mots de la pile dans %rip
.
En mode 32 bits, vous retournez (ret
) en insérant une adresse dword de la pile dans %eip
.
Certains outils comme objdump -d
appeler le premier retq
. C'est juste un nom, le codage des instructions est le même dans les deux cas (C3
).