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