Está en la página 1de 20

ESTRUCTURA Y FUNCIONAMIENTO DE

COMPUTADORAS II

LENGUAJE DE MÁQUINA Y
ENSAMBLADOR. PROCESADOR Z80.

Licenciatura en Sistemas de Información


Licenciatura en Ciencias de la Computación
Tecnicatura Universitaria en Programación Web

Departamento de Informática

Facultad de Ciencias Exactas, Físicas y Naturales

Universidad Nacional de San Juan


Estructura y Funcionamiento de Computadoras II

Esquema de contenidos

Repertorio (Conjunto o Set) de instrucciones.


Características de las instrucciones de máquina
Elementos de una instrucción máquina
Representación de las instrucciones
Tipos de instrucciones
Diseño del repertorio de instrucciones
Lenguaje de máquina Programación en Lenguaje de Máquina y en Lenguaje Ensamblador
Lenguaje Ensamblador (Assembler)
Finalidad del uso de la programación en bajo nivel
Tipos de instrucciones del Lenguaje Ensamblador

El microprocesador
Microprocesador Z80
Características y conexiones del Z80
Estructura interna
Unidad de control (UC)
Unidad aritmética y lógica (UAL)
Registros internos:
Arquitectura de la CPU Registros de uso General y de uso Específico
Microprocesador Z80 Interrupciones
Uso de las interrupciones
Modos de direccionamiento del µP Z80
Pila (Stack)
Implementación de la pila
Funcionamiento de la pila
Ensamblador del Z80
Sintaxis del lenguaje ensamblador
Repertorio de Instrucciones del lenguaje ensamblador del µZ80
Tipos de instrucciones

1.1. LENGUAJE DE MÁQUINA


Si un programador utiliza un lenguaje de alto nivel, muy poco de la arquitectura de la máquina es visible. Un
límite donde el diseñador de la computadora y el programador de ésta pueden ver la misma máquina es en el
conjunto de instrucciones de la máquina. Desde el punto de vista del diseñador, el conjunto de instrucciones
de la máquina proporciona los requerimientos funcionales para la Unidad Central de Procesamiento (CPU):
la implementación de la CPU es una tarea que en gran parte involucra establecer el conjunto de instrucciones
de la máquina. Desde el lado de usuario, aquel que elige programar en lenguaje de máquina (o más
probablemente en lenguaje ensamblador; como se verá más adelante) es quien se llega a enterar de los
registros y estructura de la memoria, los tipos de datos soportados directamente por la máquina y el
funcionamiento de la Unidad Aritmético Lógica (UAL/ALU).
Una descripción del conjunto de instrucciones de máquina permite explicar acabadamente la CPU de la
computadora y cada una de las operaciones que ella puede realizar.
1.1.1. Repertorio (Conjunto o Set) de instrucciones
Una computadora sólo puede reconocer, interpretar y procesar un grupo definido y limitado de órdenes, que
corresponden a las operaciones que puede realizar.
La CPU puede ejecutar una variedad de funciones y éstas se reflejan en la variedad de instrucciones definidas
en ella. Al conjunto de instrucciones distintas que puede ejecutar la CPU se denomina CONJUNTO,
REPERTORIO o SET de INSTRUCCIONES del procesador. El repertorio de instrucciones constituye el
llamado LENGUAJE de MÁQUINA o CÓDIGO ABSOLUTO.
1.1.2. Características de las instrucciones de máquina
Cada fabricante establece el repertorio correspondiente a una máquina en particular, de modo que ello
constituye una característica de diseño. Esa máquina está hecha para ejecutar esas instrucciones y ninguna
otra. Cada instrucción debe contener la información que necesita el procesador para su ejecución.

Lenguaje de Máquina y Ensamblador. Z80. 1


Estructura y Funcionamiento de Computadoras II

Elementos de una instrucción máquina


En la Figura 1.1 se muestran los pasos involucrados en la ejecución de las instrucciones e implícitamente se
definen los elementos constitutivos de una instrucción de máquina.
Dichos elementos son:
 Código de operación: Especifica la operación a ser realizada (por ejemplo, SUMAR, E/S,
TRANFERIR, etc.). La operación está especificada por un código binario, denominado código de
operación u opcode.
 Referencia del operando fuente u origen: La operación puede involucrar uno o más operandos fuente,
esto es, operandos que son entradas para la operación.
 Referencia al operando destino o resultado: La operación puede producir un resultado.
 Referencia a la siguiente instrucción: Ésta le dice a la CPU dónde buscar la siguiente instrucción
después de que la ejecución de esta instrucción se haya completado.
La siguiente instrucción 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 mayoría de los casos, la
siguiente instrucción a ser buscada sigue de inmediato a la instrucción actual. En esos casos, no hay referencia
explícita a la siguiente instrucción. Cuando es necesaria una referencia explícita, entonces se debe suministrar
la dirección de la memoria principal o virtual.

Figura 1.1: Diagrama de estados del ciclo de instrucción.


Los operandos origen y destino pueden estar en alguna de las tres áreas siguientes:
 Memoria principal o virtual: En este caso, la instrucción debe suministrar las correspondientes
direcciones.
 Registro de la CPU: Con raras excepciones, una CPU contiene uno o más registros que pueden ser
referenciados mediante instrucciones de máquina. Si sólo existe un registro, la referencia a él puede ser
implícita. Si existe más de un registro, entonces a cada registro se le asigna un número único y la
instrucción debe contener el número del registro deseado.
 Dispositivo de E/S: La instrucción debe especificar el módulo de E/S y el dispositivo para la operación.
Si se utiliza E/S mapeada a memoria, ésta es otra dirección de la memoria principal o virtual.

Representación de las instrucciones


En la computadora, cada instrucción se representa por una secuencia de bits. La instrucción está dividida en
campos correspondientes a los elementos constitutivos de la misma. Esto se conoce como el formato de la
instrucción.
El formato de las instrucciones constituye una característica de diseño fijada por el fabricante, que guarda
estrecha relación con las características físicas (estructura, organización) del procesador. En la mayoría de
los repertorios de instrucciones se emplea más de un formato. Durante su ejecución, la instrucción se escribe
en el registro de instrucción del procesador. El procesador debe ser capaz de extraer los datos de los distintos
campos de la instrucción para realizar la operación requerida.

Lenguaje de Máquina y Ensamblador. Z80. 2


Estructura y Funcionamiento de Computadoras II

Esquemáticamente, la Figura 1.2 muestra un ejemplo de representación del formato de la instrucción:


4 6 6
Código de Referencia del Referencia del
operación operando operando
16 bits

Figura 1.2: Formato de la instrucción.


En el esquema, el código de operación ocupa los primeros 4 bits del formato. Es común que el código de
operación ocupe los ocho primeros bits (primer byte u octeto) de la instrucción. Dado que 8 bits permiten 28
combinaciones distintas, es posible disponer de hasta 256 instrucciones. Si el repertorio de instrucciones
contuviera un número mayor de ellas, debería entonces destinarse un número mayor de bits para el código
de operación.
La extensión del campo o zona de referencia de operandos depende del tipo de operación y de las
características de la máquina. Como en el microprocesador Z80 (µP Z80) las direcciones son informaciones
de 16 bits, la extensión del campo de operando será de 16 bits. Sin embargo, una máquina con una estruct ura
de direcciones de mayor capacidad requerirá, para una operación idéntica, un campo de mayor extensión
para el operando.
Por otro lado, en una misma máquina, distintas instrucciones tendrán distintas extensiones del campo de
operandos. Por ejemplo, en el µP Z80 la siguiente instrucción corresponde a la suma de una constante de 8
bits (el número decimal 25), al registro acumulador de la UAL como se muestra en la Figura 1.3:
1100001100001101
Figura 1.3: Instrucción del µP Z80.
En síntesis, el formato de las instrucciones y el código de operación son asignados por el fabricante al diseñar
la computadora. En la mayoría de los repertorios de instrucciones se emplea más de un formato. Durante su
ejecución, la instrucción se escribe en el registro de instrucción de la CPU. La CPU debe ser capaz de extraer
los datos de los distintos campos de la instrucción para realizar la operación requerida.
Por la dificulta que presentan las representaciones binarias de las instrucciones de máquina, se utilizan
representaciones simbólicas. Los códigos de operación se simbolizan mediante abreviaturas denominadas
mnemotécnicos, que indican la operación a realizar. Algunos ejemplos de mnemotécnicos son:

ADD Adición (sumar).


SUB Sustracción (restar).
MPY Multiplicar.
DIV Dividir.
LOAD Cargar datos desde la memoria.
STOR Almacenar datos en la memoria.

Es raro encontrar programadores en lenguaje de máquina; la mayoría de los programas actuales se escriben
en un lenguaje de alto nivel.
Tipos de instrucciones
Los tipos de instrucciones que deben incluirse en una computadora, deberán tener un conjunto de
instrucciones que permitieran al usuario formular cualquier tarea de procesamiento de datos. Cualquier
programa escrito en alto nivel debe traducirse a lenguaje de máquina para ser ejecutado. Por tanto, el
repertorio de instrucciones máquina debe ser suficientemente amplio como para expresar cualquiera de las
instrucciones de un lenguaje de alto nivel. Teniendo esto presente, los tipos de instrucciones se pueden
clasificar de la siguiente manera:
 Procesamiento de datos: instrucciones aritméticas y lógicas
 Almacenamiento de datos: instrucciones de memoria.
 Transferencia de datos: instrucciones de E/S.
 Control: instrucciones de comprobación (prueba) y de bifurcación.
Las instrucciones aritméticas proporcionan capacidades computacionales para el procesamiento de datos
numéricos. Las instrucciones lógicas (booleanas) operan con los bits de una palabra en lugar de considerarlos
como números, proporcionando por tanto capacidad para el procesamiento de cualquier otro tipo de datos
que el usuario quiera emplear. Estas operaciones se ejecutan, principalmente, sobre datos en los registros de

Lenguaje de Máquina y Ensamblador. Z80. 3


Estructura y Funcionamiento de Computadoras II

la CPU. Por lo tanto, 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 devolver
resultados de los cálculos al usuario. Las instrucciones de prueba se emplean para verificar el valor de una
palabra de datos o el estado de un cálculo. Las instrucciones de bifurcación se usan entonces para saltar a un
conjunto diferente de instrucciones dependiendo de la decisión tomada.

1.1.3. Diseño del repertorio de instrucciones


Uno de los aspectos más interesantes, y más analizados, del diseño de computadoras es el diseño del conjunto
de instrucciones. El diseño de un repertorio de instrucciones es muy complejo, ya que afecta muchos de los
aspectos del sistema computacional. El repertorio de instrucciones define muchas de las funciones llevadas
a cabo por la CPU y, por consiguiente, tiene un efecto significante en la implementación de ésta. El repertorio
de instrucciones es el medio del programador para controlar la CPU. Por lo tanto, los requerimientos del
programador deben ser considerados en el diseño del repertorio de instrucciones.
Los aspectos fundamentales para el diseño del repertorio de Instrucciones incluyen:
 Repertorio de operaciones: cuántas y qué operaciones considerar, y cuán complejas deben ser.
 Tipos de datos: los distintos tipos de datos con los que se efectúan operaciones (por ejemplo: direcciones,
números, caracteres, datos lógicos).
 Formatos de instrucciones: longitud de la instrucción (en bits), número de direcciones, tamaño de los
distintos campos, etc.
 Registros: número de registros de la CPU que pueden ser referenciados por las instrucciones y su uso.
 Direccionamiento: el modo o modos de direccionamiento mediante los cuales puede especificarse la
dirección de un operando.
Estos aspectos están fuertemente interrelacionados y deben considerarse conjuntamente en el diseño del
repertorio de instrucciones.

1.1.4. Programación en Lenguaje de Máquina y en Lenguaje Ensamblador


Como ya se describió 1, un procesador puede interpretar y ejecutar instrucciones de máquina. Estas
instrucciones son simplemente números binarios almacenados en el computador. Si un programador
quisiera programar directamente en lenguaje de máquina, necesitaría introducir los programas como datos
binarios; es decir, el programa se construye directamente con los códigos binarios correspondientes a las
instrucciones del repertorio de instrucciones que puede ejecutar la CPU. El programa realizado en lenguaje
de máquina se lo denomina programa o módulo o código objeto y es el que realmente va a ser ejecutado
por la computadora.
Cualquier programa escrito en otro lenguaje de programación ya sea de bajo o de alto nivel debe ser
traducido a lenguaje de máquina para poder ser ejecutado por la computadora. La programación en lenguaje
de máquina es muy engorrosa debido a que debemos codificar todas las instrucciones combinando ceros y
unos; es muy difícil de entender para el programador y muy fácil cometer errores en la codificación.
Por las dificultades de la programación en lenguaje de máquina, se puede usar otra codificación como octal
o hexadecimal, o un lenguaje simbólico. Este lenguaje simbólico se ha definido para poder escribir
programas con una sintaxis próxima al lenguaje de máquina, pero sin tener que escribir el código en binario,
sino utilizando una serie de mnemónicos más fáciles de entender para el programador.
Lenguaje Ensamblador (Assembler)
El lenguaje ensamblador se basa en mnemónicos fáciles de recordar y la posibilidad para el programador
de asignar nombres simbólicos pudiendo referirse tanto a instrucciones como a datos. Un programa escrito
utilizando mnemónicos se llama programa en lenguaje ensamblador (assembly language en inglés).
En un programa realizado en lenguaje ensamblador cada instrucción posee mnemotécnico que identifica la
acción a realizar por la instrucción, por lo tanto un programa en lenguaje ensamblador no es directamente
ejecutable por la computadora, debiendo realizar una traducción de los nombres simbólicos a los códigos y
direcciones de máquina correspondientes. Por lo tanto, los programas realizados en lenguaje ensamblador
(programa o módulo o código fuente) deberán ser traducidos al lenguaje de máquina (código objeto) por
medio de un programa traductor denominado ensamblador o compaginador como se muestra en la Figura

1
Ver sección 1.1. LENGUAJE DE MÁQUINA

Lenguaje de Máquina y Ensamblador. Z80. 4


Estructura y Funcionamiento de Computadoras II

1.4. De esta forma, un compaginador es un programa que recibe como datos de entrada un programa en
lenguaje ensamblador y produce como resultado de salida una serie de instrucciones en lenguaje máquina.

Figura 1.4: Proceso de traducción del programa en lenguaje ensamblador.


El desarrollo del lenguaje ensamblador fue un paso esencial en la evolución de la tecnología de las
computadoras ya que fue el primer paso para llegar a los lenguajes de alto nivel. Aunque pocos
programadores utilizan el lenguaje ensamblador, todas las máquinas proveen uno.
Finalidad del uso de la programación en bajo nivel
Si bien el uso del lenguaje ensamblador posee ciertas desventajas en relación a los lenguajes de alt o nivel, la
utilización de estos permite al programador el acceso a la totalidad del hardware de la computadora y un
aprovechamiento más eficiente de todas sus prestaciones.
Algunas ventajas del ensamblador a este respecto son:
 Puede lograrse un módulo objeto más veloz.
 Utilización más 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 fácilmente superadas por el usuario
recurriendo a subrutinas (subprogramas o rutinas) en lenguaje ensamblador es accesible desde un
programa escrito en otro lenguaje.
 Para ciertos tipos de aplicaciones con necesidades especializadas y para preparar programas de sistemas
se prefiere más a menudo el lenguaje ensamblador. Esto se debe a las características de estos lenguajes
que permiten que los programadores tengan un aprovechamiento más completo y eficiente de la
computadora.

1.1.5. Tipos de instrucciones del Lenguaje Ensamblador


Cualquier lenguaje ensamblador está constituido por tres tipos de instrucciones:
 Instrucciones de máquina
Una instrucción de máquina es una representación simbólica de una instrucción del lenguaje de máquina
del repertorio de instrucciones de la computadora a la que pertenece el lenguaje.
Se llama "instrucción de máquina" porque el programa ensamblador la traduce en el código en lenguaje
de máquina de la instrucción correspondiente de la computadora.
 Instrucciones de ensamble
Las instrucciones de ensamble son las que requiere el programa ensamblador (compaginador) para
efectuar ciertas operaciones durante el proceso de ensamblado del programa fuente, por ejemplo:
definición de datos constantes, definición de inicio o fin de programa fuente y reserva de áreas de
memoria.
 Macro-instrucciones y Macro-definiciones
Una macro-instrucción es una orden, para el programa ensamblador de procesar una secuencia
predefinida de códigos, llamada macro-definición.
De acuerdo a esta definición, el ensamblador inserta un grupo de códigos o instrucciones de máquina,
identificados como una macro-definición a través de un par de instrucciones de ensamble, en el punto
del programa fuente en el cual se halla una macro-instrucción.
Las macro-definiciones son identificables a través de un nombre, que se usa como argumento en las
macro-instrucciones que la acceden.

Lenguaje de Máquina y Ensamblador. Z80. 5


Estructura y Funcionamiento de Computadoras II

El proceso de inserción de macro-definiciones se muestra en la Figura 1.5:

Figura 1.5: Proceso de inserción de macro-definiciones.


Se puede acceder a una secuencia determinada de instrucciones la macro-definición, por el uso de una macro-
instrucción o macro-llamada. El compaginador reemplaza la macro-instrucción por las instrucciones de la
macro-definición, insertándola en el punto de llamada. El proceso de inserción de una macro-definición en
un programa fuente se denomina macro-generación o macro-expansión. El tiempo en que el compaginador
expande el módulo fuente se denomina tiempo de preensamble y se llama tiempo de ensamble al tiempo en
el cual el ensamblador traduce el programa fuente a lenguaje de máquina (módulo objeto).

1.2. Arquitectura de la CPU


La CPU está constituida fundamentalmente por la Unidad de Control (UC) y la Unidad Aritmética y Lógica
(UAL), pero además debe contar con elementos de memoria para el almacenamiento temporal de l os datos
tratados por la CPU; esa memoria está constituida por registros. La conexión entre los distintos componentes
de la computadora se realiza mediante buses que puede ser compartido por varios dispositivos, a los fines de
la comunicación entre los mismos. Cuando los datos deben ser transmitidos de un componente a otro, viaja
por el bus desde el componente fuente al de destino, almacenán dose temporalmente en registros. La
arquitectura de la CPU se muestra en la Figura 1.6:

Figura 1.6: Esquema básico de la arquitectura de la CPU

Lenguaje de Máquina y Ensamblador. Z80. 6


Estructura y Funcionamiento de Computadoras II

1.2.1. El microprocesador
Con los avances tecnológicos y en el campo de la electrónica fue posible que los fabricantes de computadoras
usarán chip para sus procesadores específicamente microprocesadores. Por lo tanto, se llama
microprocesador 2 (µP) a la implementación de una CPU en un solo chip. El primer microprocesador
disponible comercialmente fue fabricado en 1971 por Intel Corporation conocido comercialmente con el
número 4004, era de 4 bits y era un chip de 16 patas.
Una de las características que definen a las computadoras, es el tamaño de la palabra; es decir, el número
de bits que forman la palabra y que utiliza en forma simultánea para realizar ciertos procesos internos. El
tamaño de la palabra de datos es siempre igual al número de líneas que posee el bus de datos.
Otro aspecto que caracteriza a un microprocesador es su capacidad de direccionamiento; es decir, el tamaño
de la memoria que puede direccionar. La cantidad de direcciones se determina por la cantidad de
combinaciones que puede realizarse con n bits: 2n, donde n es el número de líneas del bus de direcciones.
En el caso del microprocesador Z80: es un procesador de 8 bits donde el tamaño de palabra es de 8 bits y 16
bits en el bus de direcciones que le permiten alcanzar 64 KB de espacio de memoria (2n = 216 = 64KB).

1.2.2. Microprocesador Z80


Es un procesador que apareció en el mercado en 1976, es similar al Intel 8080 pero notablemente mejorado.
El Z80 fue también uno de los microprocesadores más populares y más empleados sob re todo a nivel de
microcomputadores personales y domésticos.
Características y conexiones del Z80
 Como detalle de su integración diremos que sobre una pastilla monolítica (chip) están integrados unos
ocho mil transistores, del orden de 4500 más que su antecesor el µP 8080.
 Fue diseñado por la firma ZILOG, habiendo sido fabricado también por: SGS, MOSTEK, NEC y
SHARP.
 Es un µP de 8 bits en el bus de datos y de 16 en el bus de direcciones, que le permiten alcanzar 64 KB
de espacio de memoria.
 Admite una señal de reloj de 2,5 MHz. La versión Z80-A alcanza los 4 MHz.
 El set de instrucciones contiene 158 instrucciones, 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 tratarán más adelante.
 Alimentación eléctrica de 5 V.
 Admite dos tipos de interrupciones: INT (interrupción enmascarable) y NMI (no enmascarable).
Además dispone de:
 Entradas y salidas para direccionar hasta 256 puertos para acceso a periféricos.
 Un contador de siete bit y los circuitos lógicos correspondientes para obtener las funciones de refresco
al conectársele memorias dinámicas (DRAM).
 Instrucciones adecuadas para la manipulación a nivel de bits de registros y memoria.
 Instrucciones de copia y comparación a nivel de bloque.

El µP Z80 se encuentra encapsulado en formato de 40 terminales, como queda representado en la Figura 1.7,
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 µP al exterior de este.
 WR (Memory Write): este terminal se usa para indicar al exterior la operación de escritura.
 RD (Memory Read), este terminal se usa para indicar al exterior la operación de lectura.
 MREQ (Mernory Request): indica al exterior que la dirección del bus de direcciones es válida para leer
o escribir (en memoria).
 M1 (Machine Cycle One), por este terminal el P indica al exterior el primer tiempo de ejecución de una

2
Se denomina microprocesador al circuito electrónico que procesa la energía necesaria para que el dispositivo electrónico en que
se encuentra funcione, ejecutando los comandos y los programas adecuadamente. La Unidad Central de Procesos (CPU) de una
computadora es un ejemplo de un microprocesador.

Lenguaje de Máquina y Ensamblador. Z80. 7


Estructura y Funcionamiento de Computadoras II

instrucción (ciclo de búsqueda).


 HALT: a través de este terminal el P indica que se detiene, como consecuencia de la ejecución de la
instrucción HALT de un programa.
 WAIT: es la entrada por donde los periféricos y memorias lentas detienen al µP para sincronizarse con
él.
 RESET: por esta entrada se inicia la acción del µP. Produce el borrado del contador de programa de
modo que al retirarse esta señal el P arranca en la dirección 0000.
 RFSH es una salida de refresco. Indica que los siete bits de menor peso del bus de direcciones contienen
la dirección de refresco para las memorias dinámicas 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 periféricos hacen la petición de interrupción al P.
 NMI es una entrada de interrupción no enmascarada.
La interrupción introducida por este terminal tiene
una prioridad total sobre la entrada de interrupción
anterior (INT). Cuando se activa esta interrupción, el
P termina la ejecución de la instrucción en curso e
independientemente del contenido del registro de
estado, bifurca a la dirección 0066 (hexadecimal).
Esta dirección es la primera en que ha de estar
ubicada la rutina de tratamiento de la interrupción.
 BUSRQ (Bus Request) es una entrada de petición 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
varios microprocesadores, que accedan
indistintamente, pero no simultáneamente a las
mismas posiciones de memoria. El P lleva sus
buses a alta impedancia después de ejecutar la
instrucción en curso (reserva el dispositivo para el
dispositivo que lo peticionó). Figura 1.7: Terminales del µP Z80
 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 alimentación: La alimentación es única y de cinco voltios, que habrá de ser aplicada entre
las entradas 11 y 29.
Estructura interna
La Figura 1.8 muestra la arquitectura del µP Z80 en término de bloques funcionales que constituyen un
esquema simplificado.

Figura 1.8: Estructura interna del µP Z80

Lenguaje de Máquina y Ensamblador. Z80. 8


Estructura y Funcionamiento de Computadoras II

El µP Z80 está formado por la unidad de control (UC), la unidad aritmética y lógica (UAL) y por otros
registros específicos. A continuación se realizará una breve descripción:
Unidad de control (UC)
La UC cumple la función de secuenciar las operaciones que debe realizar el sistema. Los componentes de la
Unidad de Control son el decodificador, el reloj y el secuenciador (controlador). El decodificador envía
señales al secuenciador y determina la ejecución de la instrucción.
Además la UC necesita comunicarse con la memoria y los periféricos. Esta comunicación la realiza a través
de buses externos. El µP Z80 posee tres buses:
 Bus de datos bidireccional de 8 bits empleado para transmitir datos desde o hacia la memoria y la CPU,
o entre la CPU y un periférico.
 Bus de direcciones unidireccional de 16 bits para transmitir las direcciones de las posiciones de memoria
y de los dispositivos conectados al bus.
 Bus de control unidireccional para trasmitir las señales de sincronización que dirigen el funcionamiento
de la computadora.
También hay registro asociada a la UC:
 Registro de instrucción: su finalidad es almacenar la instrucción que es captada por la CPU durante una
operación de lectura y posteriormente será decodificada y ejecutada.
 Registro Contador de Programa (CP): Para buscar la instrucción que debe ser ejecutada a continuación,
la UC tiene un registro de propósito especial que es el contador de programa. Es un registro de 16 bits
que contiene la dirección de la instrucción que actualmente está siendo buscada en la memoria. Al
finalizar la ejecución de una instrucción, el CP contiene la dirección de la primera palabra de la siguiente
instrucción a ejecutar.
Unidad aritmética y lógica (UAL)
La UAL cumple la función de realizar las operaciones aritméticas y lógicas. La configuración de está
responde a una máquina de una dirección y tiene asociados los registros acumulador (A) y el registro de
estado (Flags o F); estos registros se explicarán en detalle más adelante.
Otros registros
 Registro de Direcciones: Este registro almacena las direcciones de las celdas de memoria que van a ser
accedidas para realizar una lectura/escritura. Está conectado directamente al bus de direcciones.
 Registro de Palabra o registro de datos: Este registro es el encargado de almacenar la información (datos
o instrucciones) que se intercambian con la memoria a través del bus de datos.
 Control de interrupciones: recepción reconocimiento de interrupciones por parte del microprocesador.
Registros internos
El µP Z80 cuenta con registros de uso general (disponibles para el usuario para propósitos generales dentro
del programa) y de uso dedicado, que también son empleados por el programa pero con una finalidad
específica. La Figura 1.9 siguiente muestra un esquema de los principales registros.

Figura 1.9: Registros de uso general y específico del µP Z80


 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 próxima instrucción,
como para recibir un resultado. Cuenta con un registro imagen A’, también de 8 bits.

Lenguaje de Máquina y Ensamblador. Z80. 9


Estructura y Funcionamiento de Computadoras II

 Registro de Estado o Flags (registro F): Es un registro de 8 bits que al igual que A tiene una imagen, F’.
Su función es la de brindar información respecto del resultado de la ejecución de una instrucción, que
puede ser consultada por el programador por medio de las instrucciones correspondientes.
Dicha información es representada a través de seis de los ocho bits con que cuenta, indicando cada uno
de ellos una condición distinta, de acuerdo a su valor (0-1). En la Figura 1.10 se muestra el significado
de los bits de este registro.

Figura 1.10: Registro de Estado o flags (Registro F).


 Bit 0 - C: Es el indicador de acarreo. Es posicionado por las operaciones aritméticas, de
desplazamiento y de comparación. Este bit es como si fuera el noveno bit del acumulador.
 Bit 1 - N: Empleado en las operaciones en BCD de Suma/Resta; toma el valor 0 si la última operación
realizada es suma y 1 para la resta.
 Bit 2 - P/V: El significado de este flag depende de la operación que se realice. En el caso de una
operación aritmética (suma, resta, incremento o decremento), sirve como indicador de
desbordamiento de capacidad (overflow) V. En el caso de operaciones lógicas o de desplazamiento,
sirve como indicador de paridad P.
 Bit 3: No se utiliza.
 Bit 4 - H: Indicada el acarreo del 3er al 4to bit para operaciones en BCD.
 Bit 5: No se utiliza.
 Bit 6 - Z: Señala si el resultado de la última operación realizada ha sido nulo. Si el resultado obtenido
es cero entonces Z=1 y si el resultado es distinto de cero Z=0.
 Bit 7 - S: Este flag indica el signo del byte contenido en el Acumulador. Por lo tanto, S=1 si el
resultado es negativo y S=0 si es positivo.
Cabe aclarar que los registros A y F (A’ y F’) no se pueden asociar para formar un registro de 16 bit.
Registros de uso General
Estos registros de uso general pueden verse como memoria muy rápida y pueden ser utilizados por el
programador. El µP Z80 posee 12 registros de uso general, identificados como B, C, D, E, H y L que son el
conjunto de registros principales y también el conjunto de registros alternativos: B’, C’, D’, E’, H’ y L’. Por
lo tanto el P dispone de dos juegos completos de registros equivalentes y se puede acceder a cada uno de
ellos directamente sin tener que pasar por una dirección. 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 como registros de 8 o 16 bits, cuando se usan agrupados de a 16 bits se asocian de la siguiente
manera: BC, DE, HL y B’C’, D’E’ y H’L’.
Registros de uso Específico
El P Z80 dispone de cuatro registros de uso específico de 16 bits denominados PC, SP, IY, IX y otros dos
también específicos de ocho bits llamados I y R. A continuación describimos las funciones de cada uno de
ellos.
 PC (Program Counter o Contador de Programa –CP): es de 16 bits y en él se almacena la dirección de
memoria de la próxima instrucción a ejecutar. Se incrementa en uno automáticamente después de leer la
instrucción correspondiente. Cuando el programa presenta una instrucción de salto, la dirección de éste
se transfiere al PC, ejecutándose el salto y continuándose el programa a partir de esta nueva dirección.
 SP (Stack Pointer o Puntero de Pila): es también un registro de 16 bits cuya función es la de hacer de
puntero para indicar en qué dirección de la RAM está ubicada la pila. La pila es tratada como una
memoria tipo LIFO (Last Input First Output - el último dato guardado es el primero en recuperarse).
Cuando hay llamados a subrutinas, el P utiliza la pila para preservar las direcciones de retorno. Además,
el set dispone de dos instrucciones, llamadas PUSH y POP que le permiten al programador utilizar la
pila para manejar cualquier dato de su programa.
 IX y IY: son llamados 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 confección de un programa en especial cuando se accede a tablas de datos.
 Registro I: Denominado Interrupt Page Address Register, es un registro de 8 bits y puede ser usado para
una llamada indirecta a una posición de memoria como consecuencia de una interrupción.

Lenguaje de Máquina y Ensamblador. Z80. 10


Estructura y Funcionamiento de Computadoras II

 Registro R: Denominado Memory Refresh Register, es también de 8 bits y puede ser usado para acceder
a memorias dinámicas. El contenido de este registro es automáticamente increm entado después de cada
instrucción de búsqueda. Estos ocho bits pueden salir al exterior de P por la parte baja del bus de
direcciones para refrescar continuamente la memoria RAM dinámica a la que se desea acceder.
Los registros I y R no son utilizados por el programador.
Interrupciones
El P Z80 tiene dos entradas de interrupción: la entrada de interrupción no enmascarable NMI y la entrada
de interrupción enmascarable INT.
 La interrupción NMI, cuando se haya producido, no puede ser desactivada por programa y será aceptada
siempre que un periférico la solicite. Esta interrupción será, generalmente, reservada para las funciones
más importantes que necesariamente tengan que ser atendidas en el momento de producirse, tal como un
fallo de alimentación, etc.
 La interrupción enmascarable INT puede ser permitida o no, según 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 algún periférico conectado al terminal INT podrá pedir
interrupción en cualquier momento; pero ésta no será atendido si previamente el programa ha bloqueado
la posibilidad de acceso. La petición de interrupción podrá ser atendida siempre que por programa sea
permitida de nuevo. En el interior del propio P existe un biestable denominado IFF que puede ser
alterado por programa usando la instrucción EI (Enable Interrupt) para ponerlo a uno, permitiendo las
interrupciones, y la instrucción DI (Disable Interrupt) para ponerle a cero, bloqueando así la entrada de
interrupciones.
1.2.3. Modos de direccionamiento del P Z80
Los modos de direccionamiento conciernen a todos los medios puestos a disposición del procesador para
acceder a los datos a partir de los operandos de una instrucción. El P accede siempre a la memoria central
generando una dirección: no hay pues nada nuevo a este respecto. Sin embargo, los operandos de una
instrucción no tienen por qué ser una dirección real, sino un número, un indicativo a partir del cual el
procesador calcula la dirección real de la celda de memoria donde se encuentra el dato a tratar.
El P Z80 dispone de ocho modos de direccionamiento; para la descripción de cada uno de ellos se emplearán
instrucciones del repertorio de instrucciones del Z80:
 Direccionamiento implícito
El nombre de este direccionamiento se debe a que la instrucción no contiene la dirección del operando .
Algunos ejemplos de este direccionamiento son:
 INC HL: Incrementa en 1 el contenido del registro H.
 DEC B : Decremento en 1 el registro B y actualiza los indicadores del registro F.
 ADD A, B: Suma al acumulador (A) el contenido del registro B.
 ADD A, (IX+01h): Suma al Acumulador lo apuntado en la celda de memoria (IX+01h). El resultado
queda en A.

 Direccionamiento inmediato (instrucciones de 8bits)


No se trata de un modo de direccionamiento aunque se le considere como tal por deformación del
lenguaje. En efecto, el operando no es ni una dirección, ni un desplazamiento, ni un nombre de registro ,
sino el dato numérico a tratar por la instrucción. Es decir que el operando se encuentra contenido en la
propia instrucción y es un valor que se escribe numéricamente en la instrucción.
Algunos ejemplos de este direccionamiento son:
 LD B, 100 d: Carga con el valor 100 en decimal al registro B (inicializa en 100 el registro B).
 LD A, 4B h: Carga en el acumulador el valor 4B en hexadecimal (75d).

 Direccionamiento inmediato extendido (instrucciones de 16bits)


Este modo de direccionamiento es idéntico al anterior pero en este caso el dato está codi ficado 16 bits.
Se utiliza para cargar los registros de 16 bits HL, BC, DE, SP, IX, IY.
Algunos ejemplos de este direccionamiento son:
 LD SP, 8000 h: Inicializar el puntero de pila con la dirección 8000h.
 LD HL, C54F h: Inicializar el registro HL con la dirección de memoria C54F h.

Lenguaje de Máquina y Ensamblador. Z80. 11


Estructura y Funcionamiento de Computadoras II

 Direccionamiento extendido
Es un direccionamiento muy sencillo, ya que el operando es la dirección real de la celda 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 una palabra de 16 bits.
Algunos ejemplos de este direccionamiento son:
 LD A, (C745h): Cargar en el registro A el contenido de la celda de memoria cuya dirección es C745h.
 LD (C745h), A: Cargar en el contenido de la celda de memoria: C745h el contenido de A.
 Direccionamiento a través de registro
Este modo de direccionamiento está reservado para las operaciones internas del procesador que no
necesitan ningún acceso a memoria principal.
Algunos ejemplos de este direccionamiento son:
 LD B, D: Cargar en el registro B el contenido del registro D.
 LD A, C: Cargar en el registro A el contenido del registro C.
 Direccionamiento indirecto a través de registro
Este modo de direccionamiento no necesita operando. La dirección 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 dirección en 16
bits, se puede acceder a la totalidad del espacio de memoria. Este modo de direccionamiento es muy útil
para pasar parámetros a las subrutinas.
Algunos ejemplos de este direccionamiento son:
 LD A, (DE): Cargar en A el contenido de la celda de memoria cuya dirección está en el registro DE.
 LD (HL), A: Cargar en la celda de memoria cuya dirección está en el registro HL el contenido A.
 Direccionamiento indexado o relativo a una base
En este modo de direccionamiento el operando es un octeto con signo (-128 a 127)3. El P calcula la
dirección real mediante la suma del operando llamado desplazamiento más el contenido de uno de los
registros índice (IX o IY).
Algunos ejemplos de este direccionamiento son:
 LD A, (IX+01h): Cargar en el acumulador el contenido de la celda de memoria apuntada por el registro
IX más el desplazamiento; es decir una posición más.
 LD A, (IY+FF h): Cargar en el acumulador el contenido de la celda de memoria apuntada por el registro
IY más el desplazamiento; en este caso una posición menos (debido a que FF representa -1 en C2).
 Direccionamiento relativo al PC
En este caso el operando es un desplazamiento (octeto consigo). Este modo de direccionamiento sólo es
utilizado por el PC y permite efectuar bifurcaciones modificando su valor. El procesador realiza la
operación PC = PC +/- desplazamiento. La bifurcación relativa al PC resulta interesante porque es
independiente del lugar de la memoria central en el que se cargue el programa.
Algunos ejemplos de este direccionamiento son:
 JR -30d: La instrucción indica volver 30 octetos hacia atrás.
 Direccionamiento a través de la página cero
Este modo de direccionamiento es utilizado por el Z80 para una llamada especial a rutinas RESTART.
Esta instrucción fuerza en el PC una dirección de la página cero (los bits de mayor 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 10 H (llamada a subrutina) y RST 10H (RESTART).
Son totalmente equivalentes, aunque el CALL y su operando se codifiquen en 3 bytes mientras que el
RST sólo 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 instrucción está reservado a menudo para el SO y
corresponde a determinadas rutinas ROM. Su utilización no resulta cómoda y no es aconsejable para
principiantes.

3
Rango de representación en C2 cuando n=8bits.

Lenguaje de Máquina y Ensamblador. Z80. 12


Estructura y Funcionamiento de Computadoras II

1.2.4. Pila (Stack).


Una pila (en inglés stack) es un conjunto ordenado de elementos ubicada en memoria principal RAM, de los
cuales sólo uno de ellos se puede acceder a la vez. El punto de acceso se denomina cabecera o tope de la
pila. El número de elementos en la pila, o la longitud de la pila, es variable. Los elementos únicamente se
pueden agregar (añadir) o remover (eliminar) de la cabecera de la pila. Por esta razón, una pila también se
conoce lista de apilamiento o una lista de último en entrar primero en salir (LIFO: Last-In-First-Out).
El manejo de la pila requiere de dos operaciones: una operación coloca un nuevo elemento a la cabecera de
la pila y otra operación inversa que extrae el elemento que esté en la cabecera de la pila; en ambos casos la
cabecera de la pila se mueve.
Implementación de la pila
La pila es una estructura útil proporcionada como parte de una implementación de la CPU. Un uso de la pila
es manejar las llamadas y retornos de subrutinas. Las pilas también pueden ser útiles para el programador
con propósitos generales.
La implementación de una pila depende en parte de sus usos potenciales. Si es deseable hacer que las
operaciones de la pila estén disponibles para el programador, entonces el conjunto de instrucciones incluirá
operaciones orientadas a la pila, incluyendo PUSH (apilar o colocar), POP (desapilar o extraer) y las
operaciones que emplean uno o dos elementos de la cabecera de la pila como operandos. Ya que todas estas
operaciones se refieren a una localidad única, llamada cabecera de la pila, la dirección del operando u
operandos está implícita y no necesita incluirse en la instrucción. Estas son instrucciones de cero direcciones.
Si el mecanismo de la pila es utilizado sólo por la CPU para propósitos tales como el manejo de subrutinas,
entonces no serán explícitas las instrucciones orientadas a la pila en el conjunto de instrucciones. En cualquier
caso, la implementación de una pila requiere que exista algún conjunto de posiciones usadas para almacenar
los elementos de la pila. Un bloque contiguo de posiciones se reserva en la memoria principal (o en la
memoria virtual) para la pila. La mayor parte del tiempo, el bloque está parcialmente lleno con elementos de
la pila, y el resto del bloque está disponible para que crezca la pila.
Para el funcionamiento correcto se necesitan tres direcciones, normalmente memorizadas en registros de la CPU:
 Puntero de la pila (Stack Pointer-SP): Contiene la dirección de la cabecera de la pila. Si un elemento se agrega
o se elimina de la pila, el puntero se incrementa o decrementa para contener la dirección de la nueva cabecera
de la pila.
 Base de la pila: Contiene la dirección base del bloque reservado para la pila. Si se hace un intento de ejecutar
una instrucción POP cuando la pila está vacía, se reporta un error.
 Límite de la pila: Contiene la dirección del otro extremo del bloque reservado. Si se hace un intento de ejecutar
una instrucción PUSH cuando el bloque está utilizado en su totalidad por la pila, se reporta un error.
El P Z80 incluye el manejo de pila, tanto para el uso de subrutinas como para otros usos de programación,
para lo cual incluye en el set las correspondientes instrucciones PUSH y POP 4.
Funcionamiento de la pila
La gestión de la pila por el registro SP es muy sencilla. Al comenzar, cuando la pila está vacía, SP contiene
la dirección de una posición de memoria. Para cada escritura en la pila, el registro SP es decrementado en 1,
escribiéndose a continuación, el dato en la celda de memoria cuya dirección viene indicada por el contenido
del registro SP. De esta manera, los datos de la pila se colocan en direcciones contiguas dec recientes. Para
cada lectura hace el camino inverso; es decir, se lee la posición de memoria apuntada por SP y después se
incrementa en 1 este registro. En la Figura 1.11 se muestran estas operaciones:

Figura 1.11:
Implementación de la pila.

4
Ver en sección: Repertorio de Instrucciones del lenguaje ensamblador del µZ80, las instrucciones PUSH y POP.

Lenguaje de Máquina y Ensamblador. Z80. 13


Estructura y Funcionamiento de Computadoras II

Observe que la lectura no afecta a los valores guardados en la pila. Sólo queda modificado el SP.
La pila se utiliza para la llamada a las rutinas. La manipulación de la memoria pila se consigue a través de
las instrucciones de lenguaje de máquina CALL nn y RET 5. Cuando el procesador encuentra un CALL nn
bifurca a la dirección nn y continúa hasta que encuentra una dirección RET. En ese momento hay que volver
a la instrucción siguiente a la del llamado (nn+1). Esto significa que el procesador ha conservado en algún
sitio esta dirección; este sitio es la pila. El funcionamiento de la pila permite anidar las rutinas de forma casi
ilimitada. En efecto, la última dirección de retorno apilada corresponde al primer RET encontrado (esquema
LIFO). En la Figura 1.12 se muestran implementación de la pila con anidamiento:

Figura 1. 12: Implementación de la pila con anidamiento.


La dirección de la instrucción siguiente al CALL está en el PC. Cada CALL pone en la pila el PC y a
continuación lo carga con la dirección de comienzo de la subrutina. Para cada RET el PC saca la dirección
de la pila. Observe que son necesarias dos operaciones con la pila para colocar los 16 bits del PC después
de un CALL: (SP-1) = PC H y (SP-2)= PC L → SP = SP-2 y después de un RET: PCL = (SP) y PC H = (SP+1)
→ SP = SP+2.
1.2.5. Ensamblador del P Z80
Sintaxis del lenguaje ensamblador
En secciones anteriores se ha descripto que el lenguaje ensamblador es un lenguaje simbólico en el cual el
programador escribe las mismas instrucciones que en lenguaje de máquina. Un programa escrito en lenguaje
ensamblador está formado por una secuencia de sentencias, donde cada sentencia ocupa una línea del
programa y pueden ser de dos tipos:
 Instrucciones: Está formada por un mnemónico y uno o más operandos según corresponda. La
instrucción se compaginará (ensamblado) a una instrucción del P.
 Directivas del ensamblador: en este caso es información que necesita el ensamblador con respecto a las
direcciones de memoria que usa el programa.

Por lo tanto, cada línea del programa representa una instrucción o una directiva. De esta manera las
instrucciones del programa tienen una estructura bien definida. Dicha estructura está compuesta por 4 zonas
bien definidas llamadas campos, como se muestra en la Figura 1.13.

Figura 1.13: Campos o Zonas del programa fuente escrito en lenguaje ensamblador.

5
Ver en sección: Repertorio de Instrucciones del lenguaje ensamblador del µZ80, las instrucciones CALL y RET.

Lenguaje de Máquina y Ensamblador. Z80. 14


Estructura y Funcionamiento de Computadoras II

Cada zona cumple una función determinada:


 CAMPO 1 o Zona de Etiquetas
Una etiqueta es un nombre especial asignado a una línea, este nombre solo puede aparecer una vez. El
nombre de la etiqueta debe tener hasta 6 caracteres y su presencia no es obligatorio. Son muy útiles para
las instrucciones de bifurcación o de llamado a subrutinas. También es relevante utilizar nombres de
etiquetas significativas para identificar la tarea que esta realiza.
Por ejemplo es más simple escribir JP SEGUIR que es una instrucción de bifurcación a la línea cuya
etiqueta es SEGUIR; que haber escrito la instrucción JP A34Fh.
 CAMPO 2 o Zona de Operación
Esta zona está reservada para el mnemónico de una instrucción o directiva. El mnemónico usa 2, 3 o 4
letras que define una instrucción ejecutable del P, se forma usando una contracción de una palabra o
frase escrita en inglés. Por ejemplo:
 LoaD o carga se usa LD.
 JumP o salto se usa JP.
 Decrement and Jump if Not Zero o decrementa y salta si Z=0 se usa DJNZ.
 CAMPO 3 o Zona de Operando/s
Esta zona corresponde al operando de la instrucción escrita en el campo 2 o zona de operación. La forma
de escribir el operando está relacionada al modo de direccionamiento empleado (como se detalló en
secciones anteriores). El operando puede ser simple o doble.
Ejemplos de instrucción con operando Simple:
o INC B: Incrementa en 1 el contenido del registro B.
o DEC C: Decrementa en 1 el contenido del registro C.
o CP 0: La operación que realiza es A - 0 (ACUMULADOR menos el Operando).
 Ejemplos de instrucción con operando Doble:
Las instrucciones de carga son un caso de operando doble:
o LD B, A: Cargar en el registro B el contenido del registro A.
 CAMPO 4 o Zona de Comentarios
Esta zona está separado del resto de la línea por un espacio y un punto y coma (;). A continuación del
punto y coma se puede escribir el comentario que el programador desee, permitiendo de esta manera la
documentación del programa.
 Ejemplos de instrucción con comentario:
LD B, 18 d ; cargar el registro B con 18 en decimal para hacer el bucle 18 veces
JP OTRO ; salta a la etiqueta OTRO para continuar con el próximo dato de la tabla
Directivas
Las directivas o seudoinstrucción como ya se explico es información que necesita el ensamblador con
respecto a las direcciones de memoria que usa el programa. A continuación se describirán algunas directivas:
 ORG nn
Esta directiva se coloca al inicio del programa y establece la dirección de inicio en memoria de un
segmento de programa. El PC (contador de programa) se inicializa con la dirección obtenida nn.
Por ejemplo:
 ORG ABFF h; inicializa el CP con la dirección de memoria ABFF h
 END nn
Esta directiva debe colocarse al final del programa e indica que el programa fuente ha finalizado.
Por ejemplo:
 END EJERC; fin del programa EJERC (ejercicio)
 etiqueta EQU nn
Esta directiva asigna un valor numérico nn a la etiqueta.
Por ejemplo:
 DATOS EQU B12D h ; Al nombre de etiqueta DATOS le corresponde el valor en
hexadecimal B12D.

Lenguaje de Máquina y Ensamblador. Z80. 15


Estructura y Funcionamiento de Computadoras II

Repertorio de Instrucciones del lenguaje ensamblador del µZ80


Como se explicó en secciones anteriores, el µP Z80 posee un bus de datos de 8 bits, por lo que cada vez que
efectúa una operación de lectura de memoria lee un Byte completo; el cual puede ser una instrucción o un
dato. Con un código de operación de 8 bits se pueden codificar 256 operaciones distintas. El µP Z80 posee
158 instrucciones, pero si se tienen en cuenta los diferentes “modos de direccionamiento” puede llegar hasta
696 instrucciones. Por otro lado, en un gran número de instrucciones el operando consta de uno a varios
bytes que siguen al código de instrucción. Entonces, de acuerdo a la cantidad de bytes que ocupan el código
de operación y el operando encontramos instrucciones de un solo byte (tiene solo el código de operación, no
contienen operandos y ocupan una sola dirección de memoria) o instrucciones de varios bytes (ocupan dos,
tres o cuatro direcciones sucesivas de memoria).
El formato de las instrucciones consta de:
 Código de Operación
Este es el nombre mnemotécnico o simbólico que el compaginador identifica como la operación que
debe realizarse, puede consistir de uno o más bytes de acuerdo al formato de la instrucción.
 Operando/s
Son el/los dato/s, registro/s o la/s dirección/es de memoria sobre los cuales debe realizarse la operación
identificada por el código de operación. De acuerdo al formato, la instrucción puede tener uno o más
operandos y las diferentes formas de expresar los operandos en una instrucción determinan los modos
de direccionamiento; tema desarrollado en secciones anteriores.
Tipos de instrucciones
El repertorio de instrucciones del µZ80 es muy amplio. Podemos organizar las instrucciones en función de
la tarea que realizan en tres grupos:
 Instrucciones de transferencia de datos
Se trata de instrucciones que mueven información entre registros y posiciones de memoria. Pueden ser
instrucciones de transferencia de datos de 8 bits o de 16 bits según l os registros del µP que se estén
utilizando.
Instrucciones de transferencia de datos de 8 bits
Se trata de instrucciones que transfieren un dato de 8 bits desde un registro del µP, una posición de
memoria o un valor constante a un registro y viceversa.
A este grupo corresponden las instrucciones de carga: LOAD (LD); cuya estructura es la siguiente:
LD destino, origen
Dependiendo de la naturaleza del origen y el destino; podemos distinguir:
Cargar registro de 8 bits: memoria registro
Almacenar registro de 8 bits: registro memoria
Transferir: registro registro
Podemos aclarar que el origen y el destino en las instrucciones están definidos por uno de los modos de
direccionamiento permitidos.
A continuación se muestran algunos ejemplos de esta instrucción:
 LD (5333h), A ; Cargar el contenido del registro A en el contenido de la posición de memoria 5333 h.
 LD C, (HL) ; Almacenar en el registro C, el contenido de memoria que está en la celda de memoria
apuntada por el registro HL.
 LD A, B ; Transfiere el contenido del registro B al contenido del registro A.

Instrucciones de transferencia de datos de 16 bits


Como se ha mencionado el µP Z80 puede agrupar dos registros de 8 bits formando uno de 16 bits (BC,
DE, HL y B’C’, D’E’ y H’L’ y) y además de estos registro cuenta con los registros de 16 bits (IX, IY y
SP). Teniendo en cuenta que la memoria está organizada en palabras de 8 bits, este tipo de carga necesita
de dos bytes de memoria. Una palabra de 16 bits de memoria contiene el primer byte de menor peso
(byte débil o bajo) y en la siguiente dirección el byte de mayor peso (byte fuerte o alto). Como se muestra
en el siguiente ejemplo: el dato en hexadecimal A440 escrito en la dirección de memoria 3CF7:
40 3CF7 h
A4 3CF8 h

Lenguaje de Máquina y Ensamblador. Z80. 16


Estructura y Funcionamiento de Computadoras II

Como en las instrucciones de 8 bits, en las de 16 bits también corresponden las instrucciones de carga:
LOAD (LD); cuya estructura es la siguiente:
Cargar registro de 16 bits: memoria registro
Almacenar registro de 16 bits: registro memoria
Transferir: registro registro
También podemos aclarar que el origen y el destino en las instrucciones están definidos por uno de los
modos de direccionamiento permitidos.
A continuación se muestran algunos ejemplos de esta instrucción:
 LD IX, DE24 h ; Cargar el registro IX con la posición de memoria DE24 en hexadecimal.
 LD BC, (3CF7 h) ; Almacena en el registro B el dato A4 h y en el registro C el dato 40 h (observación 1).
 LD SP, HL ; Transfiere el contenido del registro HL al contenido del registro SP (observación 2).
Observaciones:
1. En este ejemplo se carga en B el dato A4 h que se obtiene de la dirección 3CF7 h; y de la posición de
memoria siguiente 3CF8 h se carga el dato 40 h en el registro C. El modo de direccionamiento de este
ejemplo es direccionamiento extendido.
40 3CF7 h B A4 h 40 h C
A4 3CF8 h
2. En el caso de la transferencia entre registros de 16 bits, solo está permitido cargar el registro SP con los
registros HL, IX o IX.
 Instrucciones aritméticas y lógicas
Estas instrucciones se usan para sumar, restar, comparar, AND, OR o XOR entre operandos de 8 bits,
donde uno de los operandos es el registro acumulador. En este grupo también encontramos la suma y la
resta con acarreo que son útiles para operar con números de más de 8 bits. Solo se explicaran las
instrucciones aritméticas.
 Instrucciones aritméticas (Sumar - Restar - Incrementar - Decrementar - Comparación)
o ADD A, B ; Sumar al acumulador con el contenido de B.
o SUB A, D ; Restar al acumulador el contenido de D.
y las de incremento o decremento
o INC C ; Incremento en 1 el contenido del registro D (observación 2).
o DEC B ; Decremento en 1 el contenido del registro B (observación 2).
Las instrucciones aritméticas actualizan los indicadores (bits o flags) del registro de estados del µP.
Otra instrucción aritmética muy usada es la instrucción CP (Comparación):
CP operando de 8 bits
La operación que se realiza es un resta: acumulador – operando; pero NO modifica el contenido del
registro acumulador. Está instrucción se usa para SETEAR o ASIGNAR valores a los bits del registro
de estado; es una instrucción muy práctica para testear condiciones en las instrucciones de salto.
Por ejemplo: Si el Acumular tiene el valor 20; entonces CP 0 realizará la operación 20 - 0 = 20; NO
modifica el contenido del acumulador pero SI actualiza los indicadores del registro F (uno de los bits
actualizado es el bit S; S=0 por ser el resultado de la operación positiva).
Observaciones:
3. En el caso del incremento o decremento con registros de 16 bits (por ejemplo: INC BC o DEC HL) NO
se actualizan los indicadores del registro F.
 Instrucciones de ruptura de secuencia
En la secuencia de instrucciones de un programa se pueden tomar decisiones y trasladar el control a un
nuevo conjunto de instrucciones. A este grupo de instrucciones los podemos dividir en 2 grupos:
Instrucciones de Salto sin retorno
Los saltos sin retorno trasladan el control a otra dirección de memoria y no retornan al programa
principal. Estos saltos causan la transferencia del control a otra posición de memoria y no guardan el
contenido anterior del PC. Estás pueden ser un salto sin retorno incondicional o condicional:
o Salto sin retorno incondicional: producen el salto sin ninguna condición:
 JP nn o JP etiqueta.

Lenguaje de Máquina y Ensamblador. Z80. 17


Estructura y Funcionamiento de Computadoras II

o Salto sin retorno condicional: estos saltos establecen las condiciones sobre los indicadores del
registro de estado para decidir si el salto se va a realizar. Estas condiciones pueden ser:
 JP C, mn o JP C, etiqueta: bit de acarreo es C=1.
 JP NC, mn o JP NC, etiqueta: bit de acarreo es C=0.
 JP Z, mn o JP Z, etiqueta: bit Z es Z=1; Z=1 si la última operación realizada dio CERO.
 JP NZ, mn o JP NZ, etiqueta: bit Z=0; Z=0 si la última operación realizada dio ≠ CERO.
 JP M, mn o JP M, etiqueta: bit S=1 si la última operación realizada dio un NEGATIVO.
 JP P, mn o JP P, etiqueta: bit S=0 si la última operación realizada dio un POSITIVO.
 JP PO, mn o JP PO, etiqueta: P/V=0; es decir PARIDAD IMPAR o No hay OVERFLOW.
 JP PE, mn o JP PE, etiqueta: P/V=1; es decir PARIDAD PAR o Si hay OVERFLOW.
Otra instrucción de salto sin retorno muy usada es la instrucción: DJNZ mn o DJNZ, etiqueta.
Esta instrucción decrementa el registro B y si el resultado es cero salta a mn o a etiqueta, caso contrario
no salta y continua con la próxima instrucción.
Instrucciones de Salto con retorno:
Los saltos con retorno trasladan el control del programa a otra dirección de memoria y luego retornan
al programa que lo invoco. Estás instrucciones se usan para llamar a una subrutinas y retornar de ellas
como se muestra en la Figura 1.14. Las subrutinas son segmentos de programas que se utilizan de forma
recurrente, y con el fin de evitar tener que escribirlas una y otra vez se escribe una sola vez. Cuando es
necesario utilizarla simplemente se la llama desde el programa principal, se ejecuta la subrutina y al
finalizar continúa el programa principal. Si el programa principal requiere intercalar una subrutina la
invoca con la instrucción CALL y para retornar de la subrutina lo realiza con la instrucción RET. Una
vez retornado al programa principal la ejecución continúa a partir de la instrucción ubicada después del
CALL.
Los llamados a las subrutinas realizan la misma acción que las instrucciones JUMP, con la diferencia
que salvaguardan el PC; es decir, recuerdan desde dónde se dio el salto y esto lo hacen almacenando la
dirección de retorno en la memoria pila; luego, en la subrutina, la instrucción de retorno hace que el
registro PC rescate de la pila dicha dirección de retorno.
El µP Z80 emplea para gestionar las llamadas y retornos de las subrutinas las instrucciones PUSH
(apilar) y POP (desapilar) que introducen y extraen datos respectivamente de la memoria pila
administrada por el SP (puntero a pila).

Figura 1.14: Programa con llamado a subrutina.


También es importante tener en cuenta el intercambio de datos entre el programa principal y la subrutina;
es decir, el intercambio de parámetros. Este intercambio de parámetros puede ser:
 Entrada: el programa principal comunica datos a la subrutina a través de los registros.
 Salida: la subrutina retorna datos al programa principal.
 E/S: envía y retorna datos.
Otro aspecto a tener en cuenta es que se debe prestar atención al orden de los PUSH y POP como se
observa en la Figura 1.12. Siempre se debe respetar la regla donde el primer PUSH corresponde al último
POP.

Lenguaje de Máquina y Ensamblador. Z80. 18


Estructura y Funcionamiento de Computadoras II

Bibliografía

 Organización y Arquitectura de Computadores. Stallings William. 7° Edición. PEARSON


EDUCACIÓN S.A., Madrid.
 Estructura y Arquitectura de Computadores - Guía Práctica. Versión 2.0.
 Programación del Z80. Rodnay Zaks. Ediciones Anaya Multimedia. Madrid.
 Programación del Z80 con ensamblador. Oliver Lepape. Parainfo. Madrid.
 Z80-CPU-Manual-SP.
 Set instrucciones Z80.
 Apuntes de Cátedra año 2022: Estructura y Funcionamiento de Computadoras I. Unidad 2:
Funcionamiento de la CPU.

Lenguaje de Máquina y Ensamblador. Z80. 19

También podría gustarte