web-dev-qa-db-fra.com

Quelle est la différence entre retq et ret?

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?

14
marmistrz

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).

15
ephemient