Assemblaggio - Istruzioni logiche

Il set di istruzioni del processore fornisce le istruzioni AND, OR, XOR, TEST e NOT Boolean logica, che verifica, imposta e cancella i bit in base alle necessità del programma.

Il formato per queste istruzioni -

Sr.No. Istruzioni Formato
1 E AND operando1, operando2
2 O OR operando1, operando2
3 XOR Operando 1 XOR, operando 2
4 TEST TEST operando1, operando2
5 NON NON operando 1

Il primo operando in tutti i casi potrebbe essere in registro o in memoria. Il secondo operando può essere nel registro / memoria o in un valore immediato (costante). Tuttavia, le operazioni da memoria a memoria non sono possibili. Queste istruzioni confrontano o abbinano i bit degli operandi e impostano i flag CF, OF, PF, SF e ZF.

L'istruzione AND

L'istruzione AND viene utilizzata per supportare le espressioni logiche eseguendo l'operazione AND bit per bit. L'operazione AND bit per bit restituisce 1, se i bit corrispondenti di entrambi gli operandi sono 1, altrimenti restituisce 0. Ad esempio:

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

L'operazione AND può essere utilizzata per cancellare uno o più bit. Ad esempio, si supponga che il registro BL contenga 0011 1010. Se è necessario azzerare i bit di ordine elevato, si AND con 0FH.

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

Facciamo un altro esempio. Se vuoi controllare se un dato numero è pari o dispari, un semplice test sarebbe controllare il bit meno significativo del numero. Se questo è 1, il numero è dispari, altrimenti il ​​numero è pari.

Supponendo che il numero sia nel registro AL, possiamo scrivere -

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

Il seguente programma lo illustra:

Esempio

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

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

Even Number!

Cambia il valore nel registro dell'ascia con una cifra dispari, come -

mov  ax, 9h                  ; getting 9 in the ax

Il programma visualizzerà:

Odd Number!

Allo stesso modo per cancellare l'intero registro puoi farlo AND con 00H.

L'istruzione OR

L'istruzione OR viene utilizzata per supportare l'espressione logica eseguendo un'operazione OR bit per bit. L'operatore OR bit per bit restituisce 1, se i bit corrispondenti di uno o entrambi gli operandi sono uno. Restituisce 0, se entrambi i bit sono zero.

Per esempio,

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

L'operazione OR può essere utilizzata per impostare uno o più bit. Ad esempio, supponiamo che il registro AL contenga 0011 1010, è necessario impostare i quattro bit di ordine inferiore, è possibile OR con un valore 0000 1111, cioè FH.

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

Esempio

L'esempio seguente mostra l'istruzione OR. Memorizziamo rispettivamente il valore 5 e 3 nei registri AL e BL, quindi l'istruzione,

OR AL, BL

dovrebbe memorizzare 7 nel registro 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

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

7

L'istruzione XOR

L'istruzione XOR implementa l'operazione XOR bit per bit. L'operazione XOR imposta il bit risultante a 1, se e solo se i bit degli operandi sono diversi. Se i bit degli operandi sono gli stessi (entrambi 0 o entrambi 1), il bit risultante viene azzerato a 0.

Per esempio,

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

XORing un operando con se stesso cambia l'operando in 0. Viene utilizzato per cancellare un registro.

XOR     EAX, EAX

L'istruzione TEST

L'istruzione TEST funziona come l'operazione AND, ma a differenza dell'istruzione AND, non cambia il primo operando. Quindi, se abbiamo bisogno di controllare se un numero in un registro è pari o dispari, possiamo farlo anche usando l'istruzione TEST senza cambiare il numero originale.

TEST    AL, 01H
JZ      EVEN_NUMBER

L'istruzione NOT

L'istruzione NOT implementa l'operazione NOT bit per bit. L'operazione NOT inverte i bit in un operando. L'operando può essere in un registro o in memoria.

Per esempio,

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