EJERCICIOS
EJERCICIOS GNUSIM 8085
EJERCICIO 1
1. Analice el siguiente programa
Address Instrucciones Lenguaje de Máquina
(Hexadecimal) (Assembly Language) (Hexadecimal)
0822C NOP 00
0822D IN 00 DB 00
0822F ADD A 87
08230 ADD A 87
08231 OUT 00 D3 00
08233 JMP 08822D C3 0000
Lo que pretende el programa es crear un bucle en el que se repita indefinidamente un
proceso de suma de una cantidad con sigo misma y ese resultado volver a sumarlo
así mismo, para ello toma el valor del puerto 00 y luego lo presenta el resultado en
ese mismo puerto.
Existe un error cuando el JMP se comunica con 08822D debido a dos circustancias:
1. Al final de digitar el número se debe ubicar H para identificarlo como valor
hexadecimal.
2. El JMP se dirige a una dirección inexistente y no permite el flujo continuo del
programa, pues lo detiene en ese error y no da paso al bucle.
La solución que se propone es considerar que el registro PC (en el tablero del
GNUSIM) es un registro contador de 16bits que en todo momento contiene la
dirección de la siguiente instrucción en ser ejecutada. Su actualización es
automática, no obstante puede ser alterado por medio de las instrucciones de salto.
Ejemplo:
JMP 3000h
Fija el valor 3000 hex en el Contador de Programa (PC) causando que la siguiente
instrucción sea ejecutada desde la dirección 3000h. Esto representa un salto a la
dirección 3000h (su validación se comprueba en el punto 5)
2. Explique lo que hacen las instrucciones de este programa.
JMP (dirección instrucción o memoria): Crear un bucle infinito, que puede ser
cargado a memoria. (“Salto incondicional”). Además permite saltar a una dirección de
instrucción especificada por JMP que es la 08822Dh.
NOP: Permite ejecutar la siguiente linea de programación y finalizar el ciclo creado
por JMP .
ADD( registro a sumar): Suma el valor del registro indicado por ADD al Acumulador
IN (dirección puerto): Permite leer un puerto 00 (I/O)
OUT (dirección puerto): Permite presentar por el puerto 00 un dato del
acumulador.
3. Si el dato que representamos en el puerto de entrada es 05h, ¿qué resultado
obtendremos a la salida del puerto?
Da el valor en el puerto 00 de 14/16 = 20/10
4. Si el dato es 10h, ¿Cuál será el resultado?
Da el valor en el puerto 00 de 40/16 = 64/10
5. Verifique sus contestaciones ingresando y ejecutando el programa en el
simulador GNUSIM8085, actualice la memoria 0822D de la última instrucción de
acuerdo al registro PC de su simulador.
Corrigiendo el error:
EJERCICIO 2
1. Analice el siguiente programa
Address Instrucciones Lenguaje de Máquina
(Hexadecimal) (Assembly Language) (Hexadecimal)
0000 NOP 00
0001 IN 00 DB 00
0003 MOV B,A 47
0004 LDA 0010 3A 10 00
0007 ADD B 88
0009 OUT 00 D3 00
000B JMP 0000 C3 0000
0010 (dato) 45
Carga un valor desde el puerto 00 al acumulador (A) para luego ser movido este valor
(copia) al registro B y luego tomar el valor de la posición de memoria almacenandolo
en el acumulador para sumarle el valor del registro B; todo esto en una secuencia
indefinida.
Existe el mismo problema que el ejercicio 1.
2. Explique lo que hace las instrucciones de este programa.
JMP (dirección instrucción o memoria): Crear un bucle infinito, que puede ser
cargado a memoria. (“Salto incondicional”). Además permite saltar a una dirección de
instrucción especificada por JMP que es la 08822Dh.
NOP: Permite ejecutar la siguiente linea de programación y finalizar el ciclo creado
por JMP .
ADD( registro a sumar): Suma el valor del registro indicado por ADD al Acumulador
IN (dirección puerto): Permite leer un puerto 00 (I/O)
OUT (dirección puerto): Permite presentar por el puerto 00 un dato del acumulador.
LDA(dirección memoria): Permite cargar al acumulador (A) un valor almacenado
en la dirección de memoria, especificada por LDA.
MOV(regis. destino, regis. Fuente): Mueve el valor de un registro destino a un
registro especificado por MOV como fuente.
3. Si el dato que representamos en los interruptores es 0Ah, ¿qué resultado
obtendremos en el puerto de salida?
Da el valor en el puerto 00 de 37/16 = 55/10
4. Si el dato es 1Fh, ¿cuál será el resultado?
Da el valor en el puerto 00 de 4C/16 = 76/10
5. Verifique sus contestaciones ingresando y ejecutando el programa en el
simulador GNUSIM8085, actualice la memoria 0000 de la ultima instrucción de
acuerdo al registro PC de su simulador.
Para corregir el error solo ubicamos en la dirección de JMP el valor de 77B5h.
EJERCICIO 3
1. Analice el siguiente programa. Determine los ciclos de máquina que llevará a
cabo cada una de sus instrucciones.
Address Instrucciones Lenguaje de Máquina
(Hexadecimal) (Assembly Language) (Hexadecimal)
Ciclos
0000 NOP 00 4
0001 LDA 0010 3A 10 00 13
0004 ADI 02 C6 02 7
0006 JMP 0000 C3 00 00 10
TOTAL CICLOS 34
0010 55 (Dato)
El programa permite cargar el valor 55 de la posición de memoria 10/ 10 al acumulador
(A) para luego ser sumado un valor de dos a esta cantidad almacenada en A. Este
proceso se torna infinito, realizando el mismo proceso en cada lazo.
Existe el error del ejercicio 1 para corregirlo ubicamos la dirección 8365h en el JMP.
2. Ingrese el programa y córralo en el simulador GNUSIM8085 (Actualice las
direcciones de memoria de acuerdo a su simulación). Grafique el contenido de
los registros A,PC y las banderas ejecutando el lazo tres veces.
Corrigiendo el error:
Lazo 1 Lazo 2 Lazo 3
A 39 A 39 A 39
Pc 836A Pc 836A Pc 836A
P 1 P 1 P 1
3. Explique el significado de las banderas de acuerdo al valor que van tomando.
Bandera P:
La bandera de Paridad, P=1 si la suma de unos en el resultado da par,
P=0 si la suma de unos en el resultado da impar.
EJERCICIO 4
1. Analice el siguiente programa. Cargue el valor 43h en el puerto de entrada 00 y
determine los ciclos de máquina que llevará acabo cada una de las
instrucciones. Dibuje el diagrama de tiempo de los registros.
Address Instrucciones Lenguaje de Máquina
(Hexadecimal) (Assembly Language) (Hexadecimal)
Ciclos
0000 NOP 00 4
0001 IN 00 DB 00 10
0004 OUT 05 D3 05 10
0006 JMP 0000 C3 00 00 10
TOTAL CICLOS 34
El programa permite adquirir el valor de 43h del puerto 00 y almacenarlo en el
acumulador para luego visualizarlo en el puerto 05/10. Este ciclo se realizará
indefinidamente.
Existe en problema del ejercicio 1 y para solucionarlo asignamos 0A9D5h a la
dirección del JMP.
Diagrama de tiempo de los registros:
Cálculos:
Tiempo para el registro A:
TDregistro =T ∗LoopT −state∗N10
Donde T es el periodo del reloj del CPU, LoopT-States es la suma de todos los T- States de cada
instrucción, y N10 es el valor del delay cargado en el registro en decimal.
Si se supone que el reloj trabaja a una frecuencia de 2MHz, entonces: T = 500 ns.
IN = OUT
43h=67/10
TDA = (500 ns)*(10)*(67) = 0,335 ms
NOP = (500 ns)*(4) = 0,002 ms
JMP = (500 ns)*(10) = 0,005 ms
tiempo total de la ejecución del programa = 0,677 ms
2. Ingrese el programa y córralo. ¿qué relación existe entre lo que representan los
valore ingresados al puerto de entrada y lo que sale en el puerto asignado?.
Corrigiendo el error:
La relación que existe en el valor, entre los los puerto de salida y entrada, es que
ambos números son el mismo número, pues cuando se ingresa el número en el
puerto 00 este se identifica de manera mnemónico (43h) en forma hexadecimal y el
resultado que se presenta en el puerto 00 se presenta en manera decimal (67/10).
EJERCICIO 5
1. Traduzca el siguiente programa a lenguaje de máquina y asígnele una dirección
a cada instrucción. Comienze con la dirección aleatoria que el simulador
GNUSIM8085 asigne en su simulación en modo hexadecimal.
(Hexadecimal) (Assembly Language) (Hexadecimal)
0000 NOP 00
90B5 LDA 0C020h 3A 20 C0
90B8 MVI B, 88 06 58
90BA ANA B A0
90BB SUI 02 D6 02
90BD OUT 00 D3 00
90BF STA 0C021h 32 21 C0
90C2 JMP xxxx C3 B5 90
2. Analice el programa. ¿Qué debe suceder cuando lo corremos?
El programa carga el dato 97 de la dirección de memoria 0C020h al acumulador (A),
luego asigna el valor de 88/10 al registro B. Una vez asignado los datos procede a
realizar la operación lógica AND entre el registro B y el registro A para luego resta 2/10
del acumulador (A). Presenta el resultado de la operación en el puerto 00 y almacena
en la posición de memoria 0C021h. Dentro de un bucle infinito.
Bandera AC: Es el acarreo auxiliar, AC=1 si hay acarreo del bit 3 al 4 durante
una operación aritmética.
3. Ingrese el programa y córralo. Verifique sus predicciones.
4. Detenga el programa y verifique el contenido de la dirección de memoria C021.
¿Qué contiene?
Contiene el resultado final de las operaciones del programa en forma decimal 62/10
EJERCICIO 6
1. Traduzca el siguiente programa a lenguaje de máquina y asígnele una dirección
a cada instrucción. Recuerde comenzar con la dirección aleatoria de inicio que
el simulador GNUSIM8085 y usar el modo hexadecimal en la programación.
(Hexadecimal) (Assembly Language) (Hexadecimal)
0000 NOP 00
9735 IN 00 DB 00
9737 ORI 07 F6 07
9739 CMA 2F
973A OUT 00 D3 00
973C JMP xxxx C3 35 97
2. Analice el programa. ¿Qué debe suceder cuando lo corremos si tenemos el
número 18h en el puerto de entrada?
El programa carga el valor de 18h desde el puerto 00 y lo almacena en el acumulador,
para luego realizar la operación lógica OR entre el acumulador y el valor indicado por
ORI. Despues de realizar las operaciones antes señaladas realiza un complemento
del acumulador (A) sin afectar las banderas y presentar el resultado por el puerto 00.
Dentro de un bucle infinito.
3. Ingrese el programa y córralo. Verifique sus predicciones.
EJERCICIO 7
1. Traduzca el siguiente programa a lenguaje de máquina y asígnele una dirección
a cada instrucción. Recuerde comenzar con la dirección aleatoria de inicio que
el simulador GNUSIM8085 y usar el modo hexadecimal en la programación.
(Hexadecimal) (Assembly Language) (Hexadecimal)
0000 NOP 00
E1E5 MVI A, 070h 3E 70
E1E7 MVI B, 0ACh 06 AC
E1E9 XRA B A8
E1EA STA C012 32 12 C0
E1ED HLT 76
2. Analice el programa. ¿Qué debe suceder cuando lo corremos?
Asigna valores a los registros A y B de 70h y Ach, respectivamente para luego realizar
la operación lógica OR EXCLUSIVA entre el registro B y el acumulador (A). El
resultado se lo almacena en la posición de memoria C012h. Esto NO es un bucle
infinito. Se debe aumenta 0h en la dirección de STA.
3. Ingrese el programa y córralo. Verifique sus predicciones.
EJERCICIO 8
1. Traduzca el siguiente programa a lenguaje de máquina y asígnele una dirección
a cada instrucción. Recuerde comenzar con la dirección aleatoria de inicio que
el simulador GNUSIM8085 y usar el modo hexadecimal en la programación.
(Hexadecimal) (Assembly Language) (Hexadecimal)
0000 NOP 00
C585 MVI A, 099h 3E 99
C587 ANI 01h E6 01
C589 JNZ ETIQUETA 1 C2 F1 CF
C589 MVI A, 0CCh 3E CC
C58B JMP PRESENTA C3 F3 CF
C591 ETIQUETA1: MVI A, 0F 3E 0F
C593 PRESENTA: OUT 00 D3 00
C595 HLT 76
2. Analice el programa. ¿Qué debe suceder cuando lo corremos?
Asigna al acumulador (A) el valor de 099h para luego realizar la operación lógica
AND entre el acumulador y el valor especificado por ANI. Después realiza un salto
delinea así ETIQUETA1 para asignar el valor de 0F y luego presentar el contenido del
registro A por el puerto 00 evitando ejecutar la linea de programación de MVI A,
0CCh que iba a signar el valor de Cch al acumulador (A). Se debe aumenta 0h en
la dirección de STA
3. Ingrese el programa y córralo. Verifique sus predicciones.
EJERCICIO 9
1. Traduzca el siguiente programa a lenguaje de máquina y asígnele una dirección
a cada instrucción. Recuerde comenzar con la dirección aleatoria de inicio que
el simulador GNUSIM8085 y usar el modo hexadecimal en la programación.
(Hexadecimal) (Assembly Language) (Hexadecimal)
0000 NOP 0000
E4E5 IN 00 DB 00
E4E7 LAZO: INR B 04
E4E8 SUI 057h D6 57
E4EA JNZ LAZO C2 47 EF
E4EB MVI A, 0FFh 3E FF
E4EC OUT 00 D3 00
E4EE HLT 76
2. Analice el programa. ¿Qué debe suceder cuando lo corremos si tenemos el
número 33h en el puerto de entrada?
El programa toma el valor del puerto 00 para almacenarlo en el acumulador (A), luego
la instrucción LAZO incrementa en 1 al registro B. Luego se resta el valor de 057h del
acumulador y este proceso de resta lo realiza indefinida mente por crearse un bucle
con JNZ (simpre y cuando la negación de Z = 0) y la linea LAZO impidiendo la
ejecución de las demás lineas de programación. Se afectan las bandera S y C.
Bandera S: Indica el signo del resultado, S=0 si el resultado es positivo,
S=1 si el resultado es negativo.
Bandera C: La bandera de Acarreo, C=1 si el resultado es un número de 9
bits, C=0 si el resultado es un número de 8 bits.
3. Ingrese el programa y córralo. Verifique sus predicciones.
EJERCICIO 10
1. Traduzca el siguiente programa a lenguaje de máquina y asígnele una dirección
a cada instrucción. Recuerde comenzar con la dirección aleatoria de inicio que
el simulador GNUSIM8085 y usar el modo hexadecimal en la programación.
(Hexadecimal) (Assembly Language) (Hexadecimal)
0000 NOP 00
8165 TOPE: IN 00 DB 00
8167 CMI 99 FE 99
8169 JNC TOPE D2 C5
816C MVI A, EE 3E EE
816E OUT 00 D3 00
8170 HLT 76
2. Analice el programa. Describa en sus propias palabras la operación del
programa . Puede utilizar un flujograma si le es conveniente.
Existe un error en CMI no es un comando valido, el que parece el remplazo es CPI.
El programa toma el valor del puerto 00 para ser almacenado en el acumulador (A)
luego, considerando que sea CPI, se realiza una comparación entre el acumulador y
el valor identificado por CPI que almacenara su respuesta de la comparación en las
banderas deacuerdo a:
1. Si A < Dato; C=1
2. Si A = Dato; Z=1
3. Si A > Dato; C y Z =0
Debería formrce un buble infinito por parte de JNC pero simpre y cuando ocurra que
la negación de C sea igual a 0 y este no es el caso;pasado esto se asigna el valor de
EE (hay que aumenta 0h) al registro A para luego presentar ese valor por el puerto
00
3. Ingrese el programa y córralo. Verifique sus predicciones.