Operandos lógicos

La lógica booleana es importante en el diseño de circuitos y tiene un paralelo en la lógica de programación. Las instrucciones para lógica booleana son AND, OR, XOR, TEST y NOT, que pueden usarse para poner bits en 0 o en 1 y para manejar datos ASCII con propósitos aritméticos. El formato general para las operaciones booleanas es:

[etiqueta :] | operación | {registro/memoria}, {registro/memoria/inmediato}|

El primer operando se refiere a un byte o palabra en un registro o memoria y es el único valor que es cambiado. El segundo operando hace referencia a un registro o a un valor inmediato. La operación compara los bits de los dos operandos referenciados y de acuerdo con esto establece las banderas CF, OF, PF, SF y ZF.

AND. Si ambos bits comparados son 1, establece el resultado en 1. Las demás condiciones dan como resultado 0.

OR. Si cualquiera (o ambos) de los bits comparados es 1, el resultado es 1. Si ambos bits están en 0, el resultado es 0.

XOR. Si uno de los bits comparados es 0 y el otro 1, el resultado es 1. Si ambos bits comparados son iguales (ambos 0 o ambos 1), el resultado es 0.

TEST. Establece las banderas igual que lo hace AND, pero no cambia los bits de los operandos.

Las operaciones siguientes AND, OR y XOR ilustran los mismos valores de bits como operandos:

AND         OR       XOR
0101        0101    0101
0011        0011  0011
Resultado:           0001        0111    0110

Es útil recordar la siguiente regla: el empleo de AND con bits 0 es 0 y el de OR con bits 1 es 1.

Ejemplos de operaciones booleanas.

Para los siguientes ejemplos independientes, suponga que AL contiene 11000101 y el BH contiene 01011100:

1.- AND        AL,BH        ;Establece AL a 0100 0100
2.- AND        AL,00H      ;Establece AL a 0000 0000
3.- AND        AL,0FH      ;Establece AL a 0000 0101
4.- OR          BH,AL        ;Establece BH a 1101 1101
5.- OR          CL,CL        ;Pone en uno SF y ZF
6.- XOR        AL,AL         ;Establece AL a 0000 0000
7.- XOR        AL,0FFH    ;Establece AL a 0011 1010

Los ejemplos 2 y 6 muestran formas de limpiar un registro, y ponerlo a cero. El ejemplo 3 pone a cero los cuatro bits mas a la izquierda de AL.

TESt actúa igual que AND, pero solo establece las banderas. Aquí están algunos ejemplos :

1.- TEST        BL, 11110000B        ; Alguno de los bits de mas a la
JNZ          …                              ; izquierda es BL en diferentes de cero? 2.- TEST        AL, 00000001B        ; AL contiene
JNZ          …                              ; un numero impar?

3.- TEST        DX, 0FFH                 ; El DX contiene
JNZ          …                              ; un valor cero?

La instrucción NOT

La instrucción NOT solo invierte los bits en un byte o palabra en un registro o en memoria; esto es, convierte los ceros en unos y los unos en ceros. El formato general es:

|  [etiqueta:]  |  NOT |  {registro/memoria} |

Por ejemplo si el AL contiene  11000101, la instrucción NOT AL cambia el AL a 00111010 (el resultado es el mismo de XOR AL, 0FFH). Las banderas no son afectadas.