L'Assembly 'appel' vs 'jmp'
Je me suis dit d'essayer et d'utiliser 'jmp plutôt que "d'appel", mais " jmp " n'est pas aimer moi .. quand je saute, il ne retourne pas (donc il se ferme jamais et pas des jours heureux ), mais l'appel retourne et sort comme d'habitude.
Je suis heureux à l'aide de "appel" mais est-il réellement une raison que je devrais essayer de surmonter 'jmp' ?
ce simple code montre juste si quand je 'jmp' il ne revient jamais et les sorties.
Merci à l'avance pour toute aide.
_start:
jmp _Print
jmp _Exit
ret
_Exit:
; normal exit
ret
_Print
; print something
ret
aussi .. je suis en cours d'exécution tout cela dans un terminal linux si cela change quoi que ce soit
C'est ambigu, et très flou. JMP n'a pas mis en place de la pile (en poussant la valeur de retour) donc, quand vous faites une
Je pense que votre question peut avoir une réponse de ce type: stackoverflow.com/a/28133370/3857942 .
Il n'y a pas de raison que je pense (dans ce cas) à utiliser
Certaines des réponses sur ce fil pourrait être utile. stackoverflow.com/questions/41205054/...
ret
, une fausse adresse de retour obtient sauté hors de la pile et de votre code sauts. Vous pouvez simuler une call
avec un jmp
mais avant de faire jmp vous devez pousser l'adresse de retour sur la pile vous-même. Ce que l'assembleur et quel système d'exploitation êtes-vous cibler? 16 ou 32 bits?Je pense que votre question peut avoir une réponse de ce type: stackoverflow.com/a/28133370/3857942 .
Il n'y a pas de raison que je pense (dans ce cas) à utiliser
JMP
au lieu de cela, sauf à faire à l'école pour vous apprendre comment faire un CALL
et RET
fonction de la simulation de l' CALL
avec JMP
. Il sera également vous apprendre quelque chose à propos de la pileCertaines des réponses sur ce fil pourrait être utile. stackoverflow.com/questions/41205054/...
OriginalL'auteur user3502489 | 2015-09-26
Vous devez vous connecter pour publier un commentaire.
Bien, tout d'abord,
jmp
simplement "sauts" à l'étiquette que vous donnez (qui est une adresse en mémoire que les instructions d'un programme sont stockées dans la mémoire), tandis quecall
stocke l'emplacement où il sera de retour (en dessous de lacall
instruction) dans la pile,jmp
de l'étiquette, puis à laret
instruction,jmp
retour à ce que l'emplacement a été stocké (comme il est dit ci-dessus, ci-dessous l'appel de l'instruction). Un peu à l'écart comme vous pouvez le voir. À mon humble avis, je crois qu'il est bon de simplementcall
fonctions, comme c'est ce que le compilateur c++ avec les fonctions, mais si vous devezjmp
, alors bon ensuite, assurez-vous depush
de la location de retour ou en créer une autre étiquette de retour une fois de faire exécuter du code.Voici un exemple du saut à l'autre de l'étiquette lorsqu'fait:
ou vous pouvez simplement utiliser l'appel 🙂
pas de problème! Je suis content que ça a aidé!
OriginalL'auteur nameGoesHere