Cet article est un article miroir de traduction automatique, veuillez cliquer ici pour accéder à l’article original.

Vue: 15003|Répondre: 0

[Démontage] Explication détaillée de l’utilisation de la commande assembly JMP

[Copié le lien]
Publié sur 03/11/2014 23:32:49 | | |
Quand je suis tombé sur le code suivant en apprenant le langage assembleur, j’ai simplement pensé que le programme ne pouvait pas se terminer normalement. Cependant, après un suivi en une seule étape de débogage, il a été constaté que le programme pouvait se terminer normalement, et un phénomène étrange s’est produit : lorsque le programme commençait à s’exécuter du code :0005 au code :0014, il continuait à sauter au code :0008 avec la commande jmp. Cependant, lorsqu’on continue à effectuer un pas en avant, le programme passe directement à code :0 au lieu de code :0018 (c’est-à-dire au segment désigné S1). Au début, je ne comprenais pas ce qui se passait, mais après de nombreuses observations en un seul pas, je me sentais encore bizarre. Après avoir étudié attentivement l’utilisation des instructions JMP dans le manuel [1], puis analysé le programme en combinaison avec du code machine, j’ai une nouvelle compréhension des instructions JMP.

instructions machine à décalage d’adresse de code assembler (IP)  

Supposer CS :Code (Unité : H)

Segment de code

        mov ax, 4C00h 0000 B8004C   

        int 21h 0003 CD21

start:  mov ax,0            0005         B80000

    S : NOP 0008 90

        NOP 0009 90

        mov di, décalage s 000A BF0800

        mov si, décalage s2 000D BE2000        

        mov ax,cs :[si] CS :0020=F6EB

        mov cs :[di],ax CS :0008=9090

    s0 : jmp short s 0016 EBF0

    s1 : mov ax, 0 0018 B80000

        int 21h 001B CD21

        mov ax, 0 001D B80000

    s2 : jmp short s1 0020 EBF6

        NOP 0022 90

Fin du code

fin du départ

1. Les deux points suivants doivent être compris clairement
1. Le processus d’exécution des instructions CPU est le suivant :
<1>. Lisez l’instruction depuis l’unité mémoire pointée par CS :IP et placez-la dans le tampon d’instructions.
<2>. IP = IP+La longueur de l’instruction actuellement lue dans le tampon, c’est-à-dire que l’IP pointe vers l’instruction suivante.
<3>. Exécutez la commande actuelle dans le tampon. Passe à l’étape <1>
2. La signification de la commande courte jmp pour transférer le segment interne
<1>. IP est le décalage, c’est-à-dire l’adresse au désignateur IP = - l’adresse du premier octet après la commande jmp.
<2>. La fonction de cette commande est de modifier la valeur de IP, et après l’exécution de la commande, IP = IP + décalage de 8 bits
< 3> et 8 bits ont une plage de déplacement de -128~127, et le décalage est exprimé sous forme de complémentaire [2].
2. Analyse de code
1. Étape 1 : Le programme commence à s’exécuter dès le début de l’entrée (code :0005), lorsque l’instruction code :0013~0014 est exécutée, le code machine de l’instruction jmp short S1 à l’étiquette S2 est copié en code :0008, et l’IP est 0016. À ce moment-là, en supposant qu’il n’y ait pas d’instruction jmp short s, le programme sera exécuté en s2 :jmp short s1, lira jmp short s1 dans le tampon d’instructions et IP=0022 ; et le transfert de s2 vers s1 est le transfert intra-segment, le format du code machine est EB disp, et disp=désignation s1-désignation s2=(00018-0022) complément=F6, donc le code machine de la commande jmp short s1 devrait être EBF6. Par conséquent, EBF6 est copié dans l’unité code :0008~code :0009.
2. Étape 2 : Lisez l’instruction jmp short s (EBF0) dans le tampon d’instructions,
IP=IP+0002=0018 ; le code complémentaire de la désignation s-désignation s0=(0008-0018) = F0, et le transfert de s0 vers s est le transfert intra-segment, et le format de code machine est EB disp (c’est-à-dire EBF0)
3. Étape 3 : La commande jmp short s(EBF0) est une commande pour modifier l’IP, après avoir exécuté la commande EBF0, IP=IP+(désignation s-désignation s0)=0008, pointant vers le code : 0008 unit.
4. Étape 4 : Lisez le contenu du code d’unité :0008. Puisque la commande jmp short s1 (EBF6) à s2 est copiée dans le code :0008~code :0009 unit, après avoir lu le contenu de l’unité, IP=IP+0002=000A
5. Étape 5 : L’instruction jmp court s1 (EBF6) est une commande pour modifier IP, après avoir exécuté la commande EBF6, IP=IP+(désignation s1-désignation s2)=0000, pointant vers le code :0000 unit.
6. Étape 6 : Le programme passe au code :0000 pour s’exécuter, c’est-à-dire que la fin normale est terminée.
3. Post-scriptum
Analysez correctement ce code : Besoin de comprendre le processus d’exécution des instructions CPU et le court jmp ? (calculé par modification IP). De plus, le code complémentaire du résultat du calcul du décalage est également un élément clé. Après avoir analysé ce code apparemment anormal, j’ai acquis une compréhension plus approfondie des instructions JMP dans l’assembleur.





Précédent:Événement « Sim Couple » de la Journée des Célibataires
Prochain:Comment utiliser l’abstrait en Java en détail
Démenti:
Tous les logiciels, supports de programmation ou articles publiés par Code Farmer Network sont uniquement destinés à l’apprentissage et à la recherche ; Le contenu ci-dessus ne doit pas être utilisé à des fins commerciales ou illégales, sinon les utilisateurs assumeront toutes les conséquences. Les informations sur ce site proviennent d’Internet, et les litiges de droits d’auteur n’ont rien à voir avec ce site. Vous devez supprimer complètement le contenu ci-dessus de votre ordinateur dans les 24 heures suivant le téléchargement. Si vous aimez le programme, merci de soutenir un logiciel authentique, d’acheter l’immatriculation et d’obtenir de meilleurs services authentiques. En cas d’infraction, veuillez nous contacter par e-mail.

Mail To:help@itsvse.com