Sunteți pe pagina 1din 8

1

Instrucciones ló gicas utilizando los registros tipo bandera.

Marco teórico.

Las instrucciones lógicas al igual que las instrucciones aritméticas afectan a los bit de bandera, es por
eso que cada una de las operaciones con datos realizadas por el microprocesador resultan
interesantes ya que por medio del registro tipo bandera es posible verificar si la operación entre datos
genera una activación de la bandera de signo, si hubo un acarreo en la operación o si se activó el bit
de bandera cero indicando que el resultado de la operación finalizo con un resultado igual o distinto
de cero.

Objetivo general:

Conocer las distintas directivas de programación para las instrucciones de tipo lógico
contenidas en el set de instrucciones de los microprocesadores Intel.

Objetivos específicos:

Conocer cómo operan las funciones lógicas sobre cada bit a ser sometido a una evaluación
tipo AND, OR y NOT.
Verificar si los bits de bandera se modifican al operar alguna de las instrucciones lógicas.
Diseñar códigos para lenguaje ensamblador que utilicen distintos tipos de declaraciones
para la naturaleza del dato a manipular.
2
instrucciones lógicas utilizando los registros tipo bandera
introducción a los microprocesadores

Ejecute el programa emulador de microprocesadores EMU8086, haciendo doble clic en el icono del
escritorio, luego seleccione un nuevo documento tipo .COM. Digite el PRIMER PROGRAMA, recuerde
que el encabezado es necesario para crear un archivo .COM.

1. compile y ejecute el programa paso a paso, monitoreando el registro de estados (FLAGS) luego de
cada operación AND. Tome nota de los datos con los que se opera, los resultados y las banderas que
se activan.
dato1(dl) 09AH 0000000010011010
mascara1(ah) 0F0H 0000000011110000
and dl,ah 090H 0000000010010000
En el caso de la operación AND el resultado es 1 solamente cuando las dos entradas son también 1
Flags activadas:
SF: La bandera de signo se activa debido a que en el resultado binario el 1 más significativo a la izquierda
denota el signo, siento este en alto negativo.
PF: El resultado en binario consta de dos 1 lógicos, dando por lo tanto paridad par
Dato2(cx) 02CC2H 0010110011000010
Mascara2(bx) 0F0FH 0000111100001111
and cx,bx 0C02H 0000110000000010
Flags activadas:
En este caso no activa ninguna bandera, ya que el signo dado por el ultimo bit mas significativo esta
desactivado y la cantidad de 1 lógicos son tres, haciéndolo paridad impar con lo cual no se activa la
bandera, la única bandera activada es la de interrupción la cual no se ve afectada por estas operaciones
and cx,cx 0C02H 0000110000000010
0000110000000010
Resultado 0000110000000010
Flags activadas:
En este caso cx se compara con sí mismo, por lo que las dos son iguales dando su resultado exactamente
el mismo, y tampoco activa ninguna bandera en el proceso.
2. modifique las líneas que contienen la instrucción AND, sustituyéndolas por la instrucción OR.
Repita desde el paso 1.

dato1(dl) 09AH 0000000010011010


mascara1(ah) 0F0H 0000000011110000
or dl,ah 0FAH 0000000011111010
El resultado de la operación OR cambia notablemente el resultado, ya que en or se activa siempre que
sus dos entrantes no sean cero.
Flags activadas:
SF: La bandera de signo se activa debido a que en el resultado binario el 1 más significativo a la izquierda
denota el signo, siento este en alto negativo.
PF: El resultado en binario consta de seis 1 lógicos, dando por lo tanto paridad par
Dato2(cx) 02CC2H 0010110011000010
Mascara2(bx) 0F0FH 0000111100001111
or cx,bx 02FCFH 0010111111001111
Flags activadas:
PF: En este caso solo se activa la bandera de paridad
or cx,cx 0C02H 0010111111001111
0010111111001111
Resultado 0010111111001111
Flags activadas:
En este caso cx se compara con sí mismo, por lo que las dos son iguales dando su resultado exactamente
el mismo a pesar de haber cambiado de compuerta lógica, y manteniendo la bandera de paridad par de
la operación anterior.

3. sustituya ahora por la instrucción XOR y repita el paso 1.

dato1(dl) 09AH 0000000010011010


mascara1(ah) 0F0H 0000000011110000
xor dl,ah 06AH 0000000001101010
En la operación XOR podemos ver que el resultado es 1 solamente cuando una de las entradas es distinta
de la otra, siento 1 o 0
Flags activadas:
PF: El resultado en binario consta de cuatro 1 lógicos, dando por lo tanto paridad par
Dato2(cx) 02CC2H 0010110011000010
Mascara2(bx) 0F0FH 0000111100001111
xor cx,bx 023CDH 0010001111001101
Flags activadas:
En este caso no activa ninguna bandera.
xor cx,cx 023CDH 0010001111001101
0010001111001101
Resultado 0000000000000000
En este caso debido a compararse CX con sí mismo, no existe ninguna entrada distinta en el registro, por
lo tanto, el resultado da 0
Flags activadas:
ZF: El resultado da 0 como resultado de la operación XOR
PF: La bandera de paridad siempre se activa junto a la bandera ZF
3
instrucciones lógicas utilizando los registros tipo bandera
introducción a los microprocesadores

Digite el segundo programa que se divide en dos partes. Seleccione la opción nuevo programa y
digite el código con la plantilla .COM.

1. ejecute paso a paso el primer bloque, tome nota de los datos con los que se realizan las operaciones
y los resultados de las mismas, los registros que intervienen en el proceso y el estado de las banderas
en cada paso del proceso.
ax 02CC2H 0010110011000010
dl 01AH 0000000000011010
ah 02CH 0000000000101100
Xor dl,ah 036H 0000000000110110
Xor dl, 0FF0 0C9H 0000000011001001
El resultado de la operación OR se activa siempre que sus dos entrantes no sean cero al mismo tiempo.
Flags activadas:
PF: El resultado en binario consta de cuatro 1 lógicos, dando por lo tanto paridad par

2. ejecute ahora el segundo bloque y tome nota de los datos con los que se opera, los resultados y
las banderas que se activan durante el proceso.
ax 02CC2H 0010110011000010
dl 01AH 0000000000011010
ah 02CH 0000000000101100
Xor dl, ah 036H 0000000000110110
Not dl 0C9H 0000000011001001
Not invierte el resultado 36H.
Flags activadas:
PF: se active en la operación xor entre dl y ah, dando como resultado cuatro 1 lógicos y activando la
paridad par
3. modifique la línea 8 y 15 escribiendo esa instrucción como “xor ah, dl”.

4. repita los pasos 1 y 2 y registre las diferencias que se aprecian es las operaciones del código.

En este caso la diferencia está en donde se guardará el resultado de la operación, siendo según la modificación
‘’ah’’
En el primer bloque al llegar al momento de operar el XOR dl,0FFH función la cual hace de inversor, ya que, al
poner todos los valores en 1, y comparándolo con una compuerta xor, se irán invirtiendo el valor 0 de ‘’dl’’
pasándolos a 1 lógicos, la diferencia es que en dl no se encuentra la operación xor, sino que simplemente se
encuentra el valor que le asignamos a dl siendo ‘’1AH’’ el cual la operación invierte dando como resultado ‘’E5H’’
En el segundo bloque es lo mismo, solo que directamente usamos un operador inversor not, esta vez como el
valor operado por el xor no se guarda en dl, si no en ah, la operación simplemente invierte el valor del registro dl
‘’1AH’’ y la invierte dando como resultado ‘’E5H’’
4
instrucciones lógicas utilizando los registros tipo bandera
introducción a los microprocesadores

Digite el tercer programa en un archivo nuevo de tipo .COM y tome nota de lo que se le indique.

1. ejecute solo las primeras dos instrucciones, monitoreando las banderas ¿Cuáles se activaron?
¿Cuál fue el resultado de la operación? ¿Cómo interpreta el resultado?

En las primeras dos instrucciones se activan las banderas ZF, y por lo general siempre que se activa la bandera ZF
también se activa la de paridad, así que PF también se encuentra activa.
Lógicamente el resultado de la operación dio 0, y esto lo podemos ver a nivel de bits

B9H 10111001
40H 01000000
AND 00000000
Como podemos ver en la operación AND no hay ningún bit con el que pueda cumplir la condición lógica, por lo
tanto es cero.
2. ejecute hasta la instrucción TEST y conteste otra vez la pregunta 1 concerniente a este código.
En este caso apreciamos que se activan las mismas banderas que en la situación anterior, ZF y por lo tanto PF
Esto se debe a que TEST realiza la operación AND, la diferencia es que la instrucción AND guarda el resultado en
el registro destino comprendido en el código, mientras que TEST no lo hace, TEST solamente afecta a los bits de
bandera

3. en las líneas de código 7 y 14 cambie el dato 40H por 08H y repita los pasos 1 y 2 de este código,
¿Cómo se modificó este programa?

En este caso no se activó ninguna bandera, por lo que se asume que el resultado de esta operación lógica es
diferente de cero, eso lo podemos comprobar:
B9H 10111001
08H 00001000
AND 00001000
En el caso del uso de TEST tampoco activo ninguna bandera, lo cual es comprobable debido a que TEST realiza la
misma operación AND solo que afectando los bits de bandera, y siendo el valor distinto de cero, y sin paridad par
es lógico que no activara ninguna.
5
instrucciones lógicas utilizando los registros tipo bandera
introducción a los microprocesadores

Asignaciones:

1. ¿Qué objetivos se buscan al usar la mascara1 (F0h) con las tres diferentes instrucciones lógicas?
Mascara1 está como un valor comparativo para ver las funciones de las distintas operaciones lógicas, ya que en
su estructura de 8 bits los primeros 4 dígitos menos significativos son 0, y los siguientes 4 más significativos son 1
Logrando así que en cualquier situación en que se encuentre con cualquier otro número u operación siempre
habría sido capaz de comprobar cada operación lógica en su estado:
A B
0 0
0 1
1 0
1 1

2. Cuando se ejecuta la primera instrucción AND el bit D7 termina en estado alto y se activa la bandera
S, en la segunda instrucción AND también termina en alto, pero esta vez no se activa la bandera ¿por
qué?
Ya que el valor resultado en la primera instrucción es de 8 bits, por lo tanto, el ultimo bit más significativo dicta el
signo, al convertir el resultado a un número decimal podemos ver:

En la segunda instrucción el valor resultado sobrepasa los 8 bits por lo tanto llega a usar el registro de 16 bits, y
como podemos en valor de 16 bits el 1 con el que termina no es el más significativo, por lo tanto, es porque el
resultado no da negativo, esto se puede comprobar al convertirlo a decimal:

3. Cuando se ejecuta la tercera instrucción lógica, ya sea AND u OR, las banderas reaccionan de
forma similar. Pero cuando se ejecuta con la instrucción XOR no ¿por qué ocurre eso?
Ya que la tercera instrucción era una comparación en el mismo valor, en AND y OR, si las dos entradas
son 1 al mismo tiempo su resultado es 1 lógico, en cambio en la operación XOR Esto no es así, ya que
cualquier entrada que sea el mismo valor al mismo tiempo da como resultado 0, y ya que
intentábamos comparar la misma cantidad todos sus bits coincidían, dando resultado que toda la
operación se volviera 0
4. En el programa se declaran datos para hacer las operaciones ¿dónde se guardan estos datos?
En el programa pudimos ver que se declaraban palabras tipo byte (8 bits) y tipo palabra o Word (16 bits) siendo
db y dw respectivamente, estos valores se guardan en el segmento de datos justo al iniciar el código, por lo
tanto, los valores están al principio.
Siendo más específicos el primer valor definido tipo byte (dato1) es guardado en la posición 117H, y el siguiente
valor (dato2) definido tipo Word se guarda en la posición 118H y 119H siendo de tipo palabra, es decir de 16 bits
El valor definido tipo Byte (mascara1) es encontrado en la posición 11AH
Y el ultimo valor definido tipo palabra (mascara2) es encontrado desde la posición 11BH a la 11CH

5. Cuando se ejecutan el primer bloque del programa el resultado se almacena en DL, lo mismo ocurre
con el segundo bloque; los dos resultados son idénticos, pero el estado de las banderas no lo es ¿por
qué?
En el resultado del primer bloque el resultado al ser invertido mediante una operación XOR es claramente
negativo, activando la bandera de signo SF. En el segundo bloque al ser invertida mediante una NOT hace que
todos los bits sean invertidos, incluyendo el de negativo.

6. Al modificar el programa, tanto los resultados como las banderas terminaron en distintos estados
¿cuáles fueron los cambios específicos que observo?
A pesar de que la ubicación de destino de la operación era cambiada, al invertir el valor de dl este siempre daba
como resultado un valor negativo a pesar de tener otro valor, pero la bandera de paridad no se activaba y es
porque al invertir dl nunca daba un numero de bits par.

7. ¿Cuál es la diferencia fundamental que noto a comparar las instrucciones AND y TEST? ¿Qué
relación existe entre los bits que deseamos probar y el valor específico de la máscara seleccionada?
Las instrucciones AND y TEST lógicamente realizan la misma operación de AND, su principal diferencia
es que al operar con AND el valor resultante se direccionaba al registro destino de la operación, y si su
valor alteraba las banderas pues estas se activaban
En la instrucción TEST pudimos comprobar que no direccionaba el valor resultante al registro destino,
este registro simplemente no se veía modificado, pero si tenía influencia sobre las banderas.

S-ar putea să vă placă și