|
Als ich beim Lernen der Assemblersprache auf den folgenden Code stieß, dachte ich einfach, dass das Programm nicht normal enden könnte. Nach der Debug-Single-Step-Verfolgung stellte sich jedoch heraus, dass das Programm normal enden konnte, und es trat ein seltsames Phänomen auf: Als das Programm von Code:0005 zu Code:0014 ausführte, sprang es mit dem Befehl jmp weiter zu Code:0008. Wenn man jedoch einen Schritt vorwärts ausführt, springt das Programm direkt zu Code:0 statt zu Code:0018 (d. h. dem Segment der Bezeichnung S1). Anfangs verstand ich nicht, was vor sich ging, aber nach vielen Einzelbeobachtungen fühlte ich mich trotzdem seltsam. Nachdem ich die Verwendung der JMP-Anweisungen im Lehrbuch [1] sorgfältig studiert und anschließend das Programm in Kombination mit Maschinencode analysiert habe, habe ich ein neues Verständnis für JMP-Befehle. Assemble Code Address Offset (IP)-Maschineninstruktionen Angenommen CS:Code (Einheit: H) Code-Abschnitt mov ax,4c00h 0000 B8004C int 21h 0003 CD21 start: mov ax,0 0005 B80000 S: Nop 0008 90 NOP 0009 90 mov di,offset s 000A BF0800 mov si,offset 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 Code endet Endanfang 1. Die folgenden beiden Punkte müssen klar verstanden werden 1. Der Prozess der CPU-Befehlsausführung verläuft wie folgt: <1>. Lesen Sie die Befehle von der von CS:IP angezeigten Speichereinheit aus und legen sie in den Befehlspuffer. <2>. IP=IP+Die Länge der derzeit in den Puffer eingelesenen Befehl, das heißt, die IP zeigt auf die nächste Instruktion. <3>. Führe den aktuellen Befehl im Puffer aus. Geh zu Schritt <1> 2. Die Bedeutung des jmp-Kurzbefehls zur Übertragung des internen Segments <1>. IP ist der Offset, also die Adresse am IP = Designator – die Adresse des ersten Bytes nach dem jmp-Befehl. <2>. Die Funktion dieses Befehls besteht darin, den Wert von IP zu ändern, und nach Ausführung des Befehls gilt IP = IP + 8 Bit Offset < 3> und 8 Bits haben einen Verschiebungsbereich von -128~127, und der Offset wird in Form eines Komplements [2] angegeben. 2. Codeanalyse 1. Schritt 1: Das Programm beginnt mit der Ausführung beim Eingangsstart (Code:0005), wenn die Code:0013~0014-Anweisung ausgeführt wird, wird der Maschinencode der Anweisung jmp short S1 mit dem Label S2 auf Code:0008 kopiert, und die IP ist 0016. Zu diesem Zeitpunkt, vorausgesetzt, es gibt keine jmp short s-Anweisung, wird das Programm auf s2:jmp short s1 ausgeführt, jmp short s1 in den Befehlspuffer eingelesen und IP=0022; und die Übertragung von s2 zu s1 ist die intra-segmentbezogene Übertragung, das Maschinencode-Format ist EB disp und disp=Bezeichnung s1-Bezeichnung s2=(00018-0022) komplement=F6, daher sollte der Maschinencode des Befehls jmp short s1 EBF6 sein. Daher wird EBF6 in die Code:0008~code:0009-Einheit kopiert. 2. Schritt 2: Lesen Sie den Befehl jmp short s (EBF0) in den Befehlspuffer ein, IP=IP+0002=0018; der Komplementcode der Bezeichnung s0=(0008-0018) = F0, und die Übertragung von s0 zu s ist die Intra-Segment-Übertragung, und das Maschinencode-Format ist EB disp (d. h. EBF0) 3. Schritt 3: Der Befehl jmp short s(EBF0) ist ein Befehl zur Änderung der IP, nach Ausführung des Befehls EBF0, IP=IP+ (Bezeichnung s-Bezeichnung s0)=0008, der auf die Code:0008-Einheit zeigt. 4. Schritt 4: Lesen Sie den Inhalt des Einheitscode:0008. Da der Befehl jmp short s1 (EBF6) bei s2 in die Code:0008~code:0009-Einheit kopiert wird, gilt nach dem Lesen des Inhalts IP=IP+0002=000A 5. Schritt 5: Instruktion jmp short s1 (EBF6) ist ein Befehl zur Änderung der IP, nach Ausführung des Befehls EBF6, IP=IP+ (Bezeichnung s1-Bezeichnung s2)=0000, der auf die Code:0000-Einheit zeigt. 6. Schritt 6: Das Programm geht zum Code:0000, um ausgeführt zu werden, das heißt, das normale Ende ist abgeschlossen. 3. Nachwort Diesen Code richtig analysieren: Muss man den Prozess der CPU-Befehlsausführung und des JMP-Kurzschlusses verstehen? (berechnet durch IP-Modifikation). Zusätzlich ist auch der Komplementcode des Offset-Berechnungsergebnisses ein Schlüssel. Nach der Analyse dieses scheinbar abnormalen Codes erlangte ich ein tieferes Verständnis der JMP-Anweisungen in der Assembly.
|