Montage - Bedingungen
Die bedingte Ausführung in Assemblersprache wird durch mehrere Schleifen- und Verzweigungsanweisungen erreicht. Diese Anweisungen können den Steuerungsfluss in einem Programm ändern. Die bedingte Ausführung wird in zwei Szenarien beobachtet:
Sr.Nr. | Bedingte Anweisungen |
---|---|
1 | Unconditional jump Dies wird durch die JMP-Anweisung ausgeführt. Die bedingte Ausführung beinhaltet häufig eine Übertragung der Steuerung an die Adresse eines Befehls, der nicht dem aktuell ausgeführten Befehl folgt. Die Übertragung der Steuerung kann vorwärts erfolgen, um einen neuen Befehlssatz auszuführen, oder rückwärts, um dieselben Schritte erneut auszuführen. |
2 | Conditional jump Dies wird durch einen Satz von Sprungbefehlen j <Bedingung> abhängig von der Bedingung ausgeführt. Die bedingten Anweisungen übertragen die Steuerung, indem sie den sequentiellen Fluss unterbrechen, und sie tun dies, indem sie den Versatzwert in IP ändern. |
Lassen Sie uns die CMP-Anweisung diskutieren, bevor wir die bedingten Anweisungen besprechen.
CMP-Anweisung
Der CMP-Befehl vergleicht zwei Operanden. Es wird im Allgemeinen bei der bedingten Ausführung verwendet. Diese Anweisung subtrahiert grundsätzlich einen Operanden vom anderen, um zu vergleichen, ob die Operanden gleich sind oder nicht. Die Ziel- oder Quelloperanden werden nicht gestört. Es wird zusammen mit der bedingten Sprunganweisung zur Entscheidungsfindung verwendet.
Syntax
CMP destination, source
CMP vergleicht zwei numerische Datenfelder. Der Zieloperand kann sich entweder im Register oder im Speicher befinden. Der Quelloperand kann ein konstantes (unmittelbares) Daten-, Register- oder Speicherelement sein.
Beispiel
CMP DX, 00 ; Compare the DX value with zero
JE L7 ; If yes, then jump to label L7
.
.
L7: ...
CMP wird häufig verwendet, um zu vergleichen, ob ein Zählerwert die Häufigkeit erreicht hat, mit der eine Schleife ausgeführt werden muss. Betrachten Sie den folgenden typischen Zustand:
INC EDX
CMP EDX, 10 ; Compares whether the counter has reached 10
JLE LP1 ; If it is less than or equal to 10, then jump to LP1
Bedingungsloser Sprung
Wie bereits erwähnt, wird dies von der JMP-Anweisung ausgeführt. Die bedingte Ausführung beinhaltet häufig eine Übertragung der Steuerung an die Adresse eines Befehls, der nicht dem aktuell ausgeführten Befehl folgt. Die Übertragung der Steuerung kann vorwärts erfolgen, um einen neuen Befehlssatz auszuführen, oder rückwärts, um dieselben Schritte erneut auszuführen.
Syntax
Die JMP-Anweisung enthält einen Labelnamen, bei dem der Kontrollfluss sofort übertragen wird. Die Syntax der JMP-Anweisung lautet -
JMP label
Beispiel
Das folgende Codeausschnitt veranschaulicht die JMP-Anweisung -
MOV AX, 00 ; Initializing AX to 0
MOV BX, 00 ; Initializing BX to 0
MOV CX, 01 ; Initializing CX to 1
L20:
ADD AX, 01 ; Increment AX
ADD BX, AX ; Add AX to BX
SHL CX, 1 ; shift left CX, this in turn doubles the CX value
JMP L20 ; repeats the statements
Bedingter Sprung
Wenn eine bestimmte Bedingung im bedingten Sprung erfüllt ist, wird der Steuerfluss an einen Zielbefehl übertragen. Abhängig von der Bedingung und den Daten gibt es zahlreiche Anweisungen für bedingte Sprünge.
Im Folgenden sind die Anweisungen für bedingte Sprünge aufgeführt, die für signierte Daten verwendet werden, die für arithmetische Operationen verwendet werden.
Anweisung | Beschreibung | Flaggen getestet |
---|---|---|
JE / JZ | Jump Equal oder Jump Zero | ZF |
JNE / JNZ | Springe nicht gleich oder springe nicht Null | ZF |
JG / JNLE | Springe größer oder springe nicht weniger / gleich | OF, SF, ZF |
JGE / JNL | Springe größer / gleich oder springe nicht weniger | OF, SF |
JL / JNGE | Weniger springen oder nicht größer / gleich springen | OF, SF |
JLE / JNG | Weniger / gleich springen oder nicht größer springen | OF, SF, ZF |
Im Folgenden sind die Anweisungen für bedingte Sprünge aufgeführt, die für vorzeichenlose Daten verwendet werden, die für logische Operationen verwendet werden.
Anweisung | Beschreibung | Flaggen getestet |
---|---|---|
JE / JZ | Jump Equal oder Jump Zero | ZF |
JNE / JNZ | Springe nicht gleich oder springe nicht Null | ZF |
JA / JNBE | Über oder über nicht unter / gleich springen | CF, ZF |
JAE / JNB | Über / Gleich springen oder nicht unterspringen | CF. |
JB / JNAE | Springe nach unten oder springe nicht nach oben / gleich | CF. |
JBE / JNA | Springe unter / gleich oder springe nicht über | AF, CF. |
Die folgenden Anweisungen für bedingte Sprünge haben spezielle Verwendungszwecke und überprüfen den Wert von Flags -
Anweisung | Beschreibung | Flaggen getestet |
---|---|---|
JXCZ | Springe, wenn CX Null ist | keiner |
JC | Springen, wenn tragen | CF. |
JNC | Springen, wenn kein Tragen | CF. |
JO | Bei Überlauf springen | VON |
JNO | Springen, wenn kein Überlauf vorliegt | VON |
JP / JPE | Jump Parity oder Jump Parity Even | PF |
JNP / JPO | Jump No Parity oder Jump Parity Odd | PF |
JS | Sprungzeichen (negativer Wert) | SF |
JNS | Sprung ohne Vorzeichen (positiver Wert) | SF |
Die Syntax für den Befehlssatz J <Bedingung> -
Beispiel,
CMP AL, BL
JE EQUAL
CMP AL, BH
JE EQUAL
CMP AL, CL
JE EQUAL
NON_EQUAL: ...
EQUAL: ...
Beispiel
Das folgende Programm zeigt die größte von drei Variablen an. Die Variablen sind zweistellige Variablen. Die drei Variablen num1, num2 und num3 haben die Werte 47, 22 bzw. 31 -
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov ecx, [num1]
cmp ecx, [num2]
jg check_third_num
mov ecx, [num2]
check_third_num:
cmp ecx, [num3]
jg _exit
mov ecx, [num3]
_exit:
mov [largest], ecx
mov ecx,msg
mov edx, len
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov ecx,largest
mov edx, 2
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax, 1
int 80h
section .data
msg db "The largest digit is: ", 0xA,0xD
len equ $- msg
num1 dd '47'
num2 dd '22'
num3 dd '31'
segment .bss
largest resb 2
Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:
The largest digit is:
47