Vous êtes sur la page 1sur 14

1

ESTRUCTURA Y FUNCIONAMIENTO DE COMPUTADORAS II AO 2011

LICENCIATURA EN CIENCIAS DE LA COMPUTACIN

LICENCIATURA EN SISTEMAS DE INFORMACIN

PRCTICO: ENSAMBLADOR

Introduccin:
Una computadora es una mquina lgica, esencialmente secuencial, que manipula nmeros binarios
y procesa esta informacin siguiendo una secuencia ordenada de pasos de programa, las
instrucciones. Esto quiere decir que realiza sus tareas una detrs de otra, siguiendo el orden en el
que las instrucciones han sido secuencialmente cargadas en memoria para ser ejecutadas.
Sus componentes bsicos sern, por lo tanto, un lugar donde almacenar las instrucciones y datos
(memoria) un elemento encargado de ejecutar los procesos u operaciones indicados por esas
instrucciones (CPU) y los elementos encargados del intercambio de informacin con los perifricos
(interfaces).

La CPU debe incluir todos los componentes necesarios para acceder a la memoria (lectura /
escritura), decodificar las instrucciones, y ejecutar clculos aritmticos y lgicos. En las computadoras
de pequeo tamao (microcomputadoras) la CPU est integrada dentro de un slo chip (circuito
integrado) de silicio, a este chip se lo denomina MicroProcesador (P).

El P realiza todas las funciones de la computadora extrayendo las instrucciones de la memoria,


ejecutndolas, y transfiriendo los resultados bien a la misma memoria y/o a los dispositivos de salida.
Cada una de las posiciones o celdas de memoria est numerada para distinguirla de las dems. El
nmero que define o identifica a una posicin de memoria recibe el nombre de direccin. Cuando
el P necesita leer o escribir informacin en una determinada celda de memoria, coloca la direccin
de esta celda sobre su bus de direcciones activando la misma, luego enva una orden de lectura o
escritura a travs de su bus de control y el contenido de la celda de memoria es transferido al P
(lectura) o modificada con un dato proveniente del P (escritura) a travs de su bus de datos. Para
el caso del P Z-80, el bus de direcciones tiene una longitud de 16 bits y el bus de datos de 8 bits, lo
que le permite acceder hasta un mximo de 65.536 (64 K) celdas o posiciones de memoria de una
longitud de 8 bits (1 byte) cada una.

Instrucciones de mquina:

Una instruccin de mquina es un cdigo binario (codificacin de ceros y unos) que puede ser
interpretada por la unidad de control del P para ejecutar una tarea u operacin.

La unidad de control de un P en particular tendr la capacidad de interpretar (es decir, decodificar)


un cierto nmero de instrucciones de mquina o cdigos binarios representativos de las tareas u
operaciones que el P y su hardware asociado (es decir la computadora) pueden realizar. A este
conjunto limitado de cdigos binarios es a lo que se le llama conjunto bsico o set de instrucciones
y son asignados por el fabricante al disear el P.
2

Una instruccin de mquina consta de:

a) Cdigo de Operacin: es el cdigo binario que contiene la informacin sobre la operacin a realizar
(puede consistir de uno o ms bytes de acuerdo al formato de la instruccin).

b) Operandos: son los datos o las direcciones de memoria en donde se encuentran almacenados los
datos sobre los cuales debe realizarse la operacin identificada por el cdigo de operacin (de
acuerdo al formato, la instruccin puede tener uno o ms operandos de uno o ms bytes o bien no
tener operandos).

El P Z-80 posee un bus de datos de 8 bits, por lo que cada vez que efecta una operacin de lectura
de memoria lee un octeto completo (byte) el cual puede ser una instruccin o un dato. Con un cdigo
de operacin de 8 bits se pueden codificar 256 operaciones distintas. El Z-80 posee 158
instrucciones, pero si se tienen en cuenta los diferentes modos de direccionamiento puede llegar
hasta 696 instrucciones, por lo que algunos cdigos de operacin ocupan ms de 1 byte; por otro
lado, en un gran nmero de instrucciones, el operando consta de uno a varios bytes que siguen al
cdigo de instruccin. Entonces, de acuerdo a la cantidad de bytes que ocupan el cdigo de
operacin y el operando, tenemos los siguientes formatos de instruccin:

a) Instrucciones de un solo byte: Consisten solo de un cdigo de operacin, no contienen operandos


(ocupan una sola posicin de memoria).

b) Instrucciones multibyte: ocupan dos, tres o cuatro posiciones sucesivas de memoria, y cada una de
ellas tiene dos formas:

Instrucciones de dos bytes:

1er Byte: Cdigo de Operacin Cdigo de Operacin

2do Byte: Cdigo de Operacin Operando DATO O DESPLAZAMIENTO

Instrucciones de tres bytes:

1er Byte: Cdigo de Operacin Cdigo de Operacin

2do Byte: Cdigo de Operacin Operando DATO O DIRECCIN

3er Byte: Operando DATO O DESPLAZAMIENTO Operando DATO O DIRECCIN

Instrucciones de cuatro bytes:

1er Byte: Cdigo de Operacin Cdigo de Operacin

2do Byte: Cdigo de Operacin Cdigo de Operacin

3er Byte: Operando DATO O DIRECCIN Operando DATO O DESPLAZAMIENTO

4to Byte: Operando DATO O DIRECCIN Cdigo de Operacin


3

Ejecucin secuencial:

Las instrucciones de mquina que componen un programa se almacenan en la memoria del


computador en forma secuencial. Por lo tanto, el programador almacena sus instrucciones en
posiciones de memoria adyacentes de forma que las direcciones inferiores contengan las primeras
instrucciones a ejecutar y las direcciones ms altas las ltimas instrucciones. La nica ocasin en que
el programador puede despreciar ese orden es cuando una instruccin del programa corresponde a
una instruccin de salto a otra zona de memoria (esta instruccin de salto contiene la nueva
direccin de la prxima instruccin a ejecutarse).

Para lograr la correcta ejecucin del programa el P debe extraer en forma secuencial las
instrucciones de memoria para as determinar cules son las operaciones a realizar. Para esto es
preciso conocer perfectamente las posiciones (direcciones) de memoria en las que reside tal
informacin. A tal efecto el P dispone de un registro Contador de Programa (PC) que contiene la
direccin de memoria (16 bits) desde donde hay que leer la instruccin en curso. Tras la lectura del
primer byte del cdigo de operacin de la instruccin, el registro se incrementa en 1 para leer la
prxima celda de memoria (la que contendr, de acuerdo al formato de la instruccin en curso, el
prximo byte del cdigo de operacin, un operando o el cdigo de operacin de la prxima
instruccin) o bien se sustituye su valor por otro si se debe ejecutar una instruccin de salto o de
llamado a una subrutina.

Cabe sealar que en el momento de conectar la computadora se genera una seal de reset que pone
este registro a cero por lo que la ejecucin comienza desde la primera direccin de memoria, la que
debe contener la primera instruccin de un programa que se encargue de cargar el sistema operativo
(o bien, para sistemas pequeos, el mismo sistema operativo) y en consecuencia esta zona de
memoria debe ser del tipo permanente o no voltil (ROM, PROM, EPROM).

Lenguaje de mquina:

En este lenguaje el programa se construye directamente con los cdigos binarios (ceros y unos)
correspondientes a las instrucciones del conjunto bsico o set de instrucciones del P. A este
programa as obtenido la llamamos programa objeto o mdulo objeto y es el que realmente
interpreta el P.

Cualquier programa escrito en otra lenguaje (sea de bajo, medio o alto nivel) debe ser traducido a
lenguaje de mquina para poder ser ejecutado por la computadora. La programacin en lenguaje de
mquina es muy engorrosa debido a que debemos codificar todas las instrucciones combinando
ceros y unos. Por ello, y dependiendo de las prestaciones de la computadora, se puede usar una
codificacin octal o hexadecimal, o bien una programacin en lenguaje ensamblador (assembler).

Lenguaje Ensamblador (Assembler):

Este no es ms que un lenguaje simblico en el cual el programador escribe las mismas


instrucciones que en lenguaje de mquina pero usando nombres mnemotcnicos para los cdigos de
operacin y se desentiende de las direcciones de memoria ya que estas se expresan en forma
simblica (es decir, con un nombre cualquiera). A un programa as obtenido lo llamamos programa
fuente o mdulo fuente y necesitan ser traducidos a un mdulo objeto para poder ser
procesados en un computador.
4

Entonces el ensamblador es un programa encargado de traducir al lenguaje de mquina las


instrucciones escritas en el lenguaje simblico. Esta traduccin del programa fuente en programa
objeto se realiza haciendo una trascripcin instruccin por instruccin del lenguaje simblico al
lenguaje de mquina.

Tanto a la programacin en lenguaje de mquina como a la programacin en assembler la


denominamos de bajo nivel ya que cada lnea o sentencia del programa se corresponde con una
instruccin de mquina.

Lenguajes de alto nivel:

Son lenguajes simblicos mucho ms avanzados o evolucionados respecto de un ensamblador, en el


sentido en que se aproximan ms al lenguaje hablado convencionalmente y son fciles de interpretar
por el usuario. Los programas as redactados tambin reciben la denominacin de programas fuente
o mdulos fuente y antes de ejecutarlos es necesario traducirlos a lenguaje de mquina. Al programa
encargado de realizar esta traduccin se le denomina compilador y a diferencia de la programacin
en assembler o de bajo nivel la traduccin de cada instruccin o sentencia del programa fuente de un
lenguaje de alto nivel resulta en la generacin de una gran cantidad de instrucciones en lenguaje de
mquina.

Finalidad del uso de la programacin en bajo nivel (lenguaje de mquina o Assembler):

Si bien el uso del lenguaje ensamblador posee ciertas desventajas en relacin a los lenguajes de alto
nivel (ver apuntes de ctedra), la utilizacin de assembler permite al usuario el acceso a la totalidad
del hardware de la computadora y un aprovechamiento ms eficiente de todas las prestaciones de la
computadora.

Algunas ventajas del ensamblador a este respecto son:

Puede lograrse un mdulo objeto ms veloz.

Utilizacin ms eficaz del espacio en memoria.

En algunos casos se puede lograr cierta independencia del sistema operativo.

En base a estas ventajas podemos, entre otras, mencionar algunas aplicaciones:

Algunas falencias de un lenguaje determinado pueden ser fcilmente superadas por el usuario
recurriendo a subrutinas (subprogramas o rutinas) en lenguaje assembler accesibles desde un
programa escrito en otro lenguaje.

Para ciertos tipos de aplicaciones con necesidades especializadas y para preparar programas de
sistemas se prefiere ms a menudo el lenguaje assembler. Esto se debe mayormente, como ya se ha
dicho, a las caractersticas de estos lenguajes que permiten que los programadores tengan un
aprovechamiento ms completo y eficiente de la computadora.
5

EJERCICIOS:

Ejercicio 1: (Resuelto)
Realizar la suma de dos nmeros de 8 bits. Los nmeros se encuentran almacenados
consecutivamente en memoria a partir de la celda de memoria de direccin 02A1h y el resultado se
almacenar en la celda contigua a los sumandos. Cargar el programa objeto a partir de la celda de
memoria de direccin 0505h.
Resolveremos este simple problema presentando tres soluciones alternativas que muestran distintas
formas de acceder a los datos almacenados en memoria (distintos modos de direccionamiento). La
siguiente figura muestra la estructura de los datos en memoria y la ubicacin en memoria del
programa objeto correspondiente a la solucin alternativa a).

Solucin a)

ORG 0505h ;carga el programa a partir de la direccin de memoria 0505h

LD A, (02A1h) ;carga el acumulador con el sumando 1

LD B, A ;B <-- A, carga el registro B con el sumando 2

LD A, (02A2h) ;carga el acumulador con el sumando 2

ADD A, B ;A <-- A+B, realiza la suma de los datos y almacena el resultado en


acumulador

LD (02A3h), A ;almacena el resultado en la celda de memoria de direccin 02A3h


6

Solucin b)

ORG 064F

LD HL, 02A1h ;carga el par registro HL con la direccin de memoria

;donde se encuentra el sumando 1 (HL apunta a sumando 1)

LD A,(HL) ;carga en A el contenido de la celda de memoria cuya

;direccin est apuntada por HL (carga en A el sumando 1)

INC HL ;incremento en 1 el contenido de HL (HL apunta a sumando2)

ADD A, (HL) ;suma el contenido de A (sumando 1) con el contenido

;de la celda de memoria apuntada por HL (sumando2).

;El resultado queda almacenado en A.

INC HL ;HL apunta a la celda de memoria de direccin 02A3h

;donde se debe almacenar el resultado de la suma

LD (HL), A ;almacena el resultado en la celda de memoria apuntada por HL

Solucin c)

ORG 02A5h

LD IX, 02A1h ;carga el registro ndice IX con la direccin de

;memoria donde se encuentra el sumando 1

LD A,(IX+00) ;carga en A el sumando 1 (IX+0 apunta a la celda de memoria que

;contiene el sumando 1)

ADD A,(IX+01) ;suma el contenido de A (sumando 1) con el sumando 2

;(IX+01) apunta a la celda de memoria sumando 2). El resultado

;queda en A

LD (IX+02), A ; almacena el resultado en la celda de memoria ubicada

; 2 bytes ms abajo que la posicin sealada por IX+00.

;(02A3h)  A
7

029Eh (recordar que el desplazamiento en


029Fh IX+FEh el modo indexado es un nmero de
02A0h IX+FFh 8 bits expresado en complemento a
02A1h SUMANDO 1 IX+00h dos)
02A2h SUMANDO 2 IX+01h
02A3H RESULTADO IX+02h
02A4h IX+03h
02A5h DDh
02A6h 21h
02A7h A1h LD IX,02A1
02A8h 02h
: :

A continuacin se presenta el listado del programa fuente correspondiente a la solucin a) con el


agregado de algunas instrucciones o directivas de ensamble junto con el listado del programa objeto
(salida del programa ensamblador) escrito en hexadecimal.

Ejercicio 2:
Desarrollar una secuencia de instrucciones para sumar los contenidos de los registros A, B, C y D.
Almacenar el resultado en el registro D.
8

Ejercicio 3:
En memoria se encuentran almacenados 150 datos de 1 byte a partir de la celda de memoria de
direccin C54Fh. Trasladar esta tabla de datos al bloque de memoria que comienza en la direccin
0400h.

Ejercicio 4:
Sobre un conjunto de 15 valores numricos de 8 bits almacenados consecutivamente en memoria a
partir de la direccin etiquetada como DATOS, contar los negativos. Guardar el conteo obtenido en la
celda de memoria anterior al inicio de la tabla de datos y cargar el programa a partir de la direccin
de memoria FFF5h.

Ejercicio 5 (Resuelto):
Realizar la suma de dos nmeros de 3 bytes (a23, a22, . . . a1, a0) y (b23, b22, . . . b1, b0) que se
encuentran almacenados en distintos lugares de memoria, uno a partir de la direccin 0300h y el
otro a partir de la direccin 3FF0h. Almacenar el resultado en memoria a partir de la direccin 4731h.

Tener en cuenta que la suma de los bytes menos significativos (a0... a7) y (b0 ... b7) debe realizarse
sin acarreo (con una instruccin ADD o bien con una ADC habiendo colocado previamente el bit de
acarreo del registro de estado a cero, C=0) y los bytes restantes se deben sumar con acarreo, es
decir, con una instruccin ADC.
9

Solucin alternativa 1)

Usando direccionarniento indexado para acceder a los sumandos

Solucin alternativa 2)

Recorrer tres veces un lazo que efecte una suma de 8 bits, incrementando los punteros en cada
pasada.

Ejercicio 6:
A partir de la direccin de memoria 54F2h se encuentran almacenados 50 nmeros de 1 byte.
Realizar la sumatoria de esos nmeros y verificar si se produce overflow al calcularla, de ser as
guardar el resultado de la ltima suma calculada sin overflow al final de la tabla de datos e indicar
esa situacin cargando el cdigo 01h en la prxima celda de memoria; caso contrario cargar en esas
celdas el resultado de la sumatoria y el cdigo 00h respectivamente. Cargar el programa objeto a
partir de la direccin de memoria 0450h.

Ejercicio 7:
Realizar la sumatoria de los nmeros negativos y el conteo de los nmeros positivos e iguales a cero
de una tabla de 18 datos numricos de 1 byte almacenados en memoria a partir de la direccin
10

4FFFh. Guardar los resultados de la sumatoria y el conteo a partir de las celdas de memoria ubicadas
10 lugares por encima de la tabla de datos y cargar el programa a partir de la direccin 0BFFh.

Ejercicio 8:
Sobre un conjunto de 25 nmeros de 8 bits almacenados en memoria en forma consecutiva a partir
de la direccin 53F0h, realizar la sumatoria de los que se encuentran en el intervalo abierto (30,40).
Almacenar el resultado en la celda de memoria ubicada 15 lugares por debajo de la tabla de datos y
cargar el programa a partir de la direccin 045Ch.

Ejercicio 9:
Dados 30 nmeros de 1 byte almacenados en memoria a partir de la direccin etiquetada NROS,
contar cuntos se encuentran dentro del intervalo cerrado [50, 100]. Guardar el resultado en la celda
de memoria cuya direccin est etiquetada como CONTEO y cargar el programa a partir de la
direccin C5FFh.

Ejercicio 10:
Trasladar la tabla de datos de 8 bits almacenada en memoria a partir de la direccin etiquetada como
TABLA 1 y con marca de final de tabla FFh (FFh es un cdigo de 1 byte que aparece slo una vez
cargado en la celda de memoria siguiente al ltimo dato de la tabla) al bloque de memoria que
comienza en la direccin etiquetada como TABLA2. Realizar el conteo de los datos transferidos y
guardar este resultado a continuacin del cdigo FFh de final de ambas tablas.

Ejercicio 11:
Calcular el promedio de una tabla de 20 datos de 8 bits almacenada en memoria a partir de la
direccin CB46h. Guardar el resultado en la celda de memoria anterior al inicio de la tabla de datos y
cargar el programa a partir de la direccin de memoria 865d.

Ejercicio 12:
En memoria se encuentra almacenada una tabla de datos numricos de 8 bits a partir de la direccin
3C5Fh y con marca de final de tabla FFh. Realizar la sumatoria de los datos y obtener la parte entera
de la divisin por 4 de dicha sumatoria. Guardar los resultados de la sumatoria y la divisin a partir
de la celda de memoria ubicada 5 lugares por debajo del final de la tabla.

Ejercicio 13:
Dada una tabla de datos de 1 byte almacenada en memoria a partir de la direccin 54F2h y con
marca de final de tabla FFh, calcular el promedio de los nmeros mayores e iguales a 6. Guardar el
resultado en la celda de memoria cuya direccin parte baja y parte alta se encuentra almacenada en
las direcciones de memoria 0400h y 0401h respectivamente.

Ejercicio 14:
Sobre un conjunto de 15 valores numricos almacenados en memoria a partir de la direccin 0D00h
en simple precisin, realizar la suma de las lo primeros y restarle a este valor la suma de los 5
ltimos. Guardar el resultado en la direccin de memoria 458d.
11

Ejercicio 15:
En memoria se encuentra almacenada una tabla con 40 datos de 1 byte con su direccin de
comienzo simbolizada por TDATOS. Procesar estos datos de la siguiente forma:

1. Cargar el contenido de la direccin de memoria anterior al inicio de la tabla en el registro D.

2. Para aquellos datos de la tabla que sean >=80, restarles el valor cargado en D.

3. Para los elementos <80, sumaries el contenido de D.

4. Generar una tabla cuyos datos sean los resultados obtenidos en los puntos 2) y 3) siempre que no
se haya producido desbordamiento en el resultado (overflow), caso contrario almacenar en la tabla
el valor original del dato. Simbolizar la cabeza de la tabla como TRESUL.

Ejercicio 16:
A partir de la tabla de datos del ejercicio 14, generar 2 tablas:
La primera, a partir de la direccin 0550h, con los valores positivos.
La segunda a partir de la direccin 0600h, con los valores menores e iguales a cero.
Contar cuntos datos contiene cada una de las tablas generadas y guardar los resultados en las
celdas de memoria ubicadas 7 lugares por encima del comienzo de cada tabla.

Ejercicio 17:
En memoria se encuentran almacenadas dos tablas de datos de 8 bits. La primera a partir de la
direccin 2100h con 50 datos y la segunda a partir de la direccin 0300h con marca de final de tabla
FFh. Realizar la sumatoria de los datos de la primera tabla y dividir este resultado por la cantidad de
datos de la segunda tabla. Si se produce overflow al realizar la sumatoria abandonar la ejecucin del
programa y saltar a una rutina de error que se encuentra cargada a partir de la direccin 0038h; caso
contrario guardar el resultado de la sumatoria, el conteo y al divisin a partir de la celda de memoria
cuya direccin parte baja y parte alta se encuentra almacenada respectivamente en las dos celdas de
memoria ubicadas a continuacin del cdigo de finalizacin de la segunda tabla de datos.

ENSAMBLADOR: SUBRUTINAS

Ejercicio 18: (Resuelto)

a) Convertir el programa del ejercicio 5 (solucin alternativa 2) en una subrutina parametrada tal
que sea capaz de realizar la suma de dos nmeros de ms de un byte almacenados en cualquier
lugar de la memoria.
b) Generar un programa que invoque a dicha subrutina para realizar la suma de dos nmeros de 4
bytes almacenados en memoria a partir de las direcciones 0100h y 0150h respectivamente y que
almacene el resultado a partir de la direccin 0160h.

Resolucin parte a):

Definicin de los parmetros de la subrutina:

Registro B: cantidad de bytes.

Par registro HL: direccin de la celda de memoria del primer byte de uno de los sumandos.
12

Registro ndice IX: direccin de la celda de memoria del primer byte del otro sumando.

Registro ndice IY: direccin de la celda de memoria del primer byte del resultado.

ORG 0100h ;direccin de carga e inicio del programa

SUBSUM SCF ;puesta a uno del bit de acarreo

CCF ;complementacin del bit de acarreo

;el bit de acarreo se coloca en cero para la primera pasada

OTRO LD A,(HL) ;carga en A un byte del primer sumando

ADC A,(IX+00) ;suma con acarreo de los bytes correspondientes

LD (IY+00),A ;almacena un byte del resultado en memoria

INC HL ;incremento de los registros punteros

INC IX ;para que apunten a los prximos

INC IY ;bytes ms significativos

DEC B ;decremento del registro B (descuenta una pasada)

JP NZ,OTRO ;salta a sumar los prximos bytes si B no lleg a cero

RET ;retorna a ejecutar el programa que invoca a esta subrutina


END SUBSUM

Los cambios que se han realizado para convertir el programa en una subrutina son los siguientes:

Se le ha colocado una etiqueta a la lnea del programa correspondiente a la primera instruccin a


ejecutarse en la subrutina (SUBSUM). Esta etiqueta representa la direccin de comienzo de la
subrutina y deber ser el operando de la instruccin CALL que invoca a la subrutina.

Se han omitido las instrucciones de carga de los registros que especifican la cantidad de bytes de
los nmeros a sumar y las direcciones de las celdas de memoria de los bytes menos significativos de
los sumandos y el resultado. Estas instrucciones de carga debern estar contenidas en el programa
desde el cual se invoca a la subrutina (y debern estar ubicadas antes de la instruccin CALL) de
manera que sea este programa el que especifique, antes de ser ejecutada la subrutina, la longitud
de los sumandos y la ubicacin de stos en memoria. Este cambio, si bien no es necesario, le aade
una gran flexibilidad a la forma en que puede ser utilizada la subrutina. A esta tcnica de hacer que
el programa que invoca a la subrutina especifique valores indispensables para el correcto
funcionamiento de la misma se le denomina transferencia de parmetros.

Se ha colocado una instruccin de retorno (RET) al final de la subrutina para que, una vez que se
finalice la tarea de la subrutina, se retorne a ejecutar el programa que invoc a dicha subrutina a
13

partir de la instruccin ubicada a continuacin de la CALL. Recordar que estas instrucciones CALL
son instrucciones de salto que recuerdan desde dnde se dio el salto y esto lo hacen guardando
la direccin de retorno en la memoria pila; luego, en la subrutina, la instruccin de retorno hace
que el registro PC rescate de la pila dicha direccin de retorno.

Resolucin parte b):

En el programa que invoca a la subrutina se debe realizar lo siguiente:

Cargar el registro Stack Pointer (SP) con el valor de una direccin de memoria adecuada de manera
que la expansin de la pila se produzca en una zona de memoria RAM que no contenga datos o
programas.

Especificar los parmetros de la subrutina correspondiente. Esto es, cargar los registros que
especifican la cantidad de bytes de los nmeros a sumar y las direcciones de las celdas de memoria
de los bytes menos significativos de los sumandos y el resultado.

ORG 0500h ;direccin de carga e inicio del programa

SUM32 LD SP,E4FFh ;situar el stack del sistema (direccin de comienzo de la

;memoria pila)

;carga de los parmetros de la subrutina

LD HL, 0100h ;carga de los registros HL, IX, IY que apuntan

LD IX, 0150h ;a los bytes menos significativos de los

LD IY, 0160h ;sumandos y el resultado respectivamente

LD B, 04 ;carga en B de la cantidad de bytes de los sumandos

CALL SUBSUM ;ir a ejecutar la subrutina SUBSUM

END SUM32

Por ltimo hay que tener en cuenta que si el contenido de aquellos registros que sean el resultado de
un procesamiento (como por ejemplo un conteo, una sumatoria de datos, etc.) deben ser utilizados
por el programa al regresar de la subrutina, dichos contenidos debern ser salvaguardados en
memoria antes del llamado a la subrutina; caso contrario estos resultados podran perderse si la
subrutina utiliza dichos registros. La salvaguarda de estos contenidos en memoria y su posterior
rescate se puede realizar simplemente mediante el uso de las correspondientes instrucciones de
transferencia LD o bien mediante las correspondientes instrucciones PUSH y POP que introducen y
extraen datos respectivamente de la memoria pila gestionada por el SP.

Ejercicio 19:
a) Realizar una subrutina que calcule el promedio de una determinada cantidad de nmeros de 8
bits almacenados consecutivamente en memoria. La direccin de comienzo de la subrutina
14

estar dada por la etiqueta PROM y los parmetros de la misma vendrn dados por los
contenidos de los siguientes registros:
B: cantidad de datos a ser promediados
IX: direccin de inicio de la tabla de datos a ser promediados
HL: direccin de la celda de memoria en donde se almacenar el promedio calculado.

b) Escribir un programa que invoque a dicha subrutina para que calcule el promedio de 15 datos de
8 bits que se encuentran almacenados en memoria a partir de la direccin A5F1h y que almacene
el promedio en la posicin de memoria 010Ah. A continuacin analizar el resultado y si el
promedio es menor que 4 cerear la tabla (cargar la tabla con ceros).

Ejercicio 20:
En memoria se encuentra almacenada una tabla de datos de 8 bits a partir de la direccin 540Ah con
marca de final de tabla FFh. Procesar estos datos de la siguiente forma:
a) Generar una tabla con aquellos datos que sean 70 (simbolizar la cabeza de la tabla como
TAPROB y colocarle el final de tabla FFh).
b) Contar cuntos datos tiene la tabla TAPROB y calcular el promedio de los mismos utilizando la
subrutina de promediacin realizada en el ejercicio 2.
c) Si el promedio obtenido es 80, contar cuntos datos 90 contiene la tabla generada y guardar
este resultado en la posicin de memoria etiquetada PROMOV; caso contrario guardar en
PROMOV el conteo de todos los datos de la tabla generada.

Ejercicio 21:
a) Realizar una subrutina parametrada que genere, a partir de dos tablas de datos de 8 bits
almacenadas en distintos lugares de memoria (con marcas de final de tabla FFh), una nica tabla
formada por todos los elementos de ambas y con su marca de final de tabla FFh. Definir y
especificar los parmetros de la subrutina para que la misma sea reusable.
b) Escribir un programa que invoque a dicha subrutina para que genere una tabla, a partir de la
direccin 7FFFh, con todos los valores de las tablas del ejercicio 3 (la tabla de datos y la tabla
generada como resultado del programa (TAPROB)) y que cuente la cantidad de datos generados
guardando este resultado a continuacin del cdigo o marca de final de tabla.

Ejercicio 22:
En memoria se encuentran almacenadas tres tablas de datos de 8 bits con marca de final de tabla
FFh a partir de las direcciones de memoria 1000h, 1200h y 1400h respectivamente. Realizar un
programa que, invocando a la subrutina PROM del ejercicio 19, calcule el promedio de cada una de
estas tablas y almacene los resultados a partir de la direccin 0300h. Calcular cuntos datos
contienen las tablas en conjunto y almacenar este conteo a continuacin de los promedios.

Ejercicio 23:
Realizar una subrutina para calcular el promedio de una tabla de datos 8 bits con marca de final de
tabla FFh. Los parmetros de la subrutina debern especificar la direccin de inicio de la tabla de
datos y las direcciones de almacenamiento del promedio de los datos y el conteo de los mismos
respectivamente.

Ejercicio 24:
Realizar un programa que invocando a la subrutina del ejercicio 23, resuelva lo planteado en el
ejercicio 22.

Vous aimerez peut-être aussi