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.