Montaż - instrukcje logiczne
Zestaw instrukcji procesora zawiera instrukcje AND, OR, XOR, TEST i NOT logikę Boole'a, która testuje, ustawia i czyści bity zgodnie z potrzebami programu.
Format tych instrukcji -
Sr.No. | Instrukcja | Format |
---|---|---|
1 | I | AND operand1, operand2 |
2 | LUB | OR operand1, operand2 |
3 | XOR | XOR operand1, operand2 |
4 | TEST | TEST operand1, operand2 |
5 | NIE | NIE operand1 |
Pierwszy operand we wszystkich przypadkach może znajdować się w rejestrze lub w pamięci. Drugi operand może znajdować się w rejestrze / pamięci lub mieć wartość bezpośrednią (stałą). Jednak operacje między pamięcią a pamięcią nie są możliwe. Te instrukcje porównują lub dopasowują bity operandów i ustawiają flagi CF, OF, PF, SF i ZF.
Instrukcja AND
Instrukcja AND jest używana do obsługi wyrażeń logicznych poprzez wykonywanie operacji bitowej AND. Operacja bitowa AND zwraca 1, jeśli pasujące bity z obu operandów wynoszą 1, w przeciwnym razie zwraca 0. Na przykład -
Operand1: 0101
Operand2: 0011
----------------------------
After AND -> Operand1: 0001
Operacja AND może służyć do kasowania jednego lub więcej bitów. Na przykład, powiedzmy, że rejestr BL zawiera 0011 1010. Jeśli chcesz skasować najwyższe bity do zera, to ORAZ to z 0FH.
AND BL, 0FH ; This sets BL to 0000 1010
Weźmy inny przykład. Jeśli chcesz sprawdzić, czy podana liczba jest nieparzysta czy parzysta, prostym testem byłoby sprawdzenie najmniej znaczącego bitu liczby. Jeśli jest to 1, liczba jest nieparzysta, w przeciwnym razie liczba jest parzysta.
Zakładając, że numer jest w rejestrze AL, możemy napisać -
AND AL, 01H ; ANDing with 0000 0001
JZ EVEN_NUMBER
Poniższy program ilustruje to -
Przykład
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
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
Even Number!
Zmień wartość w rejestrze ax na nieparzystą cyfrę, na przykład -
mov ax, 9h ; getting 9 in the ax
Program wyświetli:
Odd Number!
Podobnie, aby wyczyścić cały rejestr, możesz ORAZ to zrobić za pomocą 00H.
Instrukcja OR
Instrukcja OR jest używana do obsługi wyrażeń logicznych poprzez wykonywanie operacji bitowej OR. Operator bitowy OR zwraca 1, jeśli pasujące bity z jednego lub obu operandów są jednością. Zwraca 0, jeśli oba bity są zerowe.
Na przykład,
Operand1: 0101
Operand2: 0011
----------------------------
After OR -> Operand1: 0111
Operacja OR może służyć do ustawiania jednego lub więcej bitów. Na przykład załóżmy, że rejestr AL zawiera 0011 1010, musisz ustawić cztery najmniej znaczące bity, możesz OR na wartość 0000 1111, czyli FH.
OR BL, 0FH ; This sets BL to 0011 1111
Przykład
Poniższy przykład ilustruje instrukcję OR. Zapiszmy wartość 5 i 3 odpowiednio w rejestrach AL i BL, a następnie instrukcję,
OR AL, BL
powinien przechowywać 7 w rejestrze AL -
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
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
7
Instrukcja XOR
Instrukcja XOR implementuje bitową operację XOR. Operacja XOR ustawia wynikowy bit na 1, wtedy i tylko wtedy, gdy bity argumentów są różne. Jeśli bity z operandów są takie same (oba 0 lub oba 1), wynikowy bit jest zerowany.
Na przykład,
Operand1: 0101
Operand2: 0011
----------------------------
After XOR -> Operand1: 0110
XORing operand sam ze sobą zmienia operand na 0. Służy do czyszczenia rejestru.
XOR EAX, EAX
Instrukcja TEST
Instrukcja TEST działa tak samo jak operacja AND, ale w przeciwieństwie do instrukcji AND nie zmienia pierwszego operandu. Jeśli więc musimy sprawdzić, czy liczba w rejestrze jest parzysta, czy nieparzysta, możemy to również zrobić za pomocą instrukcji TEST bez zmiany pierwotnej liczby.
TEST AL, 01H
JZ EVEN_NUMBER
Instrukcja NOT
Instrukcja NOT implementuje operację bitową NOT. Operacja NOT odwraca bity w operandzie. Operand może znajdować się w rejestrze lub w pamięci.
Na przykład,
Operand1: 0101 0011
After NOT -> Operand1: 1010 1100