Está en la página 1de 25

ESTRUCTURA Y FUNCIONAMIENTO DE

COMPUTADORAS II

UNIDAD 1: LENGUAJE DE MQUINA Y


ENSAMBLADOR. PROCESADOR Z80.

Licenciatura en Ciencias de la Computacin

Departamento de Informtica

Facultad de Ciencias Exactas, Fsicas y Naturales

Universidad Nacional de San Juan


Estructura y Funcionamiento de Computadoras II

1.1. LENGUAJE DE MAQUINA

1.1.1. Conjunto (set) de instrucciones


Si un programador utiliza un lenguaje de alto nivel, tal como Pascal o Ada, muy poco de la arquitectura
de la mquina es visible.
Un lmite donde el diseador de la computadora y el programador de sta pueden ver la misma mquina
es en el conjunto de instrucciones de la mquina. Desde el punto de vista del diseador, el conjunto de
instrucciones de la mquina proporciona los requerimientos funcionales para la CPU: la implantacin
de la CPU es una tarea que en gran parte involucra establecer el conjunto de instrucciones de la
mquina. Desde el lado de usuario, aquel que elige programar en lenguaje de mquina (o ms
probablemente en lenguaje ensamblador; como se ver ms adelante) es quien se llega a enterar de los
registros y estructura de la memoria, los tipos de datos soportados directamente por la mquina y el
funcionamiento de la ALU.
Una descripcin del conjunto de instrucciones de mquina permite explicar acabadamente la CPU de la
computadora y cada una de las operaciones que ella puede realizar.

Conjunto (Set) de Instrucciones


Una computadora slo puede reconocer, interpretar y procesar un grupo definido y limitado de rdenes,
que corresponden a las operaciones que puede realizar.
Esto se lleva a cabo a travs de la ejecucin de instrucciones, que determinan la operacin de la CPU. A
estas instrucciones se hace referencia como instrucciones de mquina o instrucciones de la
computadora. La CPU puede ejecutar una variedad de funciones y stas se reflejan en la variedad de
instrucciones definidas en ella. La coleccin de diferentes instrucciones que la CPU puede ejecutar es
referida como el conjunto, repertorio o set de instrucciones y constituye el llamado LENGUAJE DE
MAQUINA o CODIGO ABSOLUTO de esa computadora.
Cada fabricante establece el SET correspondiente a una mquina en particular, de modo que ello
constituye una caracterstica de diseo. Esa mquina est hecha para ejecutar esas instrucciones y
ninguna otra.
Por ejemplo:
SUMAR al valor actual del registro Acumulador de la CPU, un nmero entero codificado en
binario de punto fijo en 8 bits, almacenado en la memoria principal, almacenando el resultado
en el Acumulador.
SUMAR dos nmeros enteros codificados en binario de punto fijo en 16 bits, almacenados en
registros de 16 bits de la CPU, almacenando el resultado en el primero de los registros que se
indiquen como sumandos.
TRANSFERIR un nmero entero de 8 bits, almacenado en registro de la CPU, a una posicin
de almacenamiento en la memoria principal.
COMPARAR dos cantidades enteras de 8 bits ....
ETC.

Los ejemplos muestran que cada instruccin requiere que se especifique con todo detalle no slo la
operacin a realizar, sino otros datos sin los cuales no podra llevarse a cabo. Los dos primeros
ejemplos lo ilustran claramente. En ambos casos se trata de la operacin de SUMAR, pero las dos
instrucciones tienen diferencias sustanciales. Por lo tanto, dos computadoras diferentes contarn ambas
con instrucciones de SUMA, pero pueden diferir enormemente en cuanto a los distintos tipos de esta
operacin incluidos en su SET.
El nmero de instrucciones que componen el SET es distinto para distintas mquinas. Sin embargo,
existe un grupo bsico de operaciones que todas incluyen, aunque con caractersticas propias para cada
mquina.

1.1.2. Representacin de instrucciones


Dado que la representacin de la informacin dentro de la computadora es binaria, cada instruccin es
un cdigo binario que puede ser interpretado por los circuitos de la CPU.
A cada instruccin del SET le corresponde una determinada configuracin binaria, establecida por el

Lenguaje de Mquina y Ensamblador. Z80. 1


Estructura y Funcionamiento de Computadoras II

diseador, con ajuste a un formato determinado.


Por ejemplo, la siguiente configuracin corresponde a la operacin de Sumar los contenidos de los
registros R12 y R11 de la CPU, con almacenamiento del resultado en R12, en una CPU IBM S/370
0001101011001011 (Fig. 1)

y la siguiente a una instruccin de salto incondicional a la direccin 9A33 (hexadecimal) de la memoria


principal, en un microprocesador Z80
110000111001101000110011 (Fig. 2)

1.1.3. Elementos de una instruccin de mquina


Cada instruccin debe contener la informacin requerida por la CPU para su ejecucin. La figura 8.1
muestra los pasos involucrados en la ejecucin de instrucciones y, por implicacin, define los elementos
de una instruccin de mquina. Estos elementos son:
Cdigo de operacin: Especifica la operacin a ser realizada (por ejemplo, SUMAR, E/S,
TRANFERIR, ETC). La operacin est especificada por una configuracin de bits, conocido
como el cdigo de operacin u opcode, que es parte del cdigo binario de la instruccin.
Referencia del operando fuente: La operacin puede involucrar uno o ms operandos fuente,
esto es, operandos que son entradas para la operacin.
Referencia del operando resultado: La operacin puede producir un resultado.
Referencia de la siguiente instruccin: sta le dice a la CPU dnde buscar la siguiente
instruccin despus de que la ejecucin de esta instruccin se haya completado.

La siguiente instruccin a ser buscada se localiza en la memoria principal o, en el caso de un sistema de


memoria virtual, en la memoria principal o en la memoria secundaria (disco). En la mayora de los
casos, la siguiente instruccin a ser buscada sigue de inmediato a la instruccin actual. En esos casos,
no hay referencia explcita a la siguiente instruccin. Cuando es necesaria una referencia explcita,
entonces se debe suministrar la direccin de la memoria principal o virtual.

Los operandos fuente y resultado pueden estar en una de tres reas:


Memoria: En este caso, la instruccin debe suministrar las correspondientes direcciones.
Registro de la CPU: Con raras excepciones, una CPU contiene uno o ms registros que pueden
ser referenciados mediante instrucciones de mquina. Si slo existe un registro, la referencia a
l puede ser implcita. Si existe ms de un registro, entonces a cada registro se le asigna un
nmero nico y la instruccin debe contener el nmero del registro deseado.
Dispositivo de E-S: La instruccin debe especificar el mdulo de E-S y el dispositivo para la
operacin. Si se utiliza E-S mapeada a memoria, sta es otra direccin de la memoria principal
o virtual.

1.1.4. Formato de instrucciones


Una instruccin se divide en campos, en correspondencia a los elementos constituyentes de la
instruccin. Esto se conoce como el formato de instruccin.
El formato de las instrucciones constituye una caracterstica de diseo fijada por el fabricante, que
Lenguaje de Mquina y Ensamblador. Z80. 2
Estructura y Funcionamiento de Computadoras II

guarda estrecha relacin con las caractersticas fsicas (estructura, organizacin) del procesador.
Esquemticamente, podemos representarlo de la siguiente manera:

4 6 6
Cdigo de Referencia del Referencia del
operacin operando operando
16 bits

En el esquema, el cdigo de operacin ocupa los primeros 4 bits del formato.


Es comn que el cdigo de operacin ocupe los ocho primeros bits (primer byte u octeto) de la
instruccin. Dado que 8 bits permiten 28 combinaciones distintas, es posible disponer, en este caso, de
hasta 256 instrucciones. Si el SET de instrucciones contuviera un nmero mayor de ellas, debera
entonces destinarse un nmero mayor de bits para el cdigo de operacin.
La extensin del campo o zona de referencia de operandos depende del tipo de operacin y de
caractersticas de la mquina. Por ejemplo, en el caso de la Fig. 2, el operando es la direccin del salto
(bifurcacin). Como en el microprocesador Z80 las direcciones son informaciones de 16 bits, la
extensin del campo de operando ser de 16 bits. Sin embargo, una mquina con una estructura de
direcciones de mayor capacidad requerir, para una operacin idntica, un campo de mayor extensin
para el operando.
Por otro lado, en una misma mquina, distintas instrucciones tendrn distintas extensiones del campo de
operandos. Por ejemplo, en el Z80 la siguiente instruccin corresponde a la suma de una constante de 8
bits (el nmero decimal 25), al registro acumulador de la UAL:
1100011000011001 (Fig. 3)

Esta instruccin consta de slo un octeto en el campo de operando, empleado para representar la
constante de 8 bits, tal como est definido en la operacin.
Existen, incluso, instrucciones que no contienen campo de operandos, o sea que solamente constan del
cdigo de operacin. La siguiente instruccin, por ejemplo, opera la inversa booleana (NOT) sobre el
contenido del registro acumulador, en un Z80:
00101111 (Fig. 4)

Como esta operacin, dentro del set o repertorio, est definida exclusivamente para el acumulador, no
es necesario consignar el operando (el acumulador) explcitamente. Es, entonces, una instruccin con
operando implcito.
Otros casos en que la instruccin no especifica operando corresponden a ciertas operaciones de control
(operaciones de pausa, detencin, etc).
En sntesis, el formato de las instrucciones y el cdigo de operacin son asignados por el fabricante al
disear la computadora. Distintas CPU tienen, en general, distintos formatos de instrucciones y en la
mayora de los casos, para una misma CPU el conjunto de instrucciones utiliza ms de un formato. La
CPU debe estar habilitada para extraer los datos de los varios campos de instruccin a fin de realizar la
operacin requerida.
Es importante destacar que el cdigo de operacin no slo informa a la Unidad de Control la operacin
que se va a realizar sino que brinda, adems, informacin acerca de:
El tipo de los operandos (numricos o no-numricos, el convenio de codificacin en que estn
representados: binario punto fijo, punto flotante, BCD, ASCII, EBCDIC. etc.).
La ubicacin de los datos: en un registro, en la memoria (ya sea en una ubicacin propia o bin, como
se muestra en el ejemplo de la Fig. 3, dentro de la misma instruccin)

1.1.5. Tipos de instrucciones


Considere una instruccin en lenguaje de alto nivel que podra estar expresada en un lenguaje tal como
BASIC o FORTRAN. Por ejemplo:
X=X+Y

Esta declaracin instruye a la computadora para sumar el valor almacenado en Y al valor almacenado
en X y poner el resultado en X. Cmo podra esto llevarse a cabo con instrucciones de mquina?
Vamos a suponer que las variables X y Y corresponden a las localidades 513 y 514. Si suponemos un

Lenguaje de Mquina y Ensamblador. Z80. 3


Estructura y Funcionamiento de Computadoras II

conjunto de instrucciones de mquina simple, esta operacin podra llevarse a cabo con tres
instrucciones:
1. Cargar un registro con el contenido de la localidad 513 de memoria.
2. Sumar el contenido de la localidad 514 de memoria al registro.
3. Almacenar el contenido del registro en la localidad 513 de memoria.

Como se puede ver, la simple instruccin de BASIC puede requerir tres instrucciones de la mquina.
Esto es tpico de la relacin entre un lenguaje de alto nivel y un lenguaje de mquina. Un lenguaje de
alto nivel expresa las operaciones en una forma algebraica concisa, usando variables. Un lenguaje de
mquina expresa las operaciones en una forma bsica e involucra el movimiento de datos hacia o desde
registros.
Con este ejemplo simple como gua, vamos a considerar los tipos de instrucciones que deben estar
incluidos en una computadora prctica. Una computadora debe tener un conjunto de instrucciones que
le permitan al usuario formular cualquier mecanismo de procesamiento de datos. Otra manera de ver
esto es considerar las capacidades de un lenguaje de programacin de alto nivel. Cualquier programa
escrito en un lenguaje de alto nivel se debe convertir a un lenguaje de mquina para poder ser ejecutado.
Por consiguiente, el conjunto de instrucciones de la mquina tiene que ser suficiente para poder
expresar cualquiera de las instrucciones desde un lenguaje de alto nivel. Con esto en mente, podemos
categorizar los tipos de instrucciones como sigue:
Procesamiento de datos: Instrucciones aritmticas y lgicas.
Almacenamiento de datos: Instrucciones de memoria.
Movimiento de datos: Instrucciones de E-S.
Control: Instrucciones de prueba y bifurcacin.

Las instrucciones aritmticas proporcionan capacidades computacionales para el procesamiento de


datos numricos. Las instrucciones lgicas (Booleanas) operan sobre los bits de una palabra como bits
en vez de como nmeros; de esta manera, proporcionan capacidades para el procesamiento de cualquier
otro tipo de datos que el usuario pueda desear emplear. Estas operaciones se ejecutan, principalmente,
sobre datos en los registros de la CPU. Por consiguiente, deben existir instrucciones de memoria para
mover datos entre la memoria y los registros. Las instrucciones de E-S son necesarias para transferir
programas y datos a la memoria y que los resultados de clculos regresen al usuario. Las instrucciones
de prueba se emplean para verificar el valor de una palabra de datos o el estado de un clculo. Las
instrucciones de bifurcacin se usan entonces para saltar a un conjunto diferente de instrucciones
dependiendo de la decisin hecha.

1.1.6. Nmero de direcciones


Una de las maneras tradicionales de describir la arquitectura del procesador es en trminos del nmero
de direcciones contenidas en cada instruccin. Esta dimensin se ha vuelto menos significativa con el
incremento de la complejidad del diseo de la CPU. No obstante, es til este punto para traer y analizar
tal distincin.
Cul es el nmero mximo de direcciones que se podra necesitar en una instruccin? Es evidente que
las instrucciones lgicas y aritmticas requerirn la mayora de los operandos. De hecho, casi todas las
operaciones lgicas y aritmticas son unitarias (un operando) o binarias (dos operandos). Por lo tanto,
necesitaramos un mximo de dos direcciones para hacer referencia a los operandos. El resultado de una
operacin se debe almacenar, sugiriendo una tercera direccin. Por ltimo, una vez que se ha finalizado
una instruccin, la siguiente instruccin se debe buscar, y se requiere tambin su direccin.
La lnea de razonamiento de arriba sugiere que una instruccin podra, con cierta razn, ser requerida
para contener cuatro referencias de direccin: dos operandos, un resultado y la direccin de la siguiente
instruccin. En la prctica, las instrucciones de cuatro direcciones son en extremo raras. La mayora de
las CPUs es de la variedad de una, dos o tres direcciones, con la direccin de la siguiente instruccin
implcita (obtenida del contador del programa).
En la figura 8.3 se comparan las instrucciones tpicas de una, dos, y tres direcciones que se podran usar
para calcular Y = (A - B) / (C + D * E). Con tres direcciones, cada instruccin especifica localidades de
dos operandos y una localidad de resultado. Dado que nos gustara no alterar el valor de cualquiera de
las localidades de los operandos, una localidad temporal, T, se usa para almacenar algunos resultados
intermedios. Observe que existen cuatro instrucciones y que la expresin original tuvo cinco operandos.

Lenguaje de Mquina y Ensamblador. Z80. 4


Estructura y Funcionamiento de Computadoras II

Cada instruccin se muestra en forma esquemtica indicando la operacin que lleva a cabo cada una.

Y AB
T D*E Tres direcciones
T T+C
Y Y/T

Y A
Y YB
T D Dos direcciones
T T*E
T T+C
Y Y/T

AC D
AC AC * E
AC AC + C
Y AC Una direccin
AC A
AC AC B
AC AC / Y
Y AC

Los formatos de instruccin de tres direcciones no son comunes debido a que requieren un formato de
instruccin relativamente largo para almacenar las referencias de tres direcciones. Con las instrucciones
de dos direcciones, nuestro programa de muestra se expande a seis instrucciones.
Ms simple es la instruccin de una direccin. Para que esto funcione, una segunda direccin debe ser
implcita. Esto era comn en las primeras mquinas, donde la direccin implcita era un registro de la
CPU conocido como el acumulador (AC o A). El acumulador contiene uno de los operandos y se utiliza
para almacenar el resultado. En nuestro ejemplo, son necesarias ocho instrucciones para llevar a cabo el
procedimiento.
El nmero de direcciones por instruccin es una decisin bsica de diseo. Pocas direcciones por
instruccin devienen en instrucciones ms primitivas, lo cual requiere una CPU menos compleja. Esto
tambin deriva en instrucciones de longitud ms corta. Por otra parte, los programas contienen ms
instrucciones totales, lo cual resulta, en general, en tiempos de ejecucin ms largos y programas ms
complejos y largos. Tambin, existe un umbral importante entre las instrucciones de una direccin y las
de mltiples direcciones. Con las instrucciones de una direccin, el programador casi siempre tiene
disponible slo un registro de propsito general, el acumulador. Con las instrucciones de mltiples
direcciones, es comn tener mltiples registros de propsito general. Esto permite que algunas
operaciones se lleven a cabo de manera exclusiva en los registros. Ya que las referencias de registro son
ms rpidas que las referencias de memoria, esto acelera la ejecucin. Por razones de flexibilidad y
habilidad para utilizar mltiples registros, la mayora de las mquinas contemporneas emplea una
mezcla de instrucciones de dos y tres direcciones.
Los compromisos de diseo involucrados en escoger el nmero de direcciones por instruccin se
complican por otros factores. Existe el problema de si una direccin hace referencia a una localidad de
memoria o a un registro. Puesto que existen pocos registros, se necesitan pocos bits para una referencia
de registro. Tambin, como veremos en el siguiente captulo, una mquina puede ofrecer una variedad
de modos de direccionamiento y la especificacin de los modos toma uno o ms bits. El resultado es
que la mayora de los diseos de la CPU involucra una variedad de formatos de instruccin.

1.1.7. Diseo del conjunto de instrucciones


Uno de los aspectos ms interesantes, y ms analizados, del diseo de computadoras es el diseo del
conjunto de instrucciones. El diseo de un conjunto de instrucciones es muy complejo, ya que afecta
muchos de los aspectos del sistema computacional. El conjunto de instrucciones define muchas de las

Lenguaje de Mquina y Ensamblador. Z80. 5


Estructura y Funcionamiento de Computadoras II

funciones llevadas a cabo por la CPU y, por consiguiente, tiene un efecto significante en la
implantacin de sta. El conjunto de instrucciones es el medio del programador para controlar la CPU.
Por lo tanto, los requerimientos del programador deben ser considerados en el diseo del conjunto de
instrucciones.
Puede sorprenderle saber que algunos de los temas ms fundamentales relacionados con el diseo del
conjunto de instrucciones permanecen en disputa. En realidad, en aos recientes, el nivel de desacuerdo
concerniente a estos fundamentos ha crecido. Los ms importantes de tales temas de diseo
fundamentales incluyen:
Repertorio de operaciones: Cuntas y cules operaciones proporcionar, y cmo deberan ser las
operaciones complejas.
Tipos de datos: Los varios tipos de datos sobre los cuales las operaciones se realizan.
Formato de las instrucciones: Longitud de la instruccin (en bits), nmero de direcciones,
tamao de varios campos, etc.
Registros: Nmero de registros de la CPU que se pueden referenciar mediante instrucciones, y
su uso.
Direccionamiento: El modo o modos por el cual la direccin de un operando se especifica.

Estos temas presentan alta interrelacin y se deben considerar en el diseo de un conjunto de


instrucciones.

1.1.8. Tipos de operandos


Las instrucciones de mquina operan sobre los datos. Las categoras generales ms importantes de datos
son: direcciones, nmeros, caracteres y datos lgicos.

Direcciones
Las direcciones son, de hecho, una forma de datos. En muchos casos, algn clculo se debe ejecutar
sobre la referencia de operando en una instruccin para determinar la direccin de la memoria principal
o virtual. En este contexto, las direcciones se pueden considerar como enteros sin signo.
Otros tipos comunes de datos son los nmeros, caracteres y datos lgicos, y cada uno de stos se
analiza, de manera breve, en esta seccin. Ms all de eso, algunas mquinas definen tipos de datos o
estructuras de datos especializados. Por ejemplo, existen operadores de mquina que operan en forma
directa sobre una lista o un conjunto de caracteres.

Nmeros
Todos los lenguajes de mquina incluyen tipos de datos numricos. Incluso en el procesamiento de
datos no numricos, hay una necesidad de los nmeros para que acten como contadores, anchuras de
campo, y cosas por el estilo. Una distincin importante entre los nmeros utilizados en la matemtica
ordinaria y los nmeros almacenados en una computadora es que estos ltimos estn limitados. Esto es
cierto en dos sentidos. Primero, existe un lmite para la magnitud de los nmeros representables en una
mquina y, segundo, en el caso de los nmeros de punto flotante, hay un lmite para su precisin.
Siendo as, el programador tiene que vrselas con la comprensin de las consecuencias del redondeo,
desbordamiento positivo (overflow) y desbordamiento negativo (underflow).
En las computadoras, son tres los tipos de datos numricos comunes (ya conocidos por el alumno de
esta asignatura):
Enteros o de punto fijo.
Punto flotante.
Decimales (codificados en binario: BCD, ASCII, EBCDIC, empaquetados (packed) o
desempaquetados (unpacked))

Caracteres
Una forma comn de datos es el texto o cadena de caracteres. Mientras que los datos textuales son los
ms convenientes para la comprensin humana, no pueden en forma de caracteres, almacenarse o
transmitirse con facilidad mediante sistemas de procesamiento de datos y de comunicaciones. Tales
sistemas estn diseados para los datos binarios. Por lo tanto, se ha ideado un nmero de cdigos
mediante el cual los caracteres se representan por una secuencia de bits. Quiz el primer ejemplo ms

Lenguaje de Mquina y Ensamblador. Z80. 6


Estructura y Funcionamiento de Computadoras II

comn de esto es el cdigo Morse. En la actualidad, el cdigo de caracteres de uso ms comn en


Estados Unidos es el cdigo ASCII (American - Standard Code for Information Interchange), vase la
tabla 5. 1, promulgado por el American National Standards Institute (ANSI). ASCII tambin se utiliza
en gran medida fuera de Estados Unidos.
Otro cdigo utilizado para codificar caracteres es el Extended Binary Coded Decimal Interchange Code
(EBCDIC). ste se emplea en las mquinas IBM S/370.

Datos lgicos
Por lo general, cada palabra u otra unidad direccionable (byte, media palabra, etc.) se trata como una
unidad de datos simple. Algunas veces es til, sin embargo, considerar una unidad de n bits como
consistiendo de n elementos de datos de 1 bit, cada elemento debe tener el valor de 0 o 1. Cuando los
datos se ven de esta manera, se consideran como datos lgicos.
Existen dos ventajas del esquema orientado a bits. Primero, algunas veces podemos desear almacenar
un arreglo de elementos de datos binarios o Booleanos, en los cuales cada elemento puede tomar slo
los valores 1 (cierto) y 0 (falso). Con los datos lgicos, la memoria se puede utilizar de manera ms
eficiente para este almacenamiento. Segundo, hay ocasiones en que deseamos manipular los bits de un
elemento de datos. Por ejemplo, si las operaciones de punto flotante se implementan en software,
necesitamos estar habilitados para recorrer los bits significativos en algunas operaciones. Otro ejemplo:
para convertir de ASCII en decimal empaquetado, necesitamos extraer los 4 bits de ms a la derecha de
cada byte.
Observe que, en los ejemplos anteriores, los mismos datos se tratan algunas veces como lgicos y otras
ocasiones como numricos o texto. El tipo de una unidad de datos est determinado por la operacin
que se est llevando a cabo sobre l. Mientras ste no es el caso en los lenguajes de alto nivel (por
ejemplo, Pascal), es casi siempre el caso en el lenguaje de mquina.

1.1.9. Tipos de operaciones


El nmero de diferentes cdigos de operacin vara en gran medida de mquina a mquina. Sin
embargo, los mismos tipos generales de operaciones se encuentran en todas las mquinas. Una
categorizacin tpica y til es la siguiente:
Transferencia de datos.
Aritmticas.
Lgicas.
Conversin.
E-S.
Control del sistema.
Transferencia de control.

1.1.10. Representacin simblica de las instrucciones de mquina


Es difcil tanto para el programador como para el lector de libros de texto tratar con las representaciones
binarias de las instrucciones de mquina. Por lo tanto, se ha convertido en una prctica comn el usar
una representacin simblica de las instrucciones de la mquina.
Los cdigos de operacin se representan por medio de abreviaturas, llamadas mnemnicos, que indican
la operacin. Los ejemplos comunes incluyen:
ADD Adicin (suma).
SUB Sustraccin (resta).
MPY Multiplicacin.
DIV Divisin.
LOAD Cargar datos desde la memoria.
STOR Almacenar datos en la memoria.

Los operandos tambin se pueden representar de manera simblica. Por ejemplo, la instruccin:
ADD R, Y

puede significar la suma del valor contenido en la localidad de datos Y al contenido del registro R,

Lenguaje de Mquina y Ensamblador. Z80. 7


Estructura y Funcionamiento de Computadoras II

almacenando el resultado en R. En este ejemplo, Y se refiere a la direccin de una localidad en la


memoria, y R se refiere a un registro particular. Observe que la operacin se lleva a cabo sobre el
contenido de una localidad, no sobre su direccin.
Siendo as, es posible escribir un programa en lenguaje de mquina en forma simblica. Cada cdigo de
operacin tiene una representacin binaria fija, y el programador especifica la localidad de cada
operando simblico. Por ejemplo, el programador debe comenzar con una lista de definiciones:
X = 513
Y = 514

y as en forma sucesiva. Un programa simple aceptara esta entrada simblica, convertira los cdigos
de operacin y las referencias de operandos en una forma binaria, y construira instrucciones de
mquina binarias.

1.1.11. Operaciones de transferencia de control


Para todos los tipos de operacin analizados hasta este momento, la instruccin especifica la operacin
a ser realizada y los operandos. De manera implcita, la siguiente instruccin a ser ejecutada es aquella
que sigue inmediatamente, en la memoria, a la instruccin actual. Por lo tanto, en el curso normal de
eventos, las instrucciones se ejecutan en forma consecutiva desde la memoria. La CPU tan slo
incrementa el contador del programa antes de empezar a buscar la siguiente instruccin.
Sin embargo, una fraccin significativa de las instrucciones en cualquier programa tiene como funcin
cambiar la secuencia de ejecucin de las instrucciones. Para estas instrucciones, la operacin llevada a
cabo por la CPU consiste en actualizar el contador del programa para que contenga la direccin de
alguna instruccin en la memoria.
Existe un nmero de razones de por qu las operaciones de transferencia de control son necesarias.
Entre las ms importantes estn:
1. En el uso prctico de las computadoras, es esencial habilitar la ejecucin de cada instruccin ms de
una vez y quiz muchas miles de veces. Esto puede requerir miles o quizs millones de instrucciones
para implantar una aplicacin. Esto sera impensable si cada instruccin tuviera que escribirse por
separado. Si una tabla o una lista de elementos va a ser procesada, se requiere un lazo de programa. Una
secuencia de instrucciones se ejecuta de manera repetida para procesar todos los datos.
2. Casi todos los programas involucran la toma de alguna decisin. Nos agradara que la computadora
realizara alguna accin si una condicin se cumple y otra si una condicin distinta se cumple. Por
ejemplo, una secuencia de instrucciones calcula la raz cuadrada de un nmero. Al inicio de la
secuencia, el signo del nmero se verifica. Si el nmero es negativo, el clculo no se realiza, pero se
reporta una condicin de error.
3. Componer en forma correcta un programa de computadora grande o aun de tamao medio es una
tarea difcil en exceso. Ayuda si existen mecanismos para la divisin de la tarea hasta en piezas ms
pequeas que se puedan trabajar una a la vez.

Ahora, volvamos a centrar nuestro inters en un examen detallado de las operaciones de transferencia
de control ms comunes que podernos encontrar en los conjuntos de instrucciones:
Bifurcacin.
Brinco.
Llamada a la subrutina.

Instrucciones de bifurcacin
Una instruccin de bifurcacin, tambin llamada instruccin de transferencia, tiene como uno de sus
operandos la direccin de la siguiente instruccin a ser ejecutada. Con mayor frecuencia, la instruccin
es una instruccin de bifurcacin condicional. Esto es, la bifurcacin se efecta (el contador del
programa se actualiza con la direccin especificada en el operando) slo si una cierta condicin se
cumple. De otra manera, la siguiente instruccin en secuencia se ejecuta (por lo general, el contador del
programa se incrementa).
Existen dos maneras comunes de generar la condicin a ser verificada en una instruccin de bifurcacin
condicional. Primero, la mayora de las mquinas proporcionan un cdigo de condicin de 1 bit o
mltiples bits que se establece como el resultado de algunas operaciones. Este cdigo puede ser visto
como un registro corto visible al usuario. Por ejemplo, una operacin aritmtica (SUMA, RESTA, etc.)

Lenguaje de Mquina y Ensamblador. Z80. 8


Estructura y Funcionamiento de Computadoras II

podra establecer un cdigo de condicin de 2 bits con uno de los siguientes cuatro valores: 0, positivo,
negativo, desbordamiento. En tal mquina podran existir cuatro instrucciones de bifurcacin
condicional diferentes:
BRP X Bifurcar a la localidad X si el resultado es positivo.
BRN X Bifurcar a la localidad X si el resultado es negativo.
BRZ X Bifurcar a la localidad X si el resultado es cero.
BRO X Bifurcar a la localidad X si ocurre desbordamiento (overflow).

En todos estos casos, el resultado referido se deriva de la operacin ms reciente que puso el cdigo de
condicin.
Otra propuesta que se puede utilizar con un formato de instruccin de tres direcciones es llevar a cabo
una comparacin y especificar una bifurcacin en la misma instruccin. Por ejemplo,
BRE Rl, R2, X (Bifurcar a X si el contenido de Rl = contenido de R2).

Una bifurcacin puede ser ya sea hacia adelante (una instruccin con una direccin mayor), o hacia
atrs (una direccin ms baja). Una bifurcacin incondicional y una condicional se pueden utilizar para
crear un lazo para repeticin de instrucciones.

Cdigos de condicin
Hemos mencionado que los cdigos de condicin son bits en registros especiales que pueden ser
puestos por ciertas operaciones y utilizados en instrucciones de bifurcacin condicional. Tales
condiciones estn puestas por operaciones aritmticas y de comparacin. La operacin de comparacin
en la mayora de los lenguajes resta dos operandos, como lo hace una operacin de resta. La diferencia
es que la operacin de comparacin slo pone los cdigos de condicin mientras que una operacin de
resta comn tambin almacena el resultado de la diferencia en el operando destino.
Como un ejemplo, en la tabla 8.8 se listan los cdigos de condicin utilizados en las mquinas
80386/80486.

Instrucciones de salto o brinco


Otra forma comn de instrucciones de transferencia de control es la instruccin de salto. sta incluye
una direccin implcita. Por lo comn, el brinco implica que una instruccin sea brincada; por
consiguiente, la direccin implcita es igual a la direccin de la siguiente instruccin ms una longitud
de instruccin.
Debido a que la instruccin de bifurcacin no requiere un campo de direccin destino, tiene libertad
para hacer otras cosas. Un ejemplo tpico es la instruccin de incremento-y-brinco-si-cero o bien
decremento-y-brinco-si-no-cero. Se ver un ejemplo al tratar el set de instrucciones de un procesador en
particular, ms adelante.

Lenguaje de Mquina y Ensamblador. Z80. 9


Estructura y Funcionamiento de Computadoras II

Instrucciones de llamada a subrutina


Quiz la innovacin ms importante en el desarrollo de los lenguajes de programacin es la subrutina.
Una subrutina es un programa de computadora autocontenido que est incorporado en un programa ms
grande. En cualquier punto del programa es factible invocar o llamar a la subrutina. Esto es, en ese
punto, la computadora es instruida para ir y ejecutar la subrutina entera y entonces retornar al punto
desde el cual el llamado tuvo lugar.
Las dos razones principales para el uso de subrutinas son la economa y la modularidad. Una subrutina
permite que la misma pieza de cdigo se pueda emplear en muchas ocasiones. Esto es importante para
la economa en un esfuerzo de programacin, y para hacer uso ms eficiente del espacio de
almacenamiento en el sistema (el programa se debe almacenar). Las subrutinas tambin permiten que
grandes tareas de programacin sean subdivididas en unidades ms pequeas. Este uso de la
modularidad facilita en gran medida la tarea de programacin.
El mecanismo de subrutinas involucra dos instrucciones bsicas: una instruccin de llamado que bifurca
desde la localidad presente a la subrutina, y as como una instruccin de retorno que regresa desde la
subrutina al lugar desde el cual fue llamada. Ambas son formas de instrucciones de bifurcacin.
En la figura 8.6 se ilustra el uso de subrutinas para construir un programa.
En este ejemplo, existe un programa principal que inicia en la localidad 4000. Este programa incluye un
llamado a la subrutina SUB 1, que inicia en la localidad 4500. Cuando esta instruccin de llamado se
encuentra, la CPU suspende la ejecucin del programa principal y comienza la ejecucin de SUB 1 en
busca de la siguiente instruccin de la localidad 4500. Dentro de SUB 1, existen dos llamados a SUB2
en la localidad 4800. En cada caso, la ejecucin de SUB 1 se suspende y SUB2 se ejecuta. La
instruccin RETURN ocasiona que la CPU regrese al programa donde ocurri la llamada y contine la
ejecucin en la instruccin despus de la correspondiente instruccin CALL. Este comportamiento se
muestra en la figura 8.7.

Existen varios puntos dignos de mencionar:


1. Una subrutina puede ser llamada desde ms de una localidad.
2. Un llamado de subrutina puede aparecer en una subrutina, lo cual permite el anidamiento de
subrutinas a una profundidad arbitraria.
3. Cada llamado de subrutina se aparea con un retorno en el programa llamado
Ya que nos gustara habilitar la llamada a una subrutina desde una variedad de puntos, la CPU debe
saber cmo guardar la direccin de retorno para que sta tome lugar de manera apropiada. Existen tres
lugares comunes para almacenar la direccin de retorno:
Registro.
Inicio de la subrutina.
Tope del stack.

Lenguaje de Mquina y Ensamblador. Z80. 10


Estructura y Funcionamiento de Computadoras II

1.1.12. Programacin en Lenguaje de Mquina


El lenguaje de mquina es el que realmente interpreta el hardware del computador. Est formado por el
conjunto bsico (SET) de instrucciones de mquina.
Una CPU puede entender y ejecutar slo instrucciones de mquina. Tales instrucciones tan slo son
nmeros binarios almacenados en la computadora. Si un programador desea programar de manera
directa en lenguaje de mquina, entonces sera necesario introducir el programa como datos binarios,
codificando todas las instrucciones combinando ceros y unos.
Por otra parte hay que recordar que un procesador es simplemente un dispositivo capaz de realizar un
gran nmero de tareas a una gran velocidad. Si una computadora es un buen ajedrecista no es debido a
la inteligencia del microprocesador sino a la del programador, que ha sabido dividir el problema en un
gran nmero de tareas elementales que son ejecutadas por el microprocesador. Estas tareas son,
esencialmente, clculos.
Un procesador es, por lo tanto, un individuo que puede ejecutar un cierto nmero de clculos sucesivos
rpidamente sin preocuparse en saber para qu van a servir. Esto es el problema del programador.
Veamos un ejemplo para entrar ms en detalle. Se quiere que el microprocesador calcule el importe que
queda sabiendo que tenamos $57 y hemos gastado $23. Para entregarle el problema al procesador,
deberemos descomponerlo de una manera como la siguiente:
1 ) ponga el nmero 57 en la casilla 1; 2) ponga el nmero 23 en la casilla 2; 3) tome el contenido de la
casilla 1; 4) efecte una sustraccin con el contenido de la casilla 2; 5) ponga el resultado en la casilla 3.
Ahora el procesador puede efectuar las operaciones 1, 2, 3, 4 y 5 dando el resultado 34 en la casilla 3.
Puede verse que es un procedimiento nada fcil.
Suele decirse que cuando se programa empleando el lenguaje absoluto de mquina la herramienta ms
valiosa que tiene el programador es la goma de borrar. Debe atender un enorme volumen de datos
administrativos y recordar docenas de cdigos numricos para las operaciones de la computadora,
tratando de no cometer errores cuando los usa.
Adems, tiene que llevar la cuenta del espacio de almacenamiento que usa para las instrucciones, los
datos y las reas de trabajo y hacer el clculo real de cualquier direccin que necesita para referencia en
su programa.
Considere esta sentencia simple de BASIC:
N=1+J+K

Suponga que deseamos programar esta sentencia en lenguaje de mquina e inicializar I, J, y K a 2, 3 y


4, respectivamente. Esto se muestra en la figura siguiente.

El programa inicia en la localidad 101 (hexadecimal). La memoria reservada para las cuatro variables
inicia en la localidad 201. El programa consiste de cuatro instrucciones:
1. Cargar el contenido de la localidad 201 en el AC (acumulador).
2. Sumar el contenido de la localidad 202 al del AC.
3. Sumar el contenido de la localidad 203 al del AC.
4. Almacenar el contenido del AC en la localidad 204.

Es claro que es proceso tedioso y muy propenso a errores.


Una ligera mejora es escribir el programa en notacin hexadecimal en vez de binaria
Se ilustra en la figura siguiente:

Lenguaje de Mquina y Ensamblador. Z80. 11


Estructura y Funcionamiento de Computadoras II

Se escribira el programa como una serie de lneas. Cada lnea contiene la direccin de una localidad de
la memoria y el cdigo hexadecimal del valor binario almacenado en esa localidad. Entonces,
necesitamos un programa (traductor) que acepte esta entrada, convierta cada lnea a un nmero binario
y la almacene en la localidad especificada.
Esta es slo una ligera mejora. Para hacer mucho ms, podemos hacer uso del nombre simblico o
mnemnico de cada instruccin. Vamos a emplear eso en vez del cdigo de operacin actual. Esto
resulta en el programa simblico mostrado en la figura siguiente

Cada lnea de entrada an representa una localidad de la memoria. Cada lnea consiste de tres campos,
separados por espacios. El primer campo contiene la direccin de una localidad. Para una instruccin, el
segundo campo contiene el smbolo de tres letras para el cdigo de operacin. Si es una instruccin de
referencia a la memoria, entonces un tercer campo contiene la direccin. Para almacenar los datos
arbitrarios en una localidad, inventamos una pseudoinstruccin con el smbolo DAT. Esto es tan slo
una indicacin de que el tercer campo en la lnea contiene un nmero hexadecimal para ser almacenado
en la localidad especificada en el primer campo.
Para este tipo de entrada necesitamos un programa un poco ms complejo. El programa acepta cada
lnea de entrada, genera un nmero binario basado en el segundo y tercer (si existe) campo, y lo
almacena en la localidad especificada por el primer campo.
El uso de un programa simblico hace la vida mucho ms fcil pero es an torpe. En particular,
debemos dar una direccin absoluta para cada palabra. Esto significa que el programa y los datos
pueden ser cargados nicamente en un lugar en la memoria, y debemos conocer ese lugar en cualquier
momento.
En cualquiera de estas tres variantes de la programacin en lenguaje de mquina, lo peor es que la
revisin de un programa (cosa que ocurra con mucha frecuencia, como actualmente), lo cual en general
implica agregar o borrar una o ms lneas, cambiar las direcciones de todas las palabras subsecuentes.
Todos estos detalles suponan muchos errores y demasiado tiempo dedicado a verificar, calcular, llevar
tablas y otros trabajos de tipo administrativo.

Lenguaje de Mquina y Ensamblador. Z80. 12


Estructura y Funcionamiento de Computadoras II

1.2. LENGUAJE ENSAMBLADOR O COMPAGINADOR

La consideracin de que la computadora estaba en mejores condiciones para realizar este tipo de trabajo
administrativo, llev al desarrollo de lenguajes ensambladores.
En lenguaje ensamblador, cada cdigo de operacin se escribe empleando un nemnico y el
programador puede asignar a las direcciones del almacenamiento principal nombres simblicos, tanto
para instrucciones como para datos, como FECHA, IMPORTE, TABLA, LEER, COMIENZA, CALC-
1, CALC-2 etc., comnmente denominados ETIQUETAS.
El programa del apartado anterior escrito en un lenguaje ensamblador podra ser como muestra la figura
siguiente:

Este es un sistema mucho mejor y de uso generalizado. Cada lnea an consiste de tres campos. El
primero es todava para la direccin, pero se utiliza una etiqueta en vez de una direccin numrica
absoluta. Algunas lneas no tienen direccin, lo cual implica que la direccin de esa lnea es una ms
que la direccin de la lnea anterior. Para las instrucciones con referencia a la memoria, el tercer campo
tambin presenta una direccin simblica.
En el assembler (lenguaje ensamblador) de la IBM S/370, por ejemplo, la instruccin de la (Fig 1) de la
seccion anterior se escribe:
AR 12,11 (AR: de Add Register)

En el assembler del Z80, la instruccin de la (Fig. 2) se escribe


JP LEER (JP: de JumP y LEER: etiqueta asignada por el
programador a la direccin de la instruccin
a la cual debe bifurcarse)

y la de Fig. 3:
ADD A,25

Sin embargo, como ya se dijo, la computadora no puede interpretar otro lenguaje que el propio de
mquina.
Por lo tanto, se requiere que los programas escritos
en ensamblador sean traducidos al lenguaje de
mquina.
Esta tarea la realiza un programa del Software de
Base del sistema de computacin llamado
PROGRAMA ENSAMBLADOR a
COMPAGINADOR.
El mismo es tomado, cuando se requiere, de algn
lugar del almacenamiento permanente del Sistema y
se lo carga en Memoria Principal, donde se ejecuta.
Adems de traducir las instrucciones del programa
al cdigo absoluto, el COMPAGINADOR calcula
las posiciones de almacenamiento para todas las
instrucciones y asigna direcciones numricas a los
smbolos o ETIQUETAS empleados por el
programador.
La salida del COMPAGINADOR recibe el nombre
de PROGRAMA OBJETO, producido a partir del

Lenguaje de Mquina y Ensamblador. Z80. 13


Estructura y Funcionamiento de Computadoras II

PROGRAMA FUENTE escrito el lenguaje simblico (ASSEMBLER).


Obviamente, se trata del mismo programa en el que slo ha cambiado la codificacin.
El ensamblador no slo debe hacer la conversin de los nemonicos de los opcode a binario, sino que
tambin debe asignar de alguna forma direcciones de memoria numricas a las direcciones simblicas.
El desarrollo de un lenguaje ensamblador fue un paso esencial en la evolucin de la tecnologa de las
computadoras. Fue el primer paso para los lenguajes de alto nivel que se emplean en la actualidad.
Aunque pocos programadores utilizan el lenguaje ensamblador, virtualmente todas las mquinas
suministran uno. Ms adelante, en este mismo apartado, analizaremos algunos de los usos que ha tenido
y que eventualmente tiene este lenguaje.

1.2.1. Particularidades de la programacin en Lenguaje Ensamblador


Como puede imaginarse, el uso del lenguaje ensamblador posee ciertas desventajas en relacin a los
lenguajes de alto nivel con que estamos acostumbrados a trabajar. Estos lenguajes se orientan ms hacia
el problema que hacia la mquina. Sus expresiones se asemejan mucho al idioma (Ingls) o a las
notaciones matemticas. Presentan las ventajas de permitirle al programador concentrarse en lo que
quiere hacer y no en como deber hacerlo la computadora y puede ahorrar mucho tiempo de
programacin, modificacin y prueba de programas.
Los programas en lenguaje ensamblador son difciles de leer y poner a punto (depuracin), no son
adaptables a cualquier computador, sino que su empleo est limitado a la CPU para la cual fueron
desarrollados; la cantidad de instrucciones que se manejan es varias veces superior a la de sentencias de
cualquier lenguaje de alto nivel; una simple operacin aritmtica en lenguaje ensamblador puede
requerir de varias decenas de instrucciones, por lo que los clculos matemticos complejos suelen
presentar serias dificultades de realizacin.
Sin embargo, la utilizacin del lenguaje Assembler, permite al usuario el acceso a la totalidad del
hardware de la computadora y un mejor aprovechamiento del mismo, es decir, le permite al
programador usar todas las funciones de mquina del sistema, como si estuviera codificando en
lenguaje de mquina.
De todos los lenguajes de programacin, es el ms cercano al lenguaje de mquina, en forma y
contenido.
Bsicamente las ventajas del lenguaje ensamblador son las siguientes:
En algunos casos puede lograrse un m6dulo ejecutable ms veloz que uno obtenido a partir de
un lenguaje de alto nivel.
Utilizacin ms eficaz del espacio en memoria.
En algunos casos se puede lograr cierta independencia del Sistema Operativo.
Por otra parte, los lenguajes de alto nivel presentan ciertas limitaciones en cuanto a las posibles
realizaciones a llevar a cabo con ellos presentando cada uno caractersticas que los hacen muy aptos
para algunos fines e inservibles para otros.
As, existen lenguajes de aplicacin cientfica, administrativa, educativa, en el control de procesos de
tiempo real, en manejo de sistemas (administrativos, bases de datos, telefnicos, industriales, etc.)
La eleccin de un lenguaje de programacin en cualquier situacin dada, importa por lo general
ponderar el costo del tiempo de programacin con respecto al costo del tiempo de mquina. Un
problema matemtico complejo que puede pasarse en unos pocos minutos y que slo se pasar una vez,
representa una situacin muy diferente a la de un programa que se pasa durante varias horas y que se
repetir todas las semanas.
Hay, a menudo, muchas formas de llegar a los mismos resultados de procesamiento de datos. Algunas
veces, las necesidades generales de una instalacin de computadora van ms all de su capacidad. Si
surge el problema particular de espacio de almacenamiento principal insuficiente o de tiempo de
procesamiento insuficiente, el problema puede resolverse por medio del lenguaje Assembler. En una
situacin como la indicada, la flexibilidad de este lenguaje le permite al programador escoger aquellas
tcnicas de programacin que aportarn precisamente la clase de economa que se requiera: tiempo o
espacio.
Estas consideraciones tenan plena vigencia en los primeros tiempos de la computacin, cuando el
Assembler era un lenguaje de eleccin para el desarrollo de programas de aplicacin e ilustra acerca de
las ventajas que poda significar su uso frente a lenguajes de alto nivel de la poca (Fortran, Cobol).
Hoy en da, sin embargo, nadie usa Assembler para construir aplicaciones, bsicamente porque las
razones tecnolgicas que lo justificaban han sido superadas (limitaciones de espacio de memoria,

Lenguaje de Mquina y Ensamblador. Z80. 14


Estructura y Funcionamiento de Computadoras II

velocidad de ejecucin, etc.). Su uso ha quedado limitado a la construccin de componentes del


software de base (sistemas operativos, compiladores, rutinas de E/S, etc.) o subrutinas que realizan
funciones que no pueden ser codificadas en el lenguaje de alto nivel que se este empleando. Por
ejemplo, con el lenguaje Assembler se puede realizar cierta manipulacin de la informacin,
programando a nivel de bit, imposible en otros lenguajes. Esto se debe a la particularidad, ya apuntada,
de ser el nico lenguaje que permite acceder a todas las funciones de la CPU.

1.2.2. Elementos del Lenguaje Ensamblador


Cualquier lenguaje ensamblador esta constituido por tres tipos de instrucciones:
Instrucciones de mquina.
Instrucciones de ensamble.
Macro-instrucciones y macro-definiciones.

Instrucciones de mquina
Una instruccin de mquina es una representacin simblica de una instruccin del lenguaje de
mquina (cdigo absoluto) del set de instrucciones del computador al cual pertenece el lenguaje.
Se llama "instruccin de mquina" por que el programa ensamblador la traduce en el cdigo en lenguaje
de mquina de la instruccin correspondiente del computador.

Instrucciones de ensamble
Son las que requiere el programa ensamblador para efectuar ciertas operaciones durante el proceso de
ensamble de un mdulo fuente, por ejemplo: definicin de datos constantes, definicin de fin de un
mdulo fuente, reserva de reas de memoria. Excepto para las instrucciones que definen constantes, el
ensamblador no traduce las instrucciones de ensamble en cdigo objeto.

Macro-instrucciones y macro-definiciones
Una macro-instruccin es una orden, para el programa ensamblador de "procesar" una secuencia
predefinida de cdigos, llamada macro-definicin.
De acuerdo a esta definicin, el ensamblador inserta un grupo de cdigos o instrucciones de mquina,
identificados como una macro-definicin a travs de un par de instrucciones de ensamble, en el punto
del programa fuente en el cual se halla una macro-instruccin.
Las macro-definiciones son identificables a travs de un nombre, que se usa como argumento en las
macro-instrucciones que la acceden.
El proceso de insercin de macro-definiciones se muestra grfica mente a continuacin:

Se puede acceder a una secuencia determinada de instrucciones la macro-definicin, por el uso de una
macro-instruccin o macro-llamada.
El programa ensamblador reemplaza la macro-llamada por las instrucciones de la macro-definicin.,
insertndola en el punto de llamada. El proceso de insercin de una macro-definicin en un programa
fuente se denomina macro-generacin o macro-expansin.
Puede considerarse el proceso de ensamble de un mdulo fuente, separado en dos tiempos:

Lenguaje de Mquina y Ensamblador. Z80. 15


Estructura y Funcionamiento de Computadoras II

Tiempo de preensamble: es el tiempo en que el programa ensamblador expande el mdulo fuente.


Tiempo de ensamble (propiamente dicho): es el tiempo en el cual el ensamblador traduce el programa
fuente a lenguaje de mquina (mdulo objeto).
Otra caracterstica de las macro-definiciones es que los argumentos de las instrucciones pueden
modificarse en el momento de la expansin. Para esto se suministran cdigos de caracteres
considerados como operandos en la macro-llamada. Estos reemplazan parmetros que modifican las
instrucciones expandidas.

Tambin puede seleccionarse una secuencia determinada de instrucciones pertenecientes a una macro-
definicin:

Lenguaje de Mquina y Ensamblador. Z80. 16


Estructura y Funcionamiento de Computadoras II

1.3. EL MICROPROCESADOR Z80

Es un procesador que apareci en el mercado en 1976. Es similar al Intel 8080 pero notablemente
mejorado. El Z80 fue tambin uno de los microprocesadores ms populares y ms empleados sobre todo
a nivel de microcomputadores personales y domsticos.

1.3.1. Caractersticas y conexiones


Caractersticas del Z80:
Como detalle de su integracin diremos que sobre una pastilla monoltica (chip) estn
integrados unos ocho mil transistores, del orden de 4500 ms que su antecesor el uP 8080.
Fue diseado por la firma ZILOG, habiendo sido fabricado tambin por: SGS, MOSTEK, NEC
y SHARP.
Es un uP de ocho bits en el bus de datos y de 16 en el bus de direcciones, que le permiten
alcanzar 64 Kbytes de espacio de memoria.
Admite una seal de clock de 2,5 MHz. La versin Z80-A alcanza los 4 MHz.
El nmero de instrucciones alcanza a 158, que teniendo en cuenta los diferentes modos de
direccionamiento puede llegar hasta los 696.
Los modos de direccionamiento con que cuenta son ocho y se tratarn ms adelante.
Alimentacin elctrica de 5 V.
Admite dos tipos de interrupciones: INT (interrupcin enmascarable) y NMI (no
enmascarable).

Adems dispone de:


Entradas y salidas para direccionar hasta 256 puertos para acceso a perifricos.
Un contador de siete bit y los circuitos lgicos correspondientes para obtener las funciones de
refresco al conectrsele memorias dinmicas (DRAM).
Instrucciones adecuadas para la manipulacin a nivel de bits de registros y memoria.
Instrucciones de copia y comparacin a nivel de bloque.

El Z80 se encuentra encapsulado en


formato de 40 terminales, como queda
representado en la figura 2, cuyas
funciones son:
A0-A15 es el bus de direcciones,
compuesto de 16 bits para alcanzar
los 64 Kbytes de espacio de
memoria.
D0-D7 es el bus de datos
compuesto de ocho bits, por donde
fluyen los datos en ambos sentidos
desde el uP al exterior de este.
WR (Memory Write): este terminal
se usa para indicar al exterior la
operacin de escritura.
RD (Memory Read), este terminal
se usa para indicar al exterior la
operacin de lectura.
MREQ (Mernory Request): indica
al exterior que la direccin del bus
de direcciones es vlida para leer o
escribir (en memoria).
M1 (Machine Cycle One), por este
terminal el P indica al exterior el

Lenguaje de Mquina y Ensamblador. Z80. 17


Estructura y Funcionamiento de Computadoras II

primer tiempo de ejecucin de una instruccin (ciclo de bsqueda).


HALT: a travs de este terminal el P indica que se detiene, como consecuencia de la ejecucin de
la instruccin HALT de un programa.
WAIT: es la entrada por donde los perifricos y memorias lentas detienen al uP para sincronizarse
con l.
RESET: por esta entrada se inicia la accin del uP. Produce el borrado del contador de programa de
modo que al retirarse esta seal el P arranca en la direccin 0000.
RFSH es una salida de refresco. Indica que los siete bits de menor peso del bus de direcciones
contienen la direccin de refresco para las memorias dinmicas que se puedan conectar a este P.
IORQ (Input/Output Request): Indica que el P se dirige a los circuitos de entrada/salida.
INT (Interrupt Request) es una entrada por donde los penfrico hacen la peticin de interrupcin al
P.
NMI es una entrada de interrupcin no enmascarada. La interrupcin introducida por este terminal
tiene una prioridad total sobre la entrada de interrupcin anterior (INT). Cuando se activa esta
interrupcin, el P termina la ejecucin de la instruccin en curso e independientemente del
contenido del registro de estado, bifurca a la direccin 0066 (hexadecimal). Esta direccin es la
primera en que ha de estar ubicada la rutina de tratamiento de la interrupcin.
BUSRQ (Bus Request) es una entrada de peticin de las salidas del bus de direcciones y las de
control ya que todas ellas son del tipo triestado. Esta posibilidad viene bien para colocar en paralelo
vanos microprocesadores, que accedan indistintamente, pero no simultneamente a las mismas
posiciones de memoria. El P lleva sus buses a alta impedancia despus de ejecutar la instruccin
en curso (reserva el dispositivo para el dispositivo que lo peticion).
BUSAK (Bus Acknowledge): es una salida por donde se indica al exterior que el P est
desconectado como consecuencia de estar actuada la entrada anterior (BUSRQ).
: Es la entrada del reloj, que para este P es de una sola fase.
Entradas de alimentacin: La alimentacin es nica y de cinco voltios, que habr de ser aplicada
entre las entradas 11 y 29.

1.3.2. Estructura interna


La estructura interna del Z80 se muestra en la siguiente figura:

En trmino de bloques funcionales, consta de:


Unidad aritmtico-lgica: su configuracin responde a la de una mquina de una direccin.
Asociados a ella cuenta con los registros acumulador A y de flags F.
Unidad de control: asociado a ella cuenta con el registro de instruccin.
Registro de datos: es un registro de paso para los datos que entran o salen del microprocesador.
Registro de direcciones: dem que el anterior, para las direcciones.
Control de interrupciones: recepcin reconocimiento de interrupciones por parte del
microprocesador.

Lenguaje de Mquina y Ensamblador. Z80. 18


Estructura y Funcionamiento de Computadoras II

Los registros internos


Este microprocesador cuenta registros de uso general (disponibles para el usuario para propsitos
generales dentro del programa) y de uso dedicado, que tambin son empleados por el programa pero
con una finalidad especfica.
La figura siguiente muestra un esquema de los principales registros.

Registro Acumulador (A): registro de 8 bits asociado a la UAL, es el registro de trabajo de sta e
interviene en las operaciones ya sea para almacenar un operando a ser usado en una prxima
instruccin, como para recibir un resultado. Cuenta con un registro imagen (A, tambin de 8 bits)
Registro de estado o flags (F): Es un registro de 8 bits que al igual que A tiene una imagen, F. Su
funcin es la de brindar informacin respecto del resultado de la ejecucin de una instruccin, que
puede ser consultada por el programador por medio de las instrucciones correspondientes.
Dicha informacin es representada a travs de seis de los ocho bits con que cuenta, indicando cada uno
de ellos una condicin distinta, de acuerdo a su valor (0-1).
Registros de uso general: Son utilizados a voluntad por el propio programador. Identificados como B,
C, D, E, H y L. Se accede a cada uno de ellos segn la indicacin de la instruccin usada.
Se observa que los de la izquierda se encuentran duplicados en la derecha (B' C' D' E', H' y L'), es decir,
el P dispone de dos juegos complejos de registros equivalentes. El programador puede trabajar con
uno u otro grupo de registros, pasando de uno a otro lugar con las correspondientes instrucciones de
cambio. Pueden ser utilizados corno registros de 8 16 bits segn lo indique la instruccin aplicada. En
el ltimo caso, se asocian de la siguiente manera: B-C, D-E, H-L y B'-C', D'-E' y H'- L'.
Registros de uso especfico: El P Z80 dispone de cuatro registros de uso especfico de 16 bits
denominados PC, SP, IY, IX y otros dos tambin especficos de ocho bits llamados I y R. A
continuacin reseamos las funciones de cada uno de ellos.
PC (Program Counter): es el registro del contador de programa, es de 16 bits y en l se almacena
la direccin de memoria de la prxima instruccin a ejecutar. Se incrementa en uno
automticamente despus de leer la instruccin correspondiente (ver la Parte II, detalle de la
ejecucin de una instruccin particular). Cuando el programa presenta una instruccin de salto,
la direccin de ste se transfiere al PC, ejecutndose el salto y continundose el programa a partir
de esta nueva direccin. Es el cometido tpico de todo registro PC.
SP (Stack Pointer): es tambin un registro de 16 bits cuya funcin es la de hacer de puntero para
indicar en qu direccin de la RAM est ubicado el stack (pila). El stack es tratado como una
memoria tipo LIFO (Last Input First Output que quiere decir que el ltimo dato guardado es el
primero en recuperarse). Cuando ha llamados a subrutinas, el P utiliza la pila para preservar las
direcciones de retorno. Adems, el set dispone de dos instrucciones, llamadas PUSH y POP que
se le permiten al programador utilizar la pila para manejar cualquier dato de su programa.
IX IY: son dos registros ndices independientes entre s y de 16 bits cada uno. Son usados por el
P como ndice para efectuar operaciones con direccionamiento indexado.
Este modo de direccionamiento simplifica la confeccin de un programa en especial cuando se
accede a tablas de datos.
Registro I: denominado Interrupt Page Address Register es un registro de ocho bits y puede ser
usado donde una llamada indirecta a una posicin de memoria sea necesaria como consecuencia
de una interrupcin.

Lenguaje de Mquina y Ensamblador. Z80. 19


Estructura y Funcionamiento de Computadoras II

Registro R: Denominado Memory Refresh Register Es tambin de ocho bits y puede ser usado
para acceder a memorias dinmicas. El contenido de este registro es automticamente
incrementado despus de cada instruccin de bsqueda.
Estos ocho bits pueden salir al exterior de P por la parte baja del bus de direcciones para
refrescar continuamente la memoria RAM dinmica a la que se desea acceder.

Las interrupciones
El microprocesador Z80 tiene dos entradas de interrupcin: la entrada de interrupcin no enmascarable
NMI y la entrada de interrupcin enmascarable INT.
La interrupcin NMI, cuando se haya producido, no puede ser desactivada por programa y ser
aceptada siempre que un perifrico la solicite. Esta interrupcin ser, generalmente, reservada para las
funciones ms importantes que necesariamente tengan que ser atendidas en el momento de producirse,
tal como un fallo de alimentacin, etc.
La interrupcin enmascarable INT puede ser permitida o no, segn las necesidades, por el programa.
Esto permite al programador no preocuparse de las interrupciones en zonas de su programa que no
requieran de interrupciones. Por supuesto que algn perifrico conectado al terminal INT podr pedir
interrupcin en cualquier momento; pero sta no ser atendido si previamente el programa ha bloqueado
la posibilidad de acceso. La peticin de interrupcin podr ser atendida siempre que por programa sea
permitida de nuevo.
En el interior de] propio P existe un biestable denominado IFF que puede ser alterado por programa
usando la instruccin EI (Enable Interrupt) para ponerlo a uno, permitiendo las interrupciones, y la
instruccin DI (Disable Interrupt) para ponerle a cero, bloqueando as la entrada de interrupciones.

Uso de las interrupciones


Lo dicho sobre el biestable IFF es slo a nivel de concepto ya que en la realidad no es un biestable, sino
dos los que hay en el interior del P. Estos son denominados IFF1, que es el que permite o no las
interrupciones y IFF2, que puede ser considerado como una posicin de almacenamiento temporal de
IFF1.
Cuando se produce el reset general del P para iniciar su funcionamiento estos dos biestables son
tambin puestos a cero y por tanto las interrupciones sern bloqueadas. Cuando se ejecuta una
instruccin EI, ambos biestables son puestos a uno, dando paso a posibles interrupciones. Cuando llega
una interrupcin, es atendida poniendo a cero automticamente ambos biestables. En este caso los dos
funcionan al unsono y requieren ser puestos a uno por programa, tras cada tratamiento de una nueva
interrupcin.
El propsito de IFF2 es salvaguardar el contenido de IFF1 antes de que sea borrado. Este juego de
biestables permite saber en todo momento qu interrupciones se han ejecutado y si queda alguna
pendiente de tratamiento.
El biestable IFF puede ser restaurado por programa o mediante instruccin de retorno de una subrutina
de interrupcin no enmascarable. Recordemos que el tratamiento de una interrupcin se efecta
generalmente por subprograma (del sistema operativo si se est trabajando con l).
Las interrupciones en general son muy tiles en cualquier punto del programa ya que el programador
puede olvidarse de tenerlas presentes Al producirse una interrupcin lo nico que tendr que tener
presente es crear una subrutina al final del programa general, en que sean tratadas adecuadamente. Para
ello habr que dar paso y bloquear las interrupciones posteriores cuando se est tratando alguna.
El dominar lodo el sistema de un microcomputador as como de su sistema de interrupciones, es tan
slo cuestin de prctica y perfecto conocimiento del mismo. Recordemos que aqu tratamos siempre de
los conceptos generales y los que particularizan los sistemas.
Para profundizar ms hay que recurrir necesariamente a los volmenes de informacin que edita el
propio fabricante del sistema.

1.3.3. Modos de direccionamiento


Los modos de direccionamiento conciernen a todos los medios puestos a disposicin del procesador
para acceder a los datos a partir de los operandos de una instruccin. El microprocesador accede
siempre a la memoria central generando una direccin: no hay pues nada nuevo a este respecto. Sin
embargo, los operandos de una instruccin no tienen por qu ser una direccin real, sino un nmero, un
indicativo a partir del cual el procesador calcula la direccin real de la casilla de memoria donde se

Lenguaje de Mquina y Ensamblador. Z80. 20


Estructura y Funcionamiento de Computadoras II

encuentra el dato a tratar.


El Z80 dispone de ocho modos de direccionamiento. Ellos son:

Direccionamiento extendido
Este modo de direccionamiento es el ms sencillo, ya que el operando es la direccin real de la casilla
de memoria afectada. Se designa con la palabra extendido para indicar que este modo de
direccionamiento permite acceder a la totalidad del espacio de memoria. El operando es, por lo tanto,
una palabra de 16 bits.
La instruccin cargar en el acumulador el contenido de la casilla de memoria de direccin 0C745H se
escribe:
LD A, (0C745H)

Direccionamiento extendido a travs de registro


Este modo de direccionamiento no necesita operando. La direccin de la celda de memoria es el
contenido de uno de los pares de registros del Z80 HL, DE o BC. Al estar codificada la direccin en 16
bits, se puede acceder a la totalidad del espacio de memoria. Este modo de direccionamiento es muy til
para pasar parmetros a las rutinas.
La instruccin cargar en el acumulador el contenido de la casilla de memoria cuya direccin est en el
registro DE se escribe:
LD A,(DE)

Direccionamiento indexado
Este modo de direccionamiento tambin se llama relativo a una base.el operando es un octeto con
signo (-128 a 127). El microprocesador calcula la direccin real mediante la suma del operando
(llamado desplazamiento) ms el contenido de uno de los registros ndice (IX o IY).
La instruccin cargar en el acumulador el contenido de la casilla de memoria del elemento 8 de la tabla
apuntada por el registro IX se escribe:
LD A, (IX+8)
Estos 3 modos de direccionamiento vistos constituyen el nico sistema que posee el Z80 para acceder a
los datos de la memoria central.

Direccionamiento a travs de registro


Este modo de direccionamiento est reservado para las operaciones internas del procesador que no
necesitan ningn acceso a memoria principal.
La instruccin cargar en el registro B el contenido del registro D se escribe:
LD B,D

Direccionamiento implcito
Algunas instrucciones del Z80 slo pueden ejecutarse a travs del acumulador. En ese caso, no hay
necesidad de precisar implcitamente que el operando es el acumulador.
La instruccin rotacin a la izquierda del acumulador a travs del acarreo se escribe:
RLCA (sin operando)

Direccionamiento inmediato
No se trata de un modo de direccionamiento aunque se le considere como tal por deformacin del
lenguaje. En efecto, el operando no es ni una direccin, ni un desplazamiento, ni un nombre de registro,
sino el dato numrico a tratar por la instruccin. En un modo de direccionamiento autntico, el
operando indica dnde se encuentra el dato.
La instruccin cargar en el acumulador el valor 133 se escribe:
LD A,133D

Direccionamiento inmediato extendido


Este modo de direccionamiento es idntico al anterior pero en este caso el dato est codificado en dos
octetos. Se utiliza para cargar los registros de 16 bits HL, BC, DE, SP, IX, IY.
La instruccin inicializar el puntero de pila con la direccin 8000H se escribe:
LD SP,8000H

Lenguaje de Mquina y Ensamblador. Z80. 21


Estructura y Funcionamiento de Computadoras II

Direccionamiento relativo al PC
En este caso el operando es un desplazamiento (octeto consigo). Este modo de direccionamiento slo es
utilizado por el PC y permite efectuar bifurcaciones modificando su valor. El procesador realiza la
operacin PC = PC +/- desplazamiento. La bifurcacin relativa al PC resulta interesante porque es
independiente del lugar de la memoria central en el que se cargue el programa.
La instruccin volver30 octetos hacia atrs se escribe:
JR -30D

Direccionamiento a travs de la pgina cero


Este modo de direccionamiento es utilizado por el Z80 para una llamada especial a rutinas RESTART.
Esta instruccin fuerza en el PC una direccin de la pgina cero (los bits de mayo peso se ponen en
cero. El Z80 tiene 8 restarts diferentes bifurcando a rutinas que empiezan en las direcciones 0, 8H, 10,
18H, 28H, 30H, 38H. Las instrucciones: CALL 10H y RST 10H son totalmente equivalentes, aunque el
CALL y su operando se codifiquen en 3 bytes mientras que el RST slo necesite uno.
El RESTART es utilizado para rutinas llamadas con mucha frecuencia debido a la rapidez que
proporciona.
Hay que observar que el empleo de esta instruccin est reservado a menudo para el SO y corresponde a
determinadas rutinas ROM. Su utilizacin no resulta cmoda y no es aconsejable para principiantes. Ej:
RST 18H

1.3.4. Pila (Stack).


Una pila (en ingls stack) es un conjunto ordenado de elementos ubicada en memoria principal RAM,
de los cuales slo uno de ellos se puede acceder a la vez. El punto de acceso se denomina el tope de la
pila. El nmero de elementos en la pila, o la longitud de la pila, es variable. Los elementos nicamente
se pueden agregar o remover del tope de la pila. Por esta razn, una pila tambin se conoce como una
lista en orden descendente o una lista de ltimo en entrar primero en salir (LIFO o UEPS).
El manejo de la pila requiere de dos operaciones: una operacin coloca un nuevo elemento al tope de la
pila. Otra operacin inversa extrae el elemento que est en el tope de la pila. En ambos casos, el tope de
la pila se mueve en conformidad.

Implantacin de la pila
La pila es una estructura til proporcionada como parte de una implantacin de la CPU. Un uso de la
pila es manejar las llamadas y retornos de subrutinas. Las pilas tambin pueden ser tiles para el
programador con propsitos generales.
La implantacin de una pila depende en parte de sus usos potenciales. Si es deseable hacer que las
operaciones de la pila estn disponibles para el programador, entonces el conjunto de instrucciones
incluir operaciones orientadas al pila, incluyendo PUSH (colocar), POP (extraer) y las operaciones que
emplean uno o dos elementos del tope de la pila como operandos. Ya que todas estas operaciones se
refieren a una localidad nica, llamada tope de la pila, la direccin del operando u operandos est
implcita y no necesita estar incluida en la instruccin. Estas son instrucciones de cero direcciones.
Si el mecanismo de la pila es utilizado slo por la CPU para propsitos tales como el manejo de
subrutinas, entonces no sern explcitas las instrucciones orientadas a la pila en el conjunto de
instrucciones. En cualquier caso, la implantacin de una pila requiere que exista algn conjunto de
localidades usadas para almacenar los elementos de la pila. Un bloque contiguo de localidades se
reserva en la memoria principal (o en la memoria virtual) para la pila. La mayor parte del tiempo, el
bloque se llena de manera parcial con elementos de la pila y el resto est disponible para el crecimiento
de sta. Tres direcciones son necesarias para una operacin apropiada, y stas con frecuencia se
almacenan en registros de la CPU:
Apuntador de la pila: Contiene la direccin del tope de la pila. Si un elemento se coloca o
extrae de la pila, el apuntador se incrementa o decrementa para contener la direccin del nuevo
tope de la pila.
Base de la pila: Contiene la direccin de la localidad inferior en el bloque reservado. Si se hace
un intento de ejecutar una instruccin POP cuando la pila est vaca, se reporta un error.
Limite de la pila: Contiene la direccin del otro extremo del bloque reservado. Si se hace un
intento de ejecutar una instruccin PUSH cuando el bloque est utilizado en su totalidad por la
pila, se reporta un error.

Lenguaje de Mquina y Ensamblador. Z80. 22


Estructura y Funcionamiento de Computadoras II

El Z80 incluye el manejo de pila, tanto para el uso de subrutinas como para otros usos de programacin,
para lo cual incluye en el set las correspondientes instrucciones PUSH y POP.

Funcionamiento de la pila
La gestin de esta pila por el registro SP (Snack Pointer) es muy sencilla. Al comenzar, cuando la pila
est vaca, SP contiene la direccin de una casilla de memoria. Para cada escritura en la pila, el registro
SP es decrementado en 1, escribindose a continuacin, el dato en la celda de memoria cuya direccin
viene indicada por el contenido del registro SP. De esta manera, los datos de la pila se colocan en
direcciones contiguas decrecientes. Para cada lectura se hace el camino inverso. Es decir, se lee la
casilla de memoria apuntada por SP y despus se incrementa en 1 este registro.
Estas operaciones aparecen resumidas en el esquema siguiente:

Observe que la lectura no afecta a los valores guardados en la pila. Slo queda modificado el SP.
La pila se utiliza para la llamada a las rutinas. La manipulacin de la memoria pila se consigue a travs
de las instrucciones de lenguaje de mquina CALL nn y RET. Cuando el procesador encuentra un
CALL nn bifurca a la direccin nn y contina hasta que encuentra una direccin RET. En ese momento
hay que volver a la instruccin siguiente a la del llamado (nn+1). Esto significa que el procesador ha
conservado en algn sitio esta direccin. Este sitio es la pila. El funcionamiento de la pila permite
anidar las rutinas de forma casi ilimitada. En efecto, la ltima direccin de retorno apilada corresponde
al primer RET encontrado (esquema LIFO).

Lenguaje de Mquina y Ensamblador. Z80. 23


Estructura y Funcionamiento de Computadoras II

La direccin de la instruccin siguiente al CALL est en el PC. Cada CALL pone en la pila el PC y a
continuacin lo carga con la direccin de comienzo de la rutina. Para cada RET el PC saca la direccin
de la pila. Observe que son necesarias dos operaciones con la pila para colocar los 16 bits del PC
despus de un CALL.
(SP-1) = PCH y (SP-2)= PCL SP = SP-2
despus de un RET:
PCL = (SP) y PCH = (SP+1) SP = SP+2

Lenguaje de Mquina y Ensamblador. Z80. 24

También podría gustarte