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