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