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