Beruflich Dokumente
Kultur Dokumente
Programación II.
Módulo: Assembler
2
SALTOS
ESTRUCTURAS DE CONTROL
Taller de Programación 2018 - Módulo Assembler 3
Flags de la CPU
• Son bits que indican el estado de la ALU luego de la
ejecución de alguna operación
Flags
Taller de Programación 2018 - Módulo Assembler 5
Flags de la CPU
Decimal
Codificado en
Binario
Taller de Programación 2018 - Módulo Assembler 6
Flags de la CPU
Taller de Programación 2018 - Módulo Assembler 7
Instrucciones de salto
Taller de Programación 2018 - Módulo Assembler 8
Ejemplos de Saltos
Taller de Programación 2018 - Módulo Assembler 9
Si la comparación en (a) establece el flag Z en 1, el salto en (b) se produce, haciendo que la ejecución continúe en
la etiqueta Then. Ahí, se ejecutan las instrucciones (d) y (e) que hacen lo que se encuentra en el THEN del IF y
continúa la ejecución en la instrucción apuntada por la etiqueta Fin_IF .
Si el flag Z quedó en 0 en (a), el salto en (b) no se produce, por lo que la ejecución continúa en la próxima
instrucción, el JMP en (c), que saltea las instrucciones y continúa la ejecución en la instrucción apuntada por la
etiqueta Fin_IF , que señala el final del IF
Taller de Programación 2018 - Módulo Assembler 11
IF …. Then … else
ORG 2000h
IF AL = 4 THEN CMP AL, 4 ;
BEGIN
BL = 1;
JZ Then ;
CL = CL + 1; JMP Else ;
END Then: MOV BL, 1 ;
ELSE INC CL ;
BEGIN
BL = 2; JMP Fin_IF ;
CL = CL – 1; Else: MOV BL, 2 ;
END; DEC CL ;
Fin_IF: HLT ;
Este salto
END
incondicional
hace que no se
ejecute el else si
es que pasé por
el then
Taller de Programación 2018 - Módulo Assembler 12
MOV AL, 0
MOV CL, 10 Podemos verlo como un Repeat….until
Volver: ADD AL, AL de Pascal, donde sabemos la cantidad de
DEC CL veces, pero podría ser que no supiéramos
CMP CL, 1 cuantas veces ejecuta.
JNZ Volver
Fin: HLT ¿Podemos verlo como For este caso? SI,
también se lo puede interpretar como FOR
Ejemplo de Repaso
ORG 1000h
(a) Inicializa BX con “OFFSET tabla”. Esto
tabla DB 1, 2, 3, 4, 5 indica que se debe cargar en BX la
fin_tabla DB ? dirección de tabla, no el contenido de dicha
variable.
resultado DB 0
(b) Se asigna a CL la diferencia entre la
dirección de tabla y la dirección de
ORG 2000h fin_tabla. Lo que se logra es calcular
cuantos bytes hay entre el comienzo y el
MOV BX, OFFSET tabla ; (a) final de la tabla. De esta manera,
MOV CL, OFFSET fin_tabla – OFFSET tabla ; (b) obtenemos la cantidad de datos que
Bucle: MOV AL, [BX] ; (c) contiene la tabla.
INC BX ; (d)
(c) Vemos que en el MOV aparece BX entre corchetes.
XOR resultado, AL ; (e) Esto significa que se debe asignar en AL el contenido de
(d) Se incrementa BX, con lo que
DEC CL ahora apunta al siguiente byte de la celda de memoria cuya dirección es el valor contenido
en BX. Así, como BX se había inicializado con la
JNZ Bucle la tabla
dirección del comienzo de la tabla, esto causa que se
HLT cargue en AL el contenido de la
END (e) Se calcula una operación XOR con el primer entrada de la tabla.
contenido de la variable resultado y el byte que se
acaba de obtener en AL, dejando el resultado de
esa operación en la misma variable.
Taller de Programación 2018 - Módulo Assembler 15
Ejercicio de Repaso
ORG 1000h
Tener en tabla dw 5, 2, 10, 4, 5, 0, 4, 8, 1, 9
cuenta que la
tabla es de
min dw 0FFFFh
Word (2 bytes)
ORG 2000h Recordar que el CMP
1. Realizar paso a paso los momentos de los MOV BX, OFFSET tabla hace Destino – Fuente
registros de la CPU. MOV CL, 0 y no almacena nada en
MOV AX, min destino. Solo altera los
flags de la CPU
2. Armar la memoria de Datos. Bucle: CMP [BX], AX
JNC Menor
3. ¿Qué realiza el siguiente programa? MOV AX, [BX]
Menor: ADD BX, 2
INC CL
¿Que valor
CMP CL, 10 queda en
JNZ Bucle min?
MOV min, AX
HLT
END
Taller de Programación 2018 - Módulo Assembler 16
Bibliografía e información