Você está na página 1de 58

2.

SALTOS CONDICIONALES
Saltos incondicionales: Instrucciones JMP
Saltos condicionales: JZ, JNZ, JC, JNC
Implementacin de estructuras de alto nivel:
if, for, while, until.
Las banderas o flags: Carry, Zero
Instrucciones que afectan a las banderas
Ejemplos
2. SALTOS CONDICIONALES
Saltos incondicionales: Instrucciones JMP
Saltos condicionales: JZ, JNZ, JC, JNC
Implementacin de estructuras de alto nivel:
if, for, while, until.
Las banderas o flags: Carry, Zero
Instrucciones que afectan a las banderas
Ejemplos
En condiciones normales, el procesador 8086
ejecuta instrucciones almacenadas en
posiciones consecutivas de memoria.

Luego de cada instruccin, el registro IP
(Instruction Pointer) se incrementa 1, 2 hasta
6 posiciones para apuntar a la siguiente
instruccin.
SALTOS INCONDICIONALES
Las instrucciones de salto o bifurcacin
(JUMP) permiten variar el flujo secuencial de los
programas para continuar la ejecucin en otras
reas de memoria.
El Instruction Pointer adquiere un valor arbitrario
luego de la ejecucin de una instruccin JUMP.
JMP NewAddres; IPNewAddress
SALTOS INCONDICIONALES
2. SALTOS CONDICIONALES
Saltos incondicionales: Instrucciones JMP
Saltos condicionales: JZ, JNZ, JC, JNC
Implementacin de estructuras de alto nivel:
if, for, while, until.
Las banderas o flags: Carry, Zero
Instrucciones que afectan a las banderas
Ejemplos
Saltos incondicionales: Instruccin JMP.
Se ejecutan siempre, sin depender de ninguna
condicin del programa.

Saltos condicionales: Instrucciones JZ, JNZ,
JC, JNC
Se ejecutan (o no) segn el resultado de alguna
operacin realizada anteriormente, y permiten
implementar las estructuras if-for-while-until de
los lenguajes de alto nivel.
El 8086 tiene 2 tipos de instrucciones de salto:
INSTRUCCIONES DE SALTO
JZ = Jump If Zero;
Saltar si el resultado dio cero

JNZ = Jump If Not Zero
Saltar si el resultado dio no nulo

JC = Jump If Carry
Saltar si hubo acarreo

JNC = Jump if Not Carry
Saltar si no hubo acarreo
SALTOS CONDICIONALES
2. SALTOS CONDICIONALES
Saltos incondicionales: Instrucciones JMP
Saltos condicionales: JZ, JNZ, JC, JNC
Implementacin de estructuras de alto nivel:
if, for, while, until.
Las banderas o flags: Carry, Zero
Instrucciones que afectan a las banderas
Ejemplos
Inicio:
mov BX, 1000h
mov DL,FFh
mov CL,08h
Bucle:
mov [BX],DL
inc BX
dec CL
jnz Bucle
Fin:
hlt
Ejemplo: UNTIL
BX 1000h
DL FFh
CL 08h
[BX]DL
BXBX+1
CLCL-1
CL=0?
no
si
FIN
BX = 0x1000;
DL = 0xFF;
CL = 8;
do{
memoria[BX]=DL;
BX++;
CL--;
} until (CL=0);
ESTRUCTURAS DE ALTO NIVEL
Ejemplo: UNTIL
Esta estructura construye un bucle o loop que
se repite 8 veces.
En cada paso del bucle, el registro CL se
decrementa y se mantiene la condicin NZ. El
bucle se sigue ejecutando hasta que CL llega a
0. Al llegar a ese punto, la condicin NZ deja de
cumplirse, el salto JNZ no se ejecuta y el
programa contina en la lnea siguiente a la
instruccin JNZ.
ESTRUCTURAS DE ALTO NIVEL
Inicio:
mov BX, 1000h
mov DL,FFh
mov CL,08h
Bucle:
cmp CL,00h
jz Fin
mov [BX],DL
inc BX
dec CL
jmp Bucle
Fin: hlt
Ejemplo: WHILE
BX 1000h
DL FFh
CL 08h
[BX]DL
BXBX+1
CLCL-1
CL=0?
no
FIN
BX = 0x1000;
DL = 0xFF;
CL = 8;
while (CL!=0){
memoria[BX]=DL;
BX++;
CL--;
}
s
ESTRUCTURAS DE ALTO NIVEL
Estructura WHILE Estructura DOUNTIL
BX = 0x1000;
DL = 0xFF;
CL = 8;
while (CL!=0){
memoria[BX]=DL;
BX++;
CL--;
}
BX = 0x1000;
DL = 0xFF;
CL = 8;
do{
memoria[BX]=DL;
BX++;
CL--;
} until (CL=0);
ESTRUCTURAS DE ALTO NIVEL
Las dos estructuras permiten construir bucles,
pero con ciertas diferencias:

Los bucles UNTIL siempre se ejecutan al
menos una vez, y la condicin de finalizacin se
chequea al final del bucle.
En los bucles WHILE la condicin se chequea
al inicio, y puede ser que el bucle se ejecute 0
veces.
ESTRUCTURAS DE ALTO NIVEL
Estructura WHILE Estructura DOUNTIL
BX = 0x1000;
DL = 0xFF;
CL = 0;
while (CL!=0){
memoria[BX]=DL;
BX++;
CL--;
}
BX = 0x1000;
DL = 0xFF;
CL = 0;
do{
memoria[BX]=DL;
BX++;
CL--;
} until (CL=0);
Qu pasa si la variable de control se inicializa
en cero antes de entrar al bucle?
ESTRUCTURAS DE ALTO NIVEL
Estructura WHILE Estructura DOUNTIL
BX = 0x1000;
DL = 0xFF;
CL = 0;
while (CL!=0){
memoria[BX]=DL;
BX++;
CL--;
}
BX = 0x1000;
DL = 0xFF;
CL = 0;
do{
memoria[BX]=DL;
BX++;
CL--;
} until (CL=0);
El bucle While no rellena ninguna celda de
memoria porque no se llega a ejecutar nunca
pero el bucle Until rellena 256 celdas.
ESTRUCTURAS DE ALTO NIVEL
Estructura WHILE Estructura DOUNTIL
BX = 0x1000;
DL = 0xFF;
CL = 0;
while (CL!=0){
memoria[BX]=DL;
BX++;
CL--;
}
BX = 0x1000;
DL = 0xFF;
CL = 0;
do{
memoria[BX]=DL;
BX++;
CL--;
} until (CL=0);
En cada caso, el programador debe evaluar
cul de las dos estructuras se adapta mejor al
problema que desea resolver.
ESTRUCTURAS DE ALTO NIVEL
WHILE
UNTIL
Inicio:
mov BX, 1000h
mov DL,FFh
mov CL,08h
Bucle:
cmp CL,00h
jz Fin
mov [BX],DL
inc BX
dec CL
jmp Bucle
Fin: hlt
Inicio:
mov BX, 1000h
mov DL,FFh
mov CL,08h
Bucle:
mov [BX],DL
inc BX
dec CL
jnz Bucle
Fin:
hlt
ESTRUCTURAS DE ALTO NIVEL
La estructura while es algo ms compleja de
implementar en el 8086 porque necesita 2
instrucciones de salto: un salto condicional (JZ)
y un salto incondicional (JMP).

Pero en general es ms robusta y contempla
ms situaciones.
ESTRUCTURAS DE ALTO NIVEL
CMP CL,00h es una instruccin
que compara el registro CL con
el nmero inmediato 00h.
* Esta instruccin es necesaria
porque despierta las banderas.

* El procesador 8086 almacena
su estado o condicin (Zero,
NoZero, Carry, NoCarry )
mediante bits especiales
llamados Flags o Banderas.
Inicio:
mov BX, 1000h
mov DL,FFh
mov CL,08h
Bucle:
cmp CL,00h
jz Fin
mov [BX],DL
inc BX
dec CL
jmp Bucle
Fin: hlt
ESTRUCTURAS DE ALTO NIVEL
2. SALTOS CONDICIONALES
Saltos incondicionales: Instrucciones JMP
Saltos condicionales: JZ, JNZ, JC, JNC
Implementacin de estructuras de alto nivel:
if, for, while, until.
Las banderas o flags: Carry, Zero
Instrucciones que afectan a las banderas
Ejemplos
El procesador 8086 tiene un registro especial
llamado PSW: Program Status Word.

9 de sus 16 bits funcionan como banderas o
flags, y se encienden o se apagan de acuerdo
con el resultado de ciertas operaciones
aritmticas o lgicas ejecutadas por la A.L.U
del microprocesador.
--.--.--.--.OF.DF.IF.TF.SF.ZF.--.AF.--.PF.--.CF
BANDERAS (FLAGS)
Las banderas del procesador son anlogas a
las banderas del automovilismo (ej: bandera a
cuadros significa que ya hubo un ganador,
bandera negra significa peligro).
Al igual que los pilotos de carrera, los
programadores deben revisar las banderas
antes de tomar ciertas decisiones.
BANDERAS (FLAGS)
--.--.--.--.OF.DF.IF.TF.SF.ZF.--.AF.--.PF.--.CF
Carry
Parity
Auxiliary
Carry
Zero
Sign
Interrupt
OverFlow
Direction
Trap
BANDERAS (FLAGS)
Luego de una operacin, la bandera CF refleja
si hubo o no acarreo:

desde el bit7 hacia fuera (en las operaciones
de 8 bits)
o del bit15 hacia fuera (en las operaciones de
16 bits).
Acarreo o carry
--.--.--.--.OF.DF.IF.TF.SF.ZF.--.AF.--.PF.--.CF
BANDERAS (FLAGS)
Saltos condicionales asociados al acarreo:

JC = Jump if Carry
JNC = Jump if Not Carry
Acarreo o carry
--.--.--.--.OF.DF.IF.TF.SF.ZF.--.AF.--.PF.--.CF
BANDERAS (FLAGS)
Luego de una operacin, la bandera PF se
actualiza segn si la cantidad de bits 1 del
resultado es par o impar.
Sus 2 estados son: PE=Even, PO=Odd
Saltos condicionales asociados:
JPE (Jump If Parity Even)
JPO (Jump If Parity Odd)
Bandera de paridad
--.--.--.--.OF.DF.IF.TF.SF.ZF.--.AF.--.PF.--.CF
BANDERAS (FLAGS)
La bandera AF se activa cuando hubo acarreo
del bit3 hacia el bit4 en operaciones de BCD
empaquetado.
[BCD empaquetado es una forma de codificar
enteros entre 00 y 99 mediante 8 bits
bit7..bit4 codifican el dgito de las decenas
bit3..bit0 codifican el dgito de las unidades]
Acarreo Auxiliar
--.--.--.--.OF.DF.IF.TF.SF.ZF.--.AF.--.PF.--.CF
BANDERAS (FLAGS)
Luego de una operacin, la bandera Z avisa
si el resultado dio cero (condicin Z), o
distinto de cero (condicin NZ).

Saltos condicionales:
JZ Jump If Zero
JNZ Jump If Not Zero
Bandera de cero
--.--.--.--.OF.DF.IF.TF.SF.ZF.--.AF.--.PF.--.CF
BANDERAS (FLAGS)
Luego de una operacin, la bandera SF
refleja el signo del resultado (en complemento
verdadero de 8 bits o de 16 bits).
Es posible ejecutar saltos condicionales segn
el estado de esta bandera:
JP Jump If Plus
JM Jump If Minus
Bandera de signo
--.--.--.--.OF.DF.IF.TF.SF.ZF.--.AF.--.PF.--.CF
BANDERAS (FLAGS)
Indica si est habilitado el modo debug del
microprocesador (ejecucin paso a paso).
Bandera de trap
--.--.--.--.OF.DF.IF.TF.SF.ZF.--.AF.--.PF.--.CF
BANDERAS (FLAGS)
Indica si el procesador acepta interrupciones
de los perifricos. Sus posibles estados son:
EI = Enabled Interrupts
DI = Disabled Interrupts
Bandera de interrupcin
--.--.--.--.OF.DF.IF.TF.SF.ZF.--.AF.--.PF.--.CF
BANDERAS (FLAGS)
Indica el sentido de avance (UP/DOWN) de las
instrucciones especiales de manejo de strings.
Bandera de direccin
--.--.--.--.OF.DF.IF.TF.SF.ZF.--.AF.--.PF.--.CF
BANDERAS (FLAGS)
Indica si hubo desborde en complemento
verdadero de 8 o 16 bits.

Sus saltos condicionales asociados son:
JO Jump if Overflow
JNO Jump if Not Overflow
Bandera de overflow
--.--.--.--.OF.DF.IF.TF.SF.ZF.--.AF.--.PF.--.CF
BANDERAS (FLAGS)
JC, (JNC) Jump if Carry (Not Carry)
JPE, (JPO) Jump if Parity Even (Odd)
JZ, (JNZ) Jump if Zero (Not Zero)
JP, (JM) Jump if Plus (Minus)
JO, (JNO) Jump if Overflow (Not Overflow)
--.--.--.--.OF.DF.IF.TF.SF.ZF.--.AF.--.PF.--.CF
Resumen de instrucciones de salto condicional
segn el estado de diferentes banderas:
BANDERAS (FLAGS)
En general, las instrucciones del 8086 afectan
a las banderas de acuerdo con ciertas reglas
lgicas.
Pero a veces se dan algunas excepciones que
dependen de detalles de diseo del 8086 y
que no son del todo intuitivas.
Por esta razn se recomienda consultar
siempre la hoja de datos del 8086 para saber
cmo se ven afectadas las banderas luego de
cada instruccin.
BANDERAS (FLAGS)
2. SALTOS CONDICIONALES
Saltos incondicionales: Instrucciones JMP
Saltos condicionales: JZ, JNZ, JC, JNC
Implementacin de estructuras de alto nivel:
if, for, while, until.
Las banderas o flags: Carry, Zero
Instrucciones que afectan a las banderas
Ejemplos
1.Instrucciones de movimiento MOV
2.Acarreo en las instrucciones de resta SUB
3.Instrucciones de comparacin CMP
4.Instrucciones lgicas AND, OR, XOR
Casos particulares en el uso de las banderas:
INSTRUCCIONES Y BANDERAS
1.Instrucciones de movimiento MOV
2.Acarreo en las instrucciones de resta SUB
3.Instrucciones de comparacin CMP
4.Instrucciones lgicas AND, OR, XOR
Casos particulares en el uso de las banderas:
INSTRUCCIONES Y BANDERAS
Las instrucciones MOV no afectan las banderas
porque no hacen uso de la unidad aritmtico
lgica (ALU) del procesador.
1.Instrucciones de movimiento MOV
2.Acarreo en las instrucciones de resta SUB
3.Instrucciones de comparacin CMP
4.Instrucciones lgicas AND, OR, XOR
Casos particulares en el uso de las banderas:
INSTRUCCIONES Y BANDERAS
Banco de
registros
A.L.U
Op1 Op2
Resultado
Banderas
Op
code
1.Instrucciones de movimiento MOV
Casos particulares en el uso de las banderas:
INSTRUCCIONES Y BANDERAS
; Ej. de error frecuente:
mov AL,[1000h]
jz Final
Aunque en la celda 1000h haya grabado un cero
y el registro AL se anule como resultado de la
ejecucin del MOV, el salto condicional JZ no se
ejecuta.
1.Instrucciones de movimiento MOV
Casos particulares en el uso de las banderas:
INSTRUCCIONES Y BANDERAS
; Ej. de error frecuente:
mov AL,[1000h]
jz Final
La condicin Z o NZ va a depender de alguna
instruccin anterior que afect las banderas,
pero no depende del MOV.
1.Instrucciones de movimiento MOV
Casos particulares en el uso de las banderas:
INSTRUCCIONES Y BANDERAS
; Correccin del error
mov AL,[1000h]
cmp AL,00h
jz Final
Para que el salto condicional se aplique al
contenido de la celda de memoria, debe
insertarse una instruccin de comparacin.
1.Instrucciones de movimiento MOV
2.Acarreo en instrucciones de resta
3.Instrucciones de comparacin CMP
4.Instrucciones lgicas AND, OR, XOR
Casos particulares en el uso de las banderas:
INSTRUCCIONES Y BANDERAS
En operaciones de resta (SUB) el flag Carry
refleja el estado de Borrow, es decir, si hubo
que pedir prestado un noveno bit para
realizar la resta de 8 bits.
2. Acarreo en las instrucciones de resta SUB
Casos particulares en el uso de las banderas:
INSTRUCCIONES Y BANDERAS
mov AL, 04h
sub AL, 09h
; se enciende CF
La bandera Carry se enciende cuando el
minuendo es menor que el sustraendo y es
necesario pedir prestado un noveno bit b8 de
peso 256.
mov AL, 04h
sub AL, 02h
; no se enciende CF
2. Acarreo en las instrucciones de resta SUB
Casos particulares en el uso de las banderas:
INSTRUCCIONES Y BANDERAS
Al operar 04h 09h, se pide prestado un bit b8
de peso 2
8
=256,y se realiza la operacin
104h 09h = FBh = 251.
El resultado FBh es la representacin del -5 en
complemento verdadero de 8 bits.
mov AL, 04h
sub AL, 09h
; se enciende CF
mov AL, 04h
sub AL, 02h
; no se enciende CF
2. Acarreo en las instrucciones de resta SUB
Casos particulares en el uso de las banderas:
INSTRUCCIONES Y BANDERAS
Algunos ensambladores y simuladores aceptan
como vlidas las instrucciones JB y JNB como
equivalentes a JC y JNC:

JB : Jump if Borrow
JNB: Jump if Not Borrow
1.Instrucciones de movimiento MOV
2.Acarreo en las instrucciones de resta SUB
3.Instrucciones de comparacin CMP
4.Instrucciones lgicas AND, OR, XOR
Casos particulares en el uso de las banderas:
INSTRUCCIONES Y BANDERAS
En operaciones de comparacin (CMP) los
flags se afectan igual que en las instrucciones
de resta. Porque el procesador internamente
ejecuta una resta para hacer la comparacin.
3. Instrucciones de comparacin CMP
Casos particulares en el uso de las banderas:
INSTRUCCIONES Y BANDERAS
La diferencia es que las instrucciones de resta
almacenan el resultado en el registro utilizado
como primer operando, mientras que las
comparaciones no guardan el resultado en
ningn registro (slo afectan los flags).
sub AL,BL; ALAL-BL
sub CH,04h; CHCH-04h
cmp AL,BL; AL-BL
cmp CH,04h; CH-04h
3. Instrucciones de comparacin CMP
Casos particulares en el uso de las banderas:
INSTRUCCIONES Y BANDERAS
Algunos ensambladores y simuladores
aceptan como vlidas las instrucciones JE y
JNE como equivalentes a JZ y JNZ:

JE : Jump if Equal
JNE: Jump if Not Equal
1.Instrucciones de movimiento MOV
2.Acarreo en las instrucciones de resta SUB
3.Instrucciones de comparacin CMP
4.Instrucciones lgicas AND, OR, XOR
Casos particulares en el uso de las banderas:
INSTRUCCIONES Y BANDERAS
El 8086 puede ejecutar operaciones lgicas bit
a bit (AND/OR/XOR) entre un registro y un
segundo operando que puede ser otro registro,
un nmero o el contenido de una celda de
memoria.
El segundo operando se interpreta como una
mscara para alterar bits individuales del
primer operando.

AND: Para apagar bits individuales
OR: Para prender bits individuales
XOR: Para invertir bits individuales.
INSTRUCCIONES Y BANDERAS
and AL, mask; ALAL AND mask
Para cada posicin desde i=0 a i=7
se realiza AiA
i
AND mask
i
.
Ai AND 1 = Ai, Ai AND 0 = 0
El resultado final es apagar los bits del registro
en las posiciones donde la mscara vale 0, y
mantener intactos los bits del registro donde la
mscara vale 1.
A7 A6 A5 A4 A3 A2 A1 A0
1 0 0 1 1 1 0 0
A7 0 0 A4 A3 A2 0 0
INSTRUCCIONES Y BANDERAS
1.Operando
2.Mscara
Resultado
or AL, mask; ALAL OR mask
Para cada posicin desde i=0 a i=7
se realiza AiA
i
OR mask
i
.
Ai OR 1 = 1, Ai OR 0 = Ai
El resultado final es prender los bits del registro
en las posiciones donde la mscara vale 1, y
mantener intactos los bits del registro donde la
mscara vale 0.
A7 A6 A5 A4 A3 A2 A1 A0
1 0 0 1 1 1 0 0
1 A
6
A
5
1 1 1 A
1
A
0
INSTRUCCIONES Y BANDERAS
1.Operando
2.Mscara
Resultado
xor AL, mask; ALAL XOR mask
Para cada posicin desde i=0 a i=7
se realiza AiA
i
XOR mask
i
.
Ai XOR 1 = Ai\, Ai XOR 0 = Ai
El resultado final es invertir los bits del registro
en las posiciones donde la mscara vale 1, y
mantener intactos los bits del registro donde la
mscara vale 0.
A7 A6 A5 A4 A3 A2 A1 A0
1 0 0 1 1 1 0 0
A
7
A
6
A
5
A
4
A
3
A
2
A
1
A
0
INSTRUCCIONES Y BANDERAS
1.Operando
2.Mscara
Resultado
A7 A6 A5 A4 A3 A2 A1 A0
1 0 0 1 1 1 0 0
A
7
A
6
A
5
A
4
A
3
A
2
A
1
A
0
INSTRUCCIONES Y BANDERAS
Las operaciones lgicas bit a bit no generan
acarreo parcial desde ningn bit
i
hacia su
vecino bit
i+1
, y por lo tanto no generan acarreo
global hacia fuera del registro.
La consecuencia es que todas las
operaciones lgicas bit a bit limpian la bandera
de acarreo.
1.Operando
2.Mscara
Resultado
2. SALTOS CONDICIONALES
Saltos incondicionales: Instrucciones JMP
Saltos condicionales: JZ, JNZ, JC, JNC
Implementacin de estructuras de alto nivel:
if, for, while, until.
Las banderas o flags: Carry, Zero
Instrucciones que afectan a las banderas
Ejemplos
EJEMPLOS
int a,b;
a=32767;
b=1;
a=a+3;
if (a<b) {
BorrarTodo();
}
mov AX,7FFFh
mov BX,0001h
add AX,0003h
cmp AX,BX
JM BorrarTodo
Jump If Minus: Salta (o no) en funcin la
bandera de signo, que se activa segn las
reglas del complemento verdadero.
-32766<1
?
EJEMPLOS
unsigned int a,b;
a=32767;
b=1;
a=a+3;
if (a<b) {
BorrarTodo();
}
mov AX,7FFFh
mov BX,0001h
add AX,0003h
cmp AX,BX
JC BorrarTodo
Jump If Carry: Salta (o no) en funcin la bandera
de acarreo, que se activa segn la comparacin
de los patrones de bits (no considera signo).
8002h<0001
?

Você também pode gostar