In termini semplificati:
chiamata indirizzo
Questo spingerà il program counter aggiornato (che indica l'istruzione successiva call
) nello stack poi passa alla indirizzo indicato (possono essere applicate le modalità di indirizzamento).
ret
Questa istruzione apre internamente e l'indirizzo dallo stack e salta ad esso. Questo è ben adattato con call
in modo che possa tornare alle istruzioni dopo il precedente call
.
JMP indirizzo
Questo salta semplicemente alla data indirizzo (possono essere modalità di indirizzamento). Non fa assolutamente nulla con lo stack.
Così, si può anche fare questo:
push address
ret
Quale pop e saltare al indirizzo che è stato inserito nello stack come descritto sopra. È un modo intelligente per eseguire un salto indiretto in un microprocessore che non supporta le modalità di indirizzamento indiretto nelle istruzioni di salto.
La sequenza:
push address
jmp someplace
Sarà salta semplicemente a qualche parte e non influisce sulla pila o utilizzare l'indirizzo che è stato inserito nello stack. Se l'indirizzo è l'istruzione successiva allo jmp
, è equivalente a call someplace
.
Per set di istruzioni che non supportano un salto indirizzamento indiretto, Ho visto questo bel po 'di lavoro-around:
push address
ret
Quale salterà a qualunque address
è.
Inusuali variazioni di questi sono spesso utilizzati quando l'autore vuole oscurare la vera funzionalità del codice (ad es. Malware e software commerciale "protetto da copia"). –
Non 'ret' essenzialmente' pop e salta indirettamente all'indirizzo popped'? –
@JohnHascall si, è ... "duh" da parte mia. : p Stavo pensando "no" call', no "ret". :) – lurker