dopo codice assembly studio, qui è il mio pensiero: diamo un'occhiata a un campione:
fun:
push %rbp
mov %rsp,%rbp
...
...
pop %rbp
retq
main:
...
...
callq "address" <fun>
...
...
possiamo vedere c'è un'istruzione prima di RETQ. il "pop% rbp" (a volte si tratta di un'istruzione di congedo, ma ci sono simili) di istruzioni sarà
- spostare il contenuto della corrente del puntatore dello stack (RSP) punti e salvare stack pointer base (RSP).
- sposta rsp e puntatore al precedente indirizzo in pila.
ad esempio: prima comando pop: RSP è stato sottolineato 0x0000 0000 0000 00D0
dopo comando pop: 0x0000 0000 0000 00D8 (assumere la pila cresce dall'alto indirizzo a partire indirizzo)
dopo il comando pop, ora rsp punta a un nuovo indirizzo e retq prende questo indirizzo come indirizzo di ritorno.
Se si vuole sperimentare, provare a sostituire 'retq' con' addq $ 8,% rsp; jmpq -8 (% rsp) '. Funzionalmente equivalente (non per quanto riguarda le prestazioni). –