Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 15003|Antwort: 0

[Auseinandersetzung] Detaillierte Erklärung zur Verwendung des Assemblerkommandos JMP

[Link kopieren]
Veröffentlicht am 03.11.2014 23:32:49 | | |
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.





Vorhergehend:Singles' Day "Sim Couple"-Event
Nächster:Wie man Abstract in Java im Detail verwendet
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com