web-dev-qa-db-fra.com

Assemblée 'call' vs 'jmp'

On m'a dit d'essayer et d'utiliser 'jmp plutôt que' call ', mais' jmp 'ne m'aime pas .. quand je saute, il ne revient pas (donc il ne sort jamais et pas des jours heureux), mais en appelant les retours et les sorties comme Ordinaire.

Je suis heureux d'utiliser 'call' mais y a-t-il vraiment une raison pour laquelle je devrais essayer de surmonter 'jmp'?

Ce code simple montre simplement si quand je jmp il ne revient jamais et quitte.

_start:

    jmp _Print
    jmp _Exit

ret


_Exit:

    ; normal exit 

ret


_Print

    ; print something

ret

aussi .. Je lance tout cela dans un terminal Linux si cela change quoi que ce soit.

14
user3502489

Eh bien, tout d'abord, jmp 'saute' simplement sur l'étiquette que vous lui donnez (qui est une adresse mémoire car les instructions du programme sont stockées en mémoire) tandis que call stocke l'emplacement où elle renverra (sous l'instruction call) dans la pile, jmp à l'étiquette, puis à l'instruction ret, jmp à quel emplacement était stocké (comme indiqué ci-dessus, sous l'instruction d'appel). Un peu de différence comme vous pouvez le voir. À mon humble avis, je pense qu'il est bien de simplement call fonctions, car c'est ce que le compilateur c ++ fait avec les fonctions, mais si vous devez jmp, alors d'accord, assurez-vous simplement de Push l'emplacement de retour ou créez une autre étiquette pour revenir à une fois terminé l'exécution du code.

Voici un exemple de saut vers une autre étiquette une fois terminé:

_start:



 jmp _Print;



_start_label:



 jmp _Exit;

_Exit:
 ; exit stuff goes here

 ret;     

_Print:

;print stuff goes here

jmp _start_label;

ou vous pouvez simplement utiliser l'appel :)

26
nameGoesHere