CLASE 11
INSTRUCCIONES
DE SALTO
Y
SENTENCIAS
CONDICIONALES
© Jaime Alberto Parra Plaza
PBN - 11 - 1
TEMA 1
INSTRUCCIONES
DE SALTO
© Jaime Alberto Parra Plaza
PBN - 11 - 2
Una instrucción de salto tiene por objetivo
continuar la ejecución del programa en
una instrucción diferente a la siguiente,
alterando la secuencia normal del
programa. Esto permite crear ciclos y
condiciones.
Físicamente, una orden de salto realiza su
labor cambiando el contenido del registro
IP (y si se requiere también el de CS), el
cual contiene el desplazamiento de la
próxima instrucción a ejecutar.
© Jaime Alberto Parra Plaza
PBN - 11 - 3
Se habla de dos clases de saltos, de acuerdo
a su alcance:
a. Salto cercano (NEAR): Sólo se cambia el
valor de IP, así que el salto es restringido al
interior del segmento actual.
b. Salto lejano (FAR): Se cambian IP y CS,
así que la nueva instrucción estará en un
segmento diferente.
© Jaime Alberto Parra Plaza
PBN - 11 - 4
MEMORIA
Segmento 1
100
Segmento 2
700
Salto NEAR:
La flecha indica
la siguiente orden
a ejecutar.
© Jaime Alberto Parra Plaza
20 Saltar a 50
21
50
PBN - 11 - 5
MEMORIA
Segmento 1
100
35
Segmento 2
Salto FAR:
La flecha indica
la siguiente orden
a ejecutar.
© Jaime Alberto Parra Plaza
700
20 Saltar a 100:35
21
PBN - 11 - 6
Según su tipo, el salto puede ser:
a. Condicional: El salto se hace si se cumple
una condición predeterminada, en caso
contrario se continúa con la instrucción
siguiente.
b. Incondicional: El salto se realiza sin más
requisitos.
© Jaime Alberto Parra Plaza
PBN - 11 - 7
INSTRUCCIÓN DE SALTO
INCONDICIONAL (JMP):
Sintaxis:
JMP
etiqueta
Propósito:
Salta a la instrucción cuya dirección esta
dada por etiqueta.
© Jaime Alberto Parra Plaza
PBN - 11 - 8
Ejemplo:
MOV
MOV
SEGUIR: DIV
INC
JMP
© Jaime Alberto Parra Plaza
AX, 5
BL, 2
BL
AX
SEGUIR
PBN - 11 - 9
INSTRUCCIONES DE SALTO
CONDICIONAL (Jx):
Es un conjunto de instrucciones, cada una
de las cuales evalúa una condición que
corresponde al último resultado dado por
la ALU. La clasificación se hace según el
tipo de operandos que se asociarán a la
operación aritmética u operación lógica
realizada:
© Jaime Alberto Parra Plaza
PBN - 11 - 10
a. OPERANDOS SIN SIGNO:
JA
JAE
JE
JBE
JB
JNE
=
=
=
=
=
=
© Jaime Alberto Parra Plaza
Salta si superior
Salta si superior o igual
Salta si igual
Salta si inferior o igual
Salta si inferior
Salta si diferente
PBN - 11 - 11
b. OPERANDOS CON SIGNO:
JG
JGE
JE
JLE
JL
JNE
=
=
=
=
=
=
Salta si mayor
Salta si mayor o igual
Salta si igual
Salta si menor o igual
Salta si menor
Salta si diferente
© Jaime Alberto Parra Plaza
PBN - 11 - 12
c. OTROS:
JC
JNC
JZ
JNZ
=
=
=
=
Salta si hay acarreo (flag carry = 1)
Salta si no hay acarreo (flag carry = 0)
Salta si cero (flag zero = 1)
Salta si no cero (flag zero = 0)
© Jaime Alberto Parra Plaza
PBN - 11 - 13
Al comparar dos cantidades pueden
obtenerse resultados diferentes si se
asumen con o sin signo:
Sean los números 0111 y 1010.
a. Tomándolos sin signo:
0111 = 7 y
1010 = 10
como 7 < 10
0111 < 1010
(Considerados sin signo)
© Jaime Alberto Parra Plaza
PBN - 11 - 14
b. Tomándolos con signo:
0111 = +7
y
1010 = -6
como +7 > -6
0111 > 1010
( Considerados con signo)
¡Las mismas dos cantidades dan
comparaciones diferentes!
© Jaime Alberto Parra Plaza
PBN - 11 - 15
Si se sabe que los operandos no son
signados (por ejemplo, caracteres) se debe
usar el grupo de saltos (a), pero si los
operandos corresponden a valores
númericos con signo, el grupo a usar es el
(b). Es el programador quien decide qué
tipos de operandos usa y qué comparación
es la adecuada.
© Jaime Alberto Parra Plaza
PBN - 11 - 16
TEMA 2
SENTENCIAS
CONDICIONALES
© Jaime Alberto Parra Plaza
PBN - 11 - 17
SENTENCIAS
CONDICIONALES:
Todas las sentencias de control en un HLL
pueden catalogarse como iterativas o
condicionales. En principio, todas pueden
transformarse en una operación if
acompañada, en algunos casos, de
órdenes de salto.
© Jaime Alberto Parra Plaza
PBN - 11 - 18
SENTENCIAS CONDICIONALES IF:
La sentencia if tiene la sintaxis:
if (expr1 && expr 2 || expr3 ... exprn)
{
/* bloque para condición verdadera*/
}
else
{
/*bloque para condición falsa */
}
© Jaime Alberto Parra Plaza
PBN - 11 - 19
Las herramientas en ensamblador para
construirla son:
• Instrucciones aritméticas y lógicas para
crear las expresiones
• Instrucciones de comparación para
implementar las condiciones
• Instrucciones de salto para seleccionar
el código a ejecutar
© Jaime Alberto Parra Plaza
PBN - 11 - 20
INSTRUCCIÓN DE COMPARACIÓN
(CMP):
Sintaxis:
CMP operando1, operando2
Propósito:
Hace una resta de operando2 a
operando1, pero no guarda el resultado.
Ejemplos:
© Jaime Alberto Parra Plaza
CMP
CMP
CMP
AL, cte8
CX, 2500
var8[SI], BL
PBN - 11 - 21
La instrucción se ha diseñado para hacer
una evaluacion lógica de una expresión
(Verdadero, Falso) y poder implementar
sentencias de decisión.
Usualmente, después de esta instrucción,
vendrá inmediatamente una instrucción
de salto.
© Jaime Alberto Parra Plaza
PBN - 11 - 22
SENTENCIA IF SIMPLE:
Sintaxis:
if (condición)
instrucción;
La instrucción se ejecuta si la condición es
VERDADERA (diferente de 0).
Ejemplo:
if (a > b)
c = 5;
© Jaime Alberto Parra Plaza
PBN - 11 - 23
Implementación:
IF10:
MOV
CMP
JLE
THEN10:
MOV
ENDIF10:
© Jaime Alberto Parra Plaza
AL, a
; AL = 1er. operando
AL, b
; a > b?
ENDIF10 ; no: salir
c, 5
; si: ejecutar
PBN - 11 - 24
Los nombres de las etiquetas no son
palabras especiales, se usan éstas para
que sea fácil seguir la lógica del salto.
Observe que se utiliza un salto que
evalúa la condición contraria a la que
aparece en el lenguaje de alto nivel, es
decir, el salto indica cuándo salir de la
sentencia.
© Jaime Alberto Parra Plaza
PBN - 11 - 25
LISTADO DE CONDICIONES Y SUS
CONTRARIOS:
(para operandos con signo)
Condición Salto Normal Salto Contrario
>
JG
JLE
>=
JGE
JL
==
JE
JNE
<=
JLE
JG
<
JL
JGE
!=
JNE
JE
© Jaime Alberto Parra Plaza
PBN - 11 - 26
SENTENCIA IF-ELSE SIMPLE:
Sintaxis:
if (condición)
instrucción1;
else
instrucción2;
Ejemplo:
if (a > b)
c = 5;
else
c++;
© Jaime Alberto Parra Plaza
PBN - 11 - 27
Implementación:
IF11:
MOV
AL, a
CMP
AL, b
JLE
ELSE11
THEN11:
MOV
c, 5
JMP
ENDIF11
ELSE11:
INC
c
ENDIF11:
© Jaime Alberto Parra Plaza
; AL = 1er. operando
; a es mayor que b?
; ejecutar para si
; ejecutar para no
PBN - 11 - 28
SENTENCIA IF CONDICIÓN AND:
La intrucción se ejecuta si todas las
condiciones son VERDADERAS.
Sintaxis:
if (condición1 and condición2)
instrucción;
Ejemplo:
if (a > b && a != -7)
c = 5;
© Jaime Alberto Parra Plaza
PBN - 11 - 29
Implementación:
IF11:
MOV
AL, a
; AL = 1er. operando
CMP
AL, b
; a no mayor que b?
JLE
ENDIF11 ; no: salir
AND11:
CMP
a, -7
; a es diferente a -7?
JE
ENDIF11
THEN11:
MOV
c, 5
; ejecutar la orden
ENDIF11:
© Jaime Alberto Parra Plaza
PBN - 11 - 30
SENTENCIA IF CONDICIÓN NOT:
La instrucción se ejecuta si la condición es
FALSA.
Sintaxis:
if (!condición)
instrucción;
Ejemplo:
if ( !(a > b) )
c = 5;
© Jaime Alberto Parra Plaza
PBN - 11 - 31
Implementación:
IF11:
MOV
CMP
JG
THEN11:
MOV
ENDIF11:
© Jaime Alberto Parra Plaza
AL, a
; AL = 1er. operando
AL, b
; a es mayor que b?
ENDIF11 ; si: salir ( es negada)
c, 5
; ejecutar la orden
PBN - 11 - 32
SENTENCIA IF CONDICIÓN OR:
La instrucción se ejecuta si una o más de las
condiciones son VERDADERAS.
Sintaxis:
if ( condición1 or condición2)
instrucción;
Ejemplo:
if ( a > b || a != -7)
c = 5;
© Jaime Alberto Parra Plaza
PBN - 11 - 33
Implementación:
IF11:
MOV
AL, a
CMP
AL, b
JG
THEN11
OR11:
CMP
a, -7
JE
ENDIF11
THEN11:
MOV
c, 5
ENDIF11:
© Jaime Alberto Parra Plaza
; AL = 1er. operando
; a es mayor que b?
; si: ejecutar la orden
; a es diferente a -7?
; no: salir
; ejecutar la orden
PBN - 11 - 34
SENTENCIA IF GENÉRICA:
Los ejemplos anteriores han buscado resaltar
la forma en que se implementa cada
posibilidad básica. Ahora es posible unirlas
todas, junto con la creación de expresiones,
para formar sentencias condicionales de
alta complejidad:
© Jaime Alberto Parra Plaza
PBN - 11 - 35
if ( (a+b) > c*d && ( ! b || (a-5)<c/(3+a) ) )
{
a = 3;
b = c+2;
}
else
{
c--;
d = a*b;
}
© Jaime Alberto Parra Plaza
PBN - 11 - 36
IF11:
MOV
ADD
MOV
IMUL
CMP
JLE
AND11:
CMP
JE
© Jaime Alberto Parra Plaza
BL, a
BL, b
AL, c
d
BL, AL
ELSE11
; BL = 1er. operando
; AL = 2do. operando
; a+b > c*d?
; no: ejecutar para no
b, 0
; b diferente a 0?
THEN11 ; si: ejecutar para si
PBN - 11 - 37
• OR11:
MOV
SUB
MOV
ADD
MOV
CBW
IDIV
CMP
JGE
© Jaime Alberto Parra Plaza
BL, a
BL, 5
CL, 3
CL, a
AL, c
; BL = 1er. operando
CL
; AL = 2do. operando
BL, AL ; a - 5 < c/(3+a)?
ELSE11 ; no: ejecutar para no
PBN - 11 - 38
THEN11:
MOV
MOV
ADD
MOV
JMP
ELSE11:
DEC
MOV
IMUL
MOV
ENDIF11:
© Jaime Alberto Parra Plaza
a, 3
;a=3
AL, c
AL, 2
b, AL
;b=c+2
ENDIF11
c
AL, a
b
d, AL
; c--
;d=a*b
PBN - 11 - 39
TEMA 3
SENTENCIAS IF
ANIDADAS
Y
EN ESCALERA
© Jaime Alberto Parra Plaza
PBN - 11 - 40
SENTENCIA IF ANIDADA:
Ocurre cuando el cuerpo de una
instrucción if es, a su vez, otra sentencia
if. Este esquema puede, eventualmante,
repetirse en cuantos niveles de
anidamiento se requiera:
© Jaime Alberto Parra Plaza
PBN - 11 - 41
if ( a>b )
if ( b>c )
if ( c>d )
a = 0;
else
a = 1;
else
a = 2;
else
a = 3;
© Jaime Alberto Parra Plaza
PBN - 11 - 42
IF11:
THEN11:
IF12:
MOV
CMP
JLE
AL, a
AL, b
ELSE11
MOV
CMP
JLE
AL, b
AL, c
ELSE12
THEN12:
...<sigue>...
© Jaime Alberto Parra Plaza
PBN - 11 - 43
IF13:
THEN13:
ELSE13:
ENDIF13:
ELSE12:
ENDIF12:
ELSE11:
ENDIF11:
© Jaime Alberto Parra Plaza
MOV
CMP
JLE
MOV
JMP
MOV
JMP
MOV
JMP
MOV
AL, c
AL, d
ELSE13
a, 0
ENDIF13
a, 1
ENDIF12
a, 2
ENDIF11
a, 3
PBN - 11 - 44
SENTENCIA IF EN
ESCALERA:
Se produce cuando después del else se sigue
otro if el cual también posee su propio
else con un if subsiguiente:
© Jaime Alberto Parra Plaza
PBN - 11 - 45
if ( a>b )
x = 0;
else
if ( a>c )
x = 1;
else
if ( a>d )
x = 2;
else
x = 3;
© Jaime Alberto Parra Plaza
PBN - 11 - 46
IF11:
THEN11:
ELSE11:
IF12:
THEN12:
© Jaime Alberto Parra Plaza
MOV
CMP
JLE
MOV
JMP
AL, a
AL, b
ELSE11
x, 0
ENDIF11
MOV
AL, a
CMP
AL, c
JLE
ELSE12
MOV
x, 1
JMP
ENDIF12
...<sigue>...
PBN - 11 - 47
ELSE12:
IF13:
THEN13:
ELSE13:
ENDIF13:
ENDIF12:
ENDIF11:
© Jaime Alberto Parra Plaza
MOV
CMP
JLE
MOV
JMP
MOV
AL, a
AL, d
ENDIF13
x, 2
ENDIF13
x, 3
PBN - 11 - 48
SENTENCIA SWITCH:
Una sentencia switch es muy similar a una
escalera if-else. La diferencia radica en
que, en el switch, se compara la expresión
condicional contra un conjunto de
constantes, en tanto que en la escalera se
puede comparar contra otras
expresiones:
© Jaime Alberto Parra Plaza
PBN - 11 - 49
switch ( a+b ) {
case 7:
x = 0;
break;
case 1:
x++;
break;
case -8:
x--;
break;
case 6:
case 4:
x = 1;
break;
default:
x = -1;
© Jaime Alberto Parra Plaza
}
PBN - 11 - 50
SWITCH11: MOV
AL, a
ADD
AL, b
; AL guarda la expresión
CASE11:
CMP
AL, 7
JNE
CASE12
MOV
x, 0
JMP
ENDSWITCH11
CASE12:
CMP
AL, 1
JNE
CASE13
INC
x
JMP
ENDSWITCH11
© Jaime Alberto Parra Plaza
PBN - 11 - 51
CASE13:
CASE14:
© Jaime Alberto Parra Plaza
CMP
JNE
DEC
JMP
CMP
JNE
JMP
AL, -8
CASE14
x
ENDSWITCH11
AL, 6
CASE15
DOCASE15
PBN - 11 - 52
CASE15:
CMP
JNE
DOCASE15: MOV
JMP
DEFAULT11: MOV
ENDSWITCH11:
© Jaime Alberto Parra Plaza
AL, 4
DEFAULT11
x, 1
ENDSWITCH11
x, -1
PBN - 11 - 53
PREGUNTA 11:
• ¿Por qué los saltos condicionales están
restringidos a sólo 128 bytes de distancia
máxima desde el punto de origen
(explicaciones software y hardware)?
• ¿Qué efectos tiene el qualificador short
cuando se aplica a una orden de salto
incondicional. Cuándo se recomienda
usarlo?
© Jaime Alberto Parra Plaza
PBN - 11 - 54
< FIN DE LA CLASE 11 >
© Jaime Alberto Parra Plaza
PBN - 11 - 55
Descargar

INSTRUCCIONES DE SALTO