MICROPROGRAMACION
ING. HERBERT MONGE
SALTOS CONDICIONALES EN ENSAMBLADOR.
Un salto condicional es el que altera el flujo de la ejecución de un programa enviando
el control a la dirección indicada.
Los saltos condicionales se basan en el estado de las banderas o “flags”, así como
también de la instrucción cmp (compare); esta instrucción resta el operando fuente
al operando destino pero sin que este almacene el resultado de la operación solo
se afecta el resultado de las banderas.
A continuación se muestra una tabla en la cual se dan a conocer los símbolos
empleados.
Letra Significado Observaciones
J Jump (saltar)
G Greater than (mayor que) Para números con signo
L Lees than (menor que) Para números con signo
A Above (mayor que) Para números sin signo
B Below (menor que) Para números sin singo
E Equal (igual)
N Not (no)
Bandera Bit Nombre
CF 0 Bandera de acarreo (carry flag)
PF 2 Bandera de paridad (parity flag)
AF 4 Bandera de acarreo auxiliar (adjust flag)
ZF 6 Bandera de cero (zero flag)
SF 7 Bandera de signo (sign flag)
DF 10 Bandera de dirección (direction flag)
AF 11 Bandera de desbordamiento (overflow flag)
La bandera de acarreo se activa cuando se produce acarreo en una suma o
multiplicación, o un "préstamo" en una resta entre números sin signo.
La bandera de paridad se usa para indicar si el resultado, en un registro de una
operación matemática es válido.
La bandera de acarreo auxiliar se utiliza en operaciones matemáticas con números
decimales codificados en binario (BCD). Se activa si hay acarreo presente.
La bandera de cero se activa si el resultado de una operación aritmético lógica es
cero.
La bandera de signo muestra el bit más significativo del resultado de una operación,
el cual denota el signo del número.
La bandera de dirección controla la selección de autoincremento (D=0) o auto
decremento (D=1) de los registros di o si durante las operaciones con cadenas de
caracteres. La bandera de dirección sólo se utiliza con las instrucciones para el
manejo de cadenas de caracteres.
La bandera de desbordamiento se utiliza en la aritmética de enteros con signo
cuando un número sobrepasa la capacidad de representación del registro.
Tabla de instrucción con saltos aritméticos condicionales con signo.
Condición de salto Comparación con Salta si
signo
= JE ZF= 1
!= JNE ZF= 0
> JGB ZF= 0 y
JNLE SF= OF
>= JGE SF= OF
JNL
< JL SF!= OF
JNGE
<= JLE ZF= 1 o
JNG SF!= OF
Tabla de instrucción con saltos aritméticos condicionales sin signo.
Condición de salto Comparación sin signo Salta si
= JE ZF= 1
!= JNE ZF= 0
> JA ZF= 0 y
JNBE CF= 0
>= JAE CF= 0
JNB
< JB CF= 1
JNAE
<= JBE ZF= 1 O
JNA CF= 1
Banderas en el debug.
Banderas En uno En cero
OF OV NV
DF DN UP
IF EI DI
SF NG(-) PL(+)
AF AC NA
PF PE PO
CF CY NC
EJEMPLOS DE LOS SALTOS CONDICIONALES
Ejemplo de JZ (Jump if Zero):
-a 100
154E:0100 mov ax, 00f5
154E:0103 mov bx, 00f5
154E:0106 sub ax, bx
154E:0108 jz 010a
154E:010A int 20
154E:010C
Ejemplo de JNZ (jump if not zero)
-a 100
154E:0100 mov ax, 0002
154E:0103 sub ax, 0001
154E:0106 jnz 0103 Saltos Condicionales
154E:0108 int 20
154E:010a
Ejemplo de JL (Jump if less than): se usa para con signo. Salta si DL<3ah
La instruccion CMP resta DL-3A y configura la flag, no cambia el contenido de DL,
pero si DL es menor que 3A , la intruccion JL salta a la posición 01F.
-a 100
154E:0100 mov ah, 02
154E:0102 mov dl, bl
154E:0104 add dl, 30
154E:0107 cmp dl, 3a
154E:010A jl 010f
154E:010C add dl, 07
154E:010F int 21
154E:0111 int 20
154E:0113
Ejemplo de JA (jump is above) y JB (jump is below): para sin signo es. Salta si
dl es menor que 43 y salta si dl es mayor que 80.
-a100
14A7:0100 mov ah, 02
14A7:0102 mov dl, bl
14A7:0104 add dl, 42
14A7:0107 int 21
14A7:0109 cmp dl, 43
14A7:010C jb 0104
14A7:010E cmp dl, 80
14A7:0111 ja 0116
14A7:0113 add dl, 20
14A7:0116 sub dl, 20
14A7:0119 int 21
14A7:011B int 20
14A7:011D nop
14A7:011E
Ejemplo de JG: salta si es mayor que: Aquí se compara si el valor que está en dl
es mayor que c y si esto es verdad entonces le suma a dl 20 e imprimirá la letra
“B” si no imprimirá la letra “b”
-a100
0CB8:0100 mov ah, 02
0CB8:0102 mov dl, bl
0CB8:0104 add dl, 42
0CB8:0107 cmp dl, c
0CB8:010A jg 010f
0CB8:010C add dl, 20
0CB8:010F int 21
0CB8:0111 int 20
0CB8:0113 nop
0CB8:0114
Ejemplo JL: salta si es menor que, si se cumple la condición imprimirá la letra “J”
si no imprimirá la letra “j”.
-a100
0CB8:0100 mov ah, 02
0CB8:0102 mov dl, bl
0CB8:0104 add dl, 30
0CB8:0107 cmp dl, 3A
0CB8:010A jl 010F
0CB8:010C add dl, 07
0CB8:010F int 21
0CB8:0111 int 20
0CB8:0113 nop
0CB8:0114
JE compara si es igual: Si la comparación se cumple se imprime la letra “A” y si
no se cumple se imprime la letra “a”.
-a100
0CB8:0100 mov ah, 02
0CB8:0102 mov dl, bl
0CB8:0104 add dl, 41
0CB8:0107 cmp dl, 41
0CB8:010A je 010F
0CB8:010C add dl, 20
0CB8:010F int 21
0CB8:0111 int 20
0CB8:0113 nop
0CB8:0114