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