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