Montaje - Instrucciones lógicas
El conjunto de instrucciones del procesador proporciona las instrucciones AND, OR, XOR, TEST y NOT lógica booleana, que prueba, establece y borra los bits de acuerdo con la necesidad del programa.
El formato de estas instrucciones:
No Señor. | Instrucción | Formato |
---|---|---|
1 | Y | Y operando1, operando2 |
2 | O | O operando1, operando2 |
3 | XOR | XOR operando1, operando2 |
4 | PRUEBA | TEST operando1, operando2 |
5 | NO | NO operando1 |
El primer operando en todos los casos podría estar en registro o en memoria. El segundo operando podría estar en el registro / memoria o en un valor inmediato (constante). Sin embargo, las operaciones de memoria a memoria no son posibles. Estas instrucciones comparan o hacen coincidir bits de los operandos y establecen los indicadores CF, OF, PF, SF y ZF.
La instrucción AND
La instrucción AND se utiliza para admitir expresiones lógicas realizando una operación AND bit a bit. La operación AND bit a bit devuelve 1, si los bits coincidentes de ambos operandos son 1; de lo contrario, devuelve 0. Por ejemplo:
Operand1: 0101
Operand2: 0011
----------------------------
After AND -> Operand1: 0001
La operación AND se puede utilizar para borrar uno o más bits. Por ejemplo, digamos que el registro BL contiene 0011 1010. Si necesita borrar los bits de orden superior a cero, lo Y con 0FH.
AND BL, 0FH ; This sets BL to 0000 1010
Tomemos otro ejemplo. Si desea verificar si un número dado es par o impar, una prueba simple sería verificar el bit menos significativo del número. Si es 1, el número es impar, de lo contrario, el número es par.
Suponiendo que el número está en el registro AL, podemos escribir:
AND AL, 01H ; ANDing with 0000 0001
JZ EVEN_NUMBER
El siguiente programa ilustra esto:
Ejemplo
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
Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:
Even Number!
Cambie el valor en el registro del eje con un dígito impar, como -
mov ax, 9h ; getting 9 in the ax
El programa mostraría:
Odd Number!
De manera similar, para borrar todo el registro, puede Y con 00H.
La instrucción OR
La instrucción OR se utiliza para dar soporte a la expresión lógica realizando una operación OR bit a bit. El operador OR bit a bit devuelve 1, si los bits coincidentes de uno o ambos operandos son uno. Devuelve 0, si ambos bits son cero.
Por ejemplo,
Operand1: 0101
Operand2: 0011
----------------------------
After OR -> Operand1: 0111
La operación OR se puede utilizar para configurar uno o más bits. Por ejemplo, supongamos que el registro AL contiene 0011 1010, necesita establecer los cuatro bits de orden inferior, puede O con un valor 0000 1111, es decir, FH.
OR BL, 0FH ; This sets BL to 0011 1111
Ejemplo
El siguiente ejemplo demuestra la instrucción OR. Guardemos el valor 5 y 3 en los registros AL y BL, respectivamente, luego la instrucción,
OR AL, BL
debe almacenar 7 en el 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
Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:
7
La instrucción XOR
La instrucción XOR implementa la operación XOR bit a bit. La operación XOR establece el bit resultante en 1, si y solo si los bits de los operandos son diferentes. Si los bits de los operandos son iguales (ambos 0 o ambos 1), el bit resultante se pone a 0.
Por ejemplo,
Operand1: 0101
Operand2: 0011
----------------------------
After XOR -> Operand1: 0110
XORing un operando consigo mismo cambia el operando a 0. Esto se usa para borrar un registro.
XOR EAX, EAX
La instrucción TEST
La instrucción TEST funciona igual que la operación AND, pero a diferencia de la instrucción AND, no cambia el primer operando. Entonces, si necesitamos verificar si un número en un registro es par o impar, también podemos hacerlo usando la instrucción TEST sin cambiar el número original.
TEST AL, 01H
JZ EVEN_NUMBER
La instrucción NOT
La instrucción NOT implementa la operación NOT bit a bit. La operación NO invierte los bits de un operando. El operando puede estar en un registro o en la memoria.
Por ejemplo,
Operand1: 0101 0011
After NOT -> Operand1: 1010 1100