Sie sind auf Seite 1von 16

1

TEMA: LENGUAJE ENSAMBLADOR

Programación II.
Módulo: Assembler
2

SALTOS
ESTRUCTURAS DE CONTROL
Taller de Programación 2018 - Módulo Assembler 3

Repaso: Modos de direccionamiento


Taller de Programación 2018 - Módulo Assembler 4

Flags de la CPU
• Son bits que indican el estado de la ALU luego de la
ejecución de alguna operación

• Utilizaremos principalmente los bits C, O, S y Z.


(que son los vistos en la ALU de vonsim)

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

¿Cómo armar Estructuras de control en assembler?


Taller de Programación 2018 - Módulo Assembler 10

¿Cómo hacer un if? CMP alterará los flags y en particular, nos


interesa ver al flag Z, ya que si dicho flag está
En assembler: en 1, implica que al resta AL con 4, el
En Pascal sería: CMP AL, 4 ; (a) resultado dio 0, por lo que AL tiene que valer
IF AL = 4 THEN
JZ Then ; (b) 4.Entonces, si esa condición es verdadera,
BEGIN
JMP Fin_IF ; (c) deberíamos ejecutar las instrucciones que
BL = 1;
Then: MOV BL, 1 ; (d) están dentro del THEN. Si no, deberíamos
CL = CL + 1;
INC CL ; (e) evitar ejecutarlas.
END;
Fin_IF: HLT

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

Lazos El programa inicializa AX en 10, hace lo


ORG 2000h que tenga que hacer dentro del bucle,
decrementa AX en 1 y salta a la
MOV AX, 10 instrucción apuntada por la etiqueta
Lazo: ... ; Lazo (el DEC) siempre y cuando el flag
Z quede en 0, o sea, que el resultado
... ; <Instrucciones a repetir> de la operación anterior no haya dado
... ; como resultado 0.

DEC AX Como AX se decrementa en cada


iteración, llegará un momento en que
JNZ Lazo El ejemplo plantea un esquema
básico de iteración usado AX será 0, por lo que el salto
JMP Fin comúnmente como algo condicional no se producirá y
equivalente a un continuará la ejecución del programa en
Fin: HLT “ For i := n downto 1” de Pascal. la siguiente instrucción luego de dicho
END En AX tengo la cantidad de
repeticiones
salto.
Taller de Programación 2018 - Módulo Assembler 13

¿Qué estructura de control implementa este código?

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

¿Cómo hacemos un While <condición> do , de Pascal?


Taller de Programación 2018 - Módulo Assembler 14

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

Das könnte Ihnen auch gefallen