Montage - Logische Anweisungen

Der Prozessorbefehlssatz enthält die Befehle AND, OR, XOR, TEST und NOT Boolean Logic, die die Bits entsprechend den Anforderungen des Programms testen, setzen und löschen.

Das Format für diese Anleitung -

Sr.Nr. Anweisung Format
1 UND UND Operand1, Operand2
2 ODER ODER Operand1, Operand2
3 XOR XOR-Operand1, Operand2
4 PRÜFUNG TEST operand1, operand2
5 NICHT NICHT operand1

Der erste Operand kann sich in allen Fällen entweder im Register oder im Speicher befinden. Der zweite Operand kann sich entweder im Register / Speicher oder in einem unmittelbaren (konstanten) Wert befinden. Speicher-zu-Speicher-Operationen sind jedoch nicht möglich. Diese Anweisungen vergleichen oder stimmen Bits der Operanden ab und setzen die Flags CF, OF, PF, SF und ZF.

Die AND-Anweisung

Der AND-Befehl wird zur Unterstützung logischer Ausdrücke verwendet, indem eine bitweise AND-Operation ausgeführt wird. Die bitweise UND-Operation gibt 1 zurück, wenn die übereinstimmenden Bits von beiden Operanden 1 sind, andernfalls gibt sie 0 zurück. Zum Beispiel -

Operand1: 	0101
             Operand2: 	0011
----------------------------
After AND -> Operand1:	0001

Die UND-Operation kann zum Löschen eines oder mehrerer Bits verwendet werden. Angenommen, das BL-Register enthält 0011 1010. Wenn Sie die höherwertigen Bits auf Null löschen müssen, UND-Verknüpfung mit 0FH.

AND	BL,   0FH   ; This sets BL to 0000 1010

Nehmen wir ein anderes Beispiel. Wenn Sie überprüfen möchten, ob eine bestimmte Zahl ungerade oder gerade ist, besteht ein einfacher Test darin, das niedrigstwertige Bit der Zahl zu überprüfen. Wenn dies 1 ist, ist die Zahl ungerade, andernfalls ist die Zahl gerade.

Angenommen, die Nummer befindet sich im AL-Register, können wir schreiben -

AND	AL, 01H     ; ANDing with 0000 0001
JZ    EVEN_NUMBER

Das folgende Programm veranschaulicht dies -

Beispiel

section .text
   global _start            ;must be declared for using gcc
	
_start:                     ;tell linker entry point
   mov   ax,   8h           ;getting 8 in the ax 
   and   ax, 1              ;and ax with 1
   jz    evnn
   mov   eax, 4             ;system call number (sys_write)
   mov   ebx, 1             ;file descriptor (stdout)
   mov   ecx, odd_msg       ;message to write
   mov   edx, len2          ;length of message
   int   0x80               ;call kernel
   jmp   outprog

evnn:   
  
   mov   ah,  09h
   mov   eax, 4             ;system call number (sys_write)
   mov   ebx, 1             ;file descriptor (stdout)
   mov   ecx, even_msg      ;message to write
   mov   edx, len1          ;length of message
   int   0x80               ;call kernel

outprog:

   mov   eax,1              ;system call number (sys_exit)
   int   0x80               ;call kernel

section   .data
even_msg  db  'Even Number!' ;message showing even number
len1  equ  $ - even_msg 
   
odd_msg db  'Odd Number!'    ;message showing odd number
len2  equ  $ - odd_msg

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Even Number!

Ändern Sie den Wert im Axtregister mit einer ungeraden Ziffer wie -

mov  ax, 9h                  ; getting 9 in the ax

Das Programm würde Folgendes anzeigen:

Odd Number!

Ebenso können Sie das gesamte Register mit 00H UND löschen.

Die OP-Anweisung

Der OR-Befehl wird zur Unterstützung des logischen Ausdrucks durch Ausführen einer bitweisen OR-Operation verwendet. Der bitweise ODER-Operator gibt 1 zurück, wenn die übereinstimmenden Bits von einem oder beiden Operanden eins sind. Es gibt 0 zurück, wenn beide Bits Null sind.

Zum Beispiel,

Operand1:     0101
             Operand2:     0011
----------------------------
After OR -> Operand1:    0111

Die ODER-Verknüpfung kann zum Setzen eines oder mehrerer Bits verwendet werden. Nehmen wir zum Beispiel an, das AL-Register enthält 0011 1010, Sie müssen die vier niederwertigen Bits setzen, Sie können es ODER mit einem Wert 0000 1111, dh FH, ODER.

OR BL, 0FH                   ; This sets BL to  0011 1111

Beispiel

Das folgende Beispiel zeigt die ODER-Anweisung. Speichern wir den Wert 5 und 3 in den Registern AL und BL, dann den Befehl,

OR AL, BL

sollte 7 im AL-Register speichern -

section .text
   global _start            ;must be declared for using gcc
	
_start:                     ;tell linker entry point
   mov    al, 5             ;getting 5 in the al
   mov    bl, 3             ;getting 3 in the bl
   or     al, bl            ;or al and bl registers, result should be 7
   add    al, byte '0'      ;converting decimal to ascii
	
   mov    [result],  al
   mov    eax, 4
   mov    ebx, 1
   mov    ecx, result
   mov    edx, 1 
   int    0x80
    
outprog:
   mov    eax,1             ;system call number (sys_exit)
   int    0x80              ;call kernel
	
section    .bss
result resb 1

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

7

Die XOR-Anweisung

Der XOR-Befehl implementiert die bitweise XOR-Operation. Die XOR-Operation setzt das resultierende Bit genau dann auf 1, wenn die Bits von den Operanden unterschiedlich sind. Wenn die Bits von den Operanden gleich sind (beide 0 oder beide 1), wird das resultierende Bit auf 0 gelöscht.

Zum Beispiel,

Operand1:     0101
             Operand2:     0011
----------------------------
After XOR -> Operand1:    0110

XORing Ein Operand mit sich selbst ändert den Operanden in 0. Dies wird verwendet, um ein Register zu löschen.

XOR     EAX, EAX

Die TEST-Anweisung

Der TEST-Befehl funktioniert genauso wie die AND-Operation, ändert jedoch im Gegensatz zum AND-Befehl nicht den ersten Operanden. Wenn wir also prüfen müssen, ob eine Zahl in einem Register gerade oder ungerade ist, können wir dies auch mit der Anweisung TEST tun, ohne die ursprüngliche Zahl zu ändern.

TEST    AL, 01H
JZ      EVEN_NUMBER

Die NOT-Anweisung

Der NOT-Befehl implementiert die bitweise NOT-Operation. Die Operation NOT kehrt die Bits in einem Operanden um. Der Operand kann sich entweder in einem Register oder im Speicher befinden.

Zum Beispiel,

Operand1:    0101 0011
After NOT -> Operand1:    1010 1100