2023
Práctica
ASSEMBLY Y PROGRAMANDO Organización de
5 CON EL SIMULADOR MSX88
Computadoras
Turno RECURSANTES
– Objetivos –
Que el alumno:
Use las instrucciones del lenguaje assembly del simulador MSX88.
Domine los diferentes modos de direccionamiento.
Realice el diseño de programas utilizando instrucciones del MSX88.
Comprenda la utilidad y funcionamiento de las subrutinas.
– Bibliografía –
Apunte 4 de la cátedra, “Lenguaje Assembly”.
Manual del simulador MSX88.
Set de Instrucciones de MSX88.
Para cada programa propuesto, deberá editar el archivo fuente y guardarlo con extensión ASM
(ej: ejer1.asm), luego ensamblarlo usando el comando asm88.exe (haciendo: asm88 ejer1.asm),
que producirá en su salida un archivo con extensión O (ej: ejer1.o), el cual deberá ser enlazarlo
con el comando link88.exe (haciendo: link88 ejer1.o) para obtener finalmente un archivo con
extensión EJE (ej: ejer1.eje), que podrá ser cargado y ejecutado dentro del simulador MSX88.
1) El Programa 1 utiliza una instrucción de transferencia de datos (instrucción MOV) con diferentes
modos de direccionamiento para hacer referencia a sus operandos. Ejecutar y analizar cada instrucción
en el Simulador MSX88 observando el flujo de información a través del BUS DE DATOS, el BUS DE
DIRECCIONES, el BUS DE CONTROL, el contenido de los REGISTROS, de las posiciones de
MEMORIA accedidas, de las operaciones en la ALU, etc...
a) Explicar detalladamente qué hace cada instrucción MOV del programa anterior, en función de sus
operandos y su modo de direccionamiento.
b) Confeccionar una tabla que contenga todas las instrucciones MOV anteriores, el modo de
direccionamiento y el contenido final del operando destino de cada una de ellas.
c) Notar que durante la ejecución de algunas instrucciones MOV aparece en la pantalla del simulador
un registro temporal denominado “ri”, en ocasiones acompañado por otro registro temporal
denominado “id”. Explicar con detalle que función cumplen estos registros.
2) El Programa 2 utiliza diferentes instrucciones de procesamiento de datos (instrucciones aritméticas y
lógicas). Analice y ejecute el comportamiento de ellas en el MSX88.
a) ¿Cuál es el estado de los FLAGS después de la ejecución de las instrucciones ADD y SUB del
programa anterior? Justificar el estado de cada uno de ellos (¿por qué quedaron en 0 ó en 1?).
¿Dan alguna indicación acerca de la correctitud de los resultados?
b) ¿Qué cadenas binarias representan a NUM1 y NUM2 en la memoria del simulador? ¿En qué sistemas
binarios están expresados estos valores?
c) Confeccionar una tabla que indique para cada operación aritmética o lógica del programa, el valor
de sus operandos, en qué registro o dirección de memoria se almacenan y el resultado obtenido
luego de realizar cada operación.
3) El Programa 3 implementa un contador utilizando una instrucción de transferencia de control.
Analice el funcionamiento de cada instrucción, poniendo atención en las del lazo repetitivo que provoca
la cuenta.
a) ¿Cuántas veces se ejecuta el lazo? ¿De qué variables depende esto en el caso general?
b) Analice y ejecute el programa reemplazando la instrucción de salto condicional JNZ por
las siguientes, indicando en cada caso el contenido final del registro AL:
1. JS
2. JZ
3. JMP
Práctica 5 Organización de Computadoras 1 /4
4) Escribir un programa en lenguaje assembly del MSX88 que implemente la sentencia condicional de un
lenguaje de alto nivel:
IF A < B THEN
C := A
ELSE
C := B;
Considerar que las variables de la sentencia están almacenadas en los registros internos de la CPU del
siguiente modo: A en AL, B en BL y C en CL. Determine las modificaciones que debería hacer al
programa si la condición de la sentencia IF fuera:
a) A ≤ B b) A = B
5) Analizar el funcionamiento del Programa 4 .
a) ¿El programa genera una tabla con las potencias de 2? Es decir, 20, 21, 22,...
b) ¿A partir de qué dirección de memoria comienza la tabla? ¿Para qué sirve DUP en esa definición?
c) ¿Cuál es la longitud de cada uno de sus elementos (medida en bits)?
d) ¿Cuántos elementos tiene la tabla una vez finalizada la ejecución del programa?
e) ¿De qué depende esta cantidad?
6) El Programa 5 suma todos los elementos de una tabla almacenada a partir de la dirección 1000H de la
memoria del simulador. Analizar el funcionamiento y determinar el resultado de la suma. Comprobar ese
resultado ejecutando el programa en el MSX88. ¿Qué modificaciones deberá hacer en el programa para
que el mismo almacene el resultado de la suma en la celda etiquetada TOTAL?
7) Escribir un programa que, utilizando las mismas variables y datos que el Programa 5 (TABLA, FIN,
TOTAL, MAX), determine cuántos de los elementos de TABLA son menores o iguales que MAX. Dicha
cantidad debe almacenarse en la celda TOTAL.
8) Escribir un programa que genere una tabla a partir de la dirección de memoria almacenada en la celda
DIR con los múltiplos de 5 desde cero hasta MAX.
9) Escribir un programa que sume en BSS dos números de 32 bits almacenados en memoria de datos
(etiquetados como NUM1 y NUM2) y guarde el resultado en RESUL. Tanto NUM1 como NUM2 y RESUL
necesitarán cada uno 4 bytes consecutivos en memoria, definidos como dos WORD, de esta manera:
NUM1 DW 05678H, 01234H ; De esta forma se representa en NUM1 el valor 012345678H.
; NUM1 apunta a la parte baja y NUM1+2, a la parte alta.
Verificar el resultado final y en caso de ser correcto, almacene 0FFH en una celda etiquetada BIEN o, en
caso de no serlo, almacene 0FFH en otra celda etiquetada MAL.
10) Escribir un programa que efectúe la suma de dos vectores de 6 elementos cada uno (donde cada
elemento es un número de 16 bits) almacenados en memoria de datos y etiquetados TAB1 y TAB2,
guardando el resultado de la suma en TAB3. Suponer en primera instancia que no existirán errores de
tipo aritmético (ni carry ni overflow), luego analizar y definir los cambios y agregados necesarios que
deberían realizarse al programa para tenerlos en cuenta.
11) El Programa 6 y el Programa 7 realizan la misma tarea, pero en uno de ellos se utiliza una instrucción
de transferencia de control con retorno. Analizar y comprobar que son equivalentes.
a) ¿Cuál es la tarea realizada por ambos programas? ¿Dónde queda almacenado el resultado?
b) ¿Cuál programa realiza la tarea más rápido? ¿El tiempo de ejecución de la tarea depende de los
valores asignados a NUM1, a NUM2, a ambos o a ninguno?
c) Explicar detalladamente todas las acciones que tienen lugar al ejecutarse la instrucción CALL SUB1.
d) Describir en detalle los pasos que realiza la instrucción RET.
e) ¿Cómo sabe la CPU a qué dirección de memoria debe retornar al ejecutar la instrucción RET?
12) El Programa 8 implementa la misma tarea que los programas del punto 11). Indicar las diferencias con
las rutinas anteriores, en particular lo relacionado con la forma de ‘proveer’ los operandos a la subrutina.
a) Explicar detalladamente todas las acciones que tienen lugar al ejecutarse las instrucciones
PUSH DX y POP DX.
b) ¿Cuáles son los dos usos que tiene el registro DX en la subrutina SUB2?
c) ¿Qué efecto consiguen el par de instrucciones “ADD DL,[BX]” y “ADC DH,0” sobre el registro DX?
Práctica 5 Organización de Computadoras 2 /4
ORG 1000H ORG 1000H ORG 1000H
NUM0 DB 0CAH NUM0 DB 80H INI DB 0
NUM1 DB 0 NUM1 DB 200 FIN DB 15
NUM2 DW ? NUM2 DB -1 ORG 2000H
NUM3 DW 0ABCDH BYTE0 DB 01111111B MOV AL, INI
NUM4 DW ? BYTE1 DB 10101010B MOV AH, FIN
ORG 2000H ORG 2000H SUMA: INC AL
MOV BL, NUM0 MOV AL, NUM0 CMP AL, AH
MOV BH, 0FFH ADD AL, AL JNZ SUMA
MOV CH, BL INC NUM1 HLT
MOV AX, BX MOV BH, NUM1 END
MOV NUM1, AL MOV BL, BH Programa 3
MOV NUM2, 1234H DEC BL
MOV BX, OFFSET NUM3 SUB BL, BH ORG 1000H
MOV DL, [BX] MOV CH, BYTE1 IABLA DW 500 DUP (?)
MOV AX, [BX] AND CH, BYTE0 ORG 2000H
MOV BX, 1006H NOT BYTE0 MOV AX, 1
MOV WORD PTR [BX], 1006H OR CH, BYTE0 MOV BX, OFFSET IABLA
HLT XOR CH, 11111111B CARGA: MOV [BX], AX
END HLT ADD BX, 2
Programa 1 END ADD AX, AX
Programa 2 CMP AX, 200
JS CARGA
HLT
ORG 1000H END
TABLA DB 2,4,6,8,10,12,14,16,18,20
Programa 4
FIN DB ?
TOTAL DB ?
MAX DB 13 ORG 1000H
ORG 2000H NUM1 DB 150
MOV AL, 0 NUM2 DB 10
MOV CL, OFFSET FIN-OFFSET TABLA RESUL DW ?
MOV BX, OFFSET TABLA ; Subrutina SUB2
SUMA: ADD AL, [BX] ORG 3000H
INC BX SUB2: MOV DX, 0
DEC CL MOV BX, AX
ORG 1000H
JNZ SUMA CMP BYTE PTR [BX], 0
NUM1 DB 150
HLT JZ FIN
NUM2 DB 10
END MOV BX, CX
RESUL DW ?
CMP BYTE PTR [BX], 0
Programa 5 ; Subrutina SUB1
JZ FIN
ORG 3000H
LAZO: MOV BX, AX
SUB1: MOV DX, 0
ADD DL, [BX]
ORG 1000H CMP AL, 0
ADC DH, 0
NUM1 DB 150 JZ FIN
PUSH DX
NUM2 DB 10 CMP CL, 0
MOV BX, CX
ORG 2000H JZ FIN
MOV DL, [BX]
MOV AL, NUM1 MOV AH, 0
DEC DL
CMP AL, 0 LAZO: ADD DX, AX
MOV [BX], DL
JZ FIN DEC CX
POP DX
MOV AH, 0 JNZ LAZO
JNZ LAZO
MOV DX, 0 FIN: RET
FIN: RET
MOV CL, NUM2 ; Programa principal
; Programa principal
LOOP: CMP CL, 0 ORG 2000H
ORG 2000H
JZ FIN MOV AL, NUM1
MOV AX, OFFSET NUM1
ADD DX, AX MOV CL, NUM2
MOV CX, OFFSET NUM2
DEC CL CALL SUB1
CALL SUB2
JMP LOOP MOV RESUL, DX
MOV RESUL, DX
FIN: HLT HLT
HLT
END END
END
Programa 6 Programa 7
Programa 8
Práctica 5 Organización de Computadoras 3 /4
Datos útiles:
Las subrutinas siempre se deben escribir antes que el programa principal, aunque su dirección de
comienzo sea más alta.
Las etiquetas de subrutinas y bucles van seguidas de dos puntos (:).
Los operandos en hexadecimal terminan en H y los que comienzan con una letra van precedidos por un
cero (0) para no ser confundidos con etiquetas (por ejemplo, 0A4H está bien pero A4H representa una
etiqueta llamada A4H, no el valor hexadecimal).
Se pueden incluir comentarios en los programas, anteponiendo siempre un punto y coma (;) y se toma
como comentario todo el texto que haya después del punto y coma hasta llegar al final de esa línea.
El direccionamiento indirecto solo está implementado con el registro BX.
Cada celda de memoria almacena un byte. Los datos de tipo WORD (16 bits o 2 bytes) se almacenan
así: Se usa un byte para la parte baja del valor de 16 bits (los 8 bits menos significativos del valor) y otro
byte para la parte alta del valor de 16 bits (los 8 bits más significativos del valor). El byte menos
significativo está en la dirección asociada al valor de 16 bits y el más significativo se encuentra en la
dirección siguiente al primero. Esto se corresponde con la idea de que la parte baja del dato se
almacena en la dirección más baja y la parte alta, en la dirección más alta (conocido como little-endian).
Práctica 5 Organización de Computadoras 4 /4