2015-09-26 33 views
8

Mi è stato detto di provare a utilizzare 'jmp anziché' call ', ma' jmp 'non mi piace .. quando salto non ritorna (quindi non esce mai e giorni non felici), ma chiamando i ritorni e le uscite normalmente.Assembly 'call' vs 'jmp'

Sono felice di usare "chiamata", ma c'è davvero una ragione per cui dovrei provare a superare "jmp"?

questo semplice codice mostra solo se quando I 'jmp' non ritorna mai ed esce.

Grazie in anticipo per qualsiasi aiuto.

_start: 

    jmp _Print 
    jmp _Exit 

ret 


_Exit: 

    ; normal exit 

ret 


_Print 

    ; print something 

ret 

anche .. Io corro tutto questo in un terminale Linux se questo cambia nulla

+3

Questa è ambigua, e molto poco chiaro. JMP non imposta lo stack (premendo il valore di ritorno) così quando si esegue un 'ret', un indirizzo di ritorno fasullo viene estratto dallo stack e il codice salta su di esso. Puoi simulare un 'call' con un' jmp', ma prima di fare jmp devi inserire tu stesso l'indirizzo di ritorno nello stack. Quale assemblatore e quale sistema operativo stai prendendo di mira? 16 o 32 bit? –

+0

Penso che la tua domanda potrebbe avere una risposta simile a questa: http://stackoverflow.com/a/28133370/3857942. –

+0

Non c'è motivo per cui io possa pensare (in questo caso) di usare 'JMP', eccetto che a scuola per insegnare come una funzione' CALL' e 'RET' insieme simulando' CALL' con 'JMP '. Ti insegnerà anche qualcosa sullo stack –

risposta

9

Beh, prima di tutto, jmp semplicemente 'salta' l'etichetta che si dà ad essa (che è un indirizzo di memoria come istruzioni del programma sono archiviati in memoria) mentre call memorizza la posizione in cui ritornerà (sotto l'istruzione call) nello stack, jmp all'etichetta e quindi all'istruzione ret, jmp indietro a quale posizione è stata memorizzata (come detto sopra, sotto l'istruzione di chiamata). Un po 'di differenza lì come puoi vedere. IMHO, credo che funzioni semplicemente call, in quanto è ciò che il compilatore C++ fa con le funzioni, ma se devi jmp, allora va bene, assicurati di push il percorso di ritorno o crea un'altra etichetta per tornare a una volta fatto eseguendo del codice.

Ecco un esempio di saltare per le altre etichette quando fatto:

_start: 



jmp _Print; 



_start_label: 



jmp _Exit; 

_Exit: 
; exit stuff goes here 

ret;  

_Print: 

;print stuff goes here 

jmp _start_label; 

o si potrebbe utilizzare chiamare :)

+0

Questo sicuramente chiarisce le cose grazie! Ho appena iniziato a studiare il montaggio questa settimana, quindi è bene ricevere consigli come questo. – user3502489

+0

nessun problema! Sono contento che mi abbia aiutato! – nameGoesHere