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