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