Está en la página 1de 31

INTEL 8085

El Intel 8085 es un procesador de 8 bits fabricado por Intel a mediados de los 70.
Era binariamente compatible con el anterior Intel 8080 pero exigía menos soporte de
hardware, así permitía unos sistemas de microordenadores más simples y más baratos
de hacer.
El número 5 de la numeración del procesador proviene del hecho que solamente
requería una alimentación de 5 voltios, no como el 8080 que necesitaba unas
alimentaciones de 5 y 12 voltios. Ambos procesadores fueron usados alguna vez en
ordenadores corriendo el sistema operativo CP/M, y el procesador 8085 fue usado como
un microcontrolador.

Longitud de palabra

La longitud de palabra del microprocesador Intel 8085 es de 8 bits, o lo que es lo


mismo, 1 byte.

INTEL 8088

El 8088 fue lanzado en 1979.


El 8086 y el 8088 ejecutan el mismo conjunto de instrucciones. Internamente
son idénticos, excepto que el 8086 tiene una cola de 6 bytes para instrucciones y el 8088
de solo 4. Exteriormente se diferencian en que el 8086 tiene un bus de datos de 16 bits y
el del 8088 es de solo 8 bits, por ello, el 8086 era más rápido, mientras que el 8088
podía usar menos y más económicos circuitos lógicos de soporte, lo que permitía la
fabricación de sistemas más económicos.
El 8088 fue el microprocesador usado para el primer computador personal de
IBM, el IBM PC, que salió al mercado en agosto de 1981.
 Bus de datos de 8 bits
 Arquitectura interna de 16 bits
 Direccionamiento de 1Mb
 Clock de 5 MHz
 Modo máximo y modo mínimo
2.- Constitución básica de un microprocesador 8085.
El microprocesador posee una serie de “bloques internos” que se comunican
entre sí y con el exterior a través de unos conjuntos de líneas denominados buses que
sirven para transmitir señales y datos entre los distintos componentes. Puede apreciarse
con claridad la diferencia entre los buses internos, empleados por el microprocesador
para realizar sus operaciones internas y los buses externos, utilizados para comunicarse
con el exterior, es decir con componentes que están situados fuera del propio
microprocesador. Existen tres tipos de buses distintos:

2.2.1.- Bus de direcciones


Se crea en los registros de direccionamiento de 16 bits y se comunica con el
exterior mediante un conjunto de 16 líneas (líneas de direcciones) normalmente
enumeradas de A0 hasta A15. Por este bus, las direcciones salen siempre hacia el
exterior.

2.2.2.- Bus de datos


Se genera en el interior del microprocesador y lo utiliza para intercambiar
información entre sus distintos bloques internos y para comunicarse con el exterior.
Son un conjunto de 8 bits que utilizan 8 líneas de conexión al exterior, normalmente
denominadas D0 a D7. Por este bus sale y entra información, por tanto se trata de un
bus bidireccional.

2.2.3.- Bus de control


Compuesto por una serie de líneas, variable en número según el componente de
que se trate. Contiene las líneas de sincronización de funciones, pudiendo ser unas de
salida y otras de entrada al microprocesador. Algunas señales de control pueden ser por
ejemplo, las de lectura, escritura, reloj o clock, etc.
BUS DATOS INTERNO

ACUMULADOR
BUS DATOS
REGISTROS EXTERNO
INTERNOS DE 8
BITS

ALU CONTROL
REGISTROS
INTERNOS DE
16 BITS

REGISTRO DE BUS DE
BUS DE FLAGS CONTROL
DIRECCIONES
INTERNO

BUS DIRECCIONES EXTERNO FIG.12A

El bloque fundamental del microprocesador es el llamado ALU, representa la


parte del microprocesador que realiza las operaciones aritméticas y lógicas. Para llevar a
cabo este proceso emplean normalmente un registro especial denominado Acumulador
donde almacenan el resultado de las operaciones realizadas. Algunos microprocesadores
poseen más de un acumulador.

Para completar las indicaciones necesarias tras la ejecución de las instrucciones,


el microprocesador emplea además un registro especial de 8 bits denominado Registro
de Estado o Registro de Flags que marcarán distintas características y peculiaridades
de las operaciones desarrolladas. Posteriormente Se verá con más detalle este Registro
de Flags.

En la FIG.12A puede verse también un bloque denominado Control que sirve


para sincronizar el funcionamiento de todo el sistema. Genera señales de sincronismo
para la ALU, memorias y dispositivos de E/S. Las unidades de control generalmente
están constituidas basándose en microprogramación (programación interna no accesible
al usuario) y se encargan de descifrar y ejecutar las instrucciones del programa que
nosotros construyamos.

Puede verse además un bloque compuesto por Registros Internos de 8 bits, se


trata en este caso de una serie de registros (variable según el microprocesador de que se
trate) de uso general que emplea la ALU para manipular datos. Estos registros
normalmente almacenan palabras de 8 bits y en ocasiones pueden ser utilizados como
registros pares (de dos en dos) almacenando palabras o informaciones de 16 bits.

Hay también un bloque de Registros Internos de 16 bits que también son


llamados registros de direccionamiento. Están conectados al bus de direcciones y suele
haber dos registros de este tipo que son:

El Puntero de Pila, denominado abreviadamente SP, es indispensable durante


el desarrollo de programas tanto para trabajar con interrupciones como para el
tratamiento de subrutinas. El contenido del SP señalará en todo momento a la cima de la
pila. (La pila estará constituida por un bloque de memoria RAM, donde se almacenarán
de forma temporal los datos. Hablaremos de ella con posterioridad).

El Contador de Programa, denominado abreviadamente PC, es imprescindible


en todos los microprocesadores. Contiene la dirección de la siguiente instrucción que
deba ejecutarse y su contenido se va incrementando a medida que las instrucciones van
siendo ejecutadas. De todas formas el contenido del PC puede alterarse por programa
cuando se desee o cuando se necesite como posteriormente se verá, alterando de este
modo la ejecución secuencial de las instrucciones.
3.-Arquitectura del microprocesador 8085
Sintetizando, el microprocesador 8085 está constituido básicamente por tres grandes bloques:
una unidad de control, un conjunto de registros y una unidad aritmético-lógica.

-Unidad de control (UC).


-Registros internos del microprocesador (RI).
- Unidad aritmético-lógica ALU

Fig.- Estructura del microcontrolador


3.1.- Unidad de control.

La unidad de control es un bloque de lógica cableada dentro del CI. Esta parte del
sistema controla y sincroniza las transferencias de datos y las operaciones que se
realizan con ellos.

Por una parte, la unidad de control se le aplica la señal de reloj maestro de


microprocesador, por otra, las señales de control de otros elementos del sistema, para
interrumpir la secuencia del programa, y el bus de datos, a través del decodificador de
instrucciones con la información ya interpretada, para que la unidad pueda responder
con las señales adecuadas. Unas salidas de la unidad de control se dirigen a los
elementos externos del microprocesador (memoria y dispositivos de E/S) para indicar,
por ejemplo, que la operación en curso se trata de una lectura o de una escritura, otras a
los registros internos de la propia CPU.

Fig.3.1.-Unidad de control y buses.

La unidad de control, en resumen, regula la función básica del microprocesador


consistente en la búsqueda y posterior ejecución de instrucciones. Esta operación es
cíclica mientras no se interrumpa mediante una instrucción de paro (HALT). En el
estado de búsqueda se transfiere una instrucción desde la memoria hasta el
microprocesador y en el estado de ejecución se realiza esta operación.

3.2 Registros internos del microprocesador.

El 8085 tiene una serie de registros de propósito general denominados B, C, D,


E, H y L de 8 bits cada uno pueden operar en parejas, como se mencionó anteriormente
(se agrupan para este fin B con C, D con E y H con L). Se utilizan para
transformaciones internas y así obtener una mayor flexibilidad y rapidez de operación.
Los registros de propósito especial son: el Contador del Programa (CP), de 16 bits; el
Stack Pointer o puntero de pila (SP), 16 bits; los Registros Temporales, de 8 bits
cada uno, pero que pueden operar unidos; el Registro de direcciones, de 16 bits, cuyas
salidas son las patas del bus de direcciones del microprocesador, y el Registro de
Instrucción (RI), de 8 bits.

El Contador de Programa (CP) es un registro que memoriza la dirección de


la próxima instrucción a ejecutar o bien la dirección de parte de una instrucción formada
por más de un byte. Las instrucciones del 8085 y de todos los microprocesadores de 8
bits pueden ser de 1, 2 ó 3 bytes, ordenados de forma sucesiva en la memoria.

La unidad de control incrementa automáticamente en uno al contenido del CP


cada vez que termina un ciclo de búsqueda, salvo cuando aparece la instrucción HALT
(paro). La señal de RESET, que es una de las entradas de la unidad de control, coloca al
CP a cero e inicializa la ejecución del programa.

3.3.- Unidad aritmético-lógica.

La unidad de proceso completa del 8085 está formada por una ALU (Unidad
aritmético-lógica), que es un circuito combinacional capaz de realizar operaciones de
suma y resta, así como operaciones lógicas, un registro de 8 bits llamado Acumulador
(A) y un conjunto de cinco biestables o flags denominados registros de estado, que
ofrecen información relativa al resultado de las operaciones aritméticas o lógicas que se
realizan.

Fig.3.3.- Unidad aritmética lógica.

Cuando se realiza una operación, el acumulador contiene un operando y uno de los


registros temporales. El resultado de la operación se coloca en el acumulador
reemplazando al dato u operando que contenía anteriormente.
La denominación y situación de cada flag se muestra en el siguiente dibujo. CY es
el señalizador de arrastre, y su contenido pasa a ser 1 cuando se produce acarreo al
realizar una suma. AC es el señalizador de arrastre auxiliar. Se utiliza cuando se realizan
operaciones en BCD. Su valor será 1 cuando se produzca arrastre al efectuar la suma de
los bits de los operandos que ocupan el cuarto lugar por la derecha. S es el flag de signo
y su valor será 1 si el bit más significativo del resultado es 1. En caso contrario, será
cero. Z es el señalizador de cero y se pone a 1 cuando el resultado de una operación ha
sido cero. Por último, P es el flag de paridad y su valor será 1 cuando el número de bits
de una palabra depositada en acumulador sea par.

Fig.-Flags

S: (Signo) Z: (Cero)

Si el resultado es negativo S=1 Si el resultado es Cero Z=1

Si el resultado es positivo S=0 Si el resultado es diferente de cero Z=0

AC: (Carry auxiliar) P: (Paridad )

Si hay carry auxiliar AC=1 Si el resultado es par P= 1

Si no hay carry auxiliar AC=0 Si el resultado es impar P=0

CY: (Carry)

Si hay carry Cy=1

Si no hay carry Cy=0


4. Código máquina y nemónicos
El juego de instrucciones de un microprocesador lo constituye todo el conjunto de
expresiones binarias que el decodificador de instrucciones es capaz de interpretar. Es
evidente que cuanto mayor sea el número y más variado el repertorio mayor será la
operatividad del dispositivo y, en consecuencia, del sistema donde se integre.

El microprocesador, como todo circuito digital, opera con unos y con ceros
exclusivamente. Sin embargo, el sistema de codificación binario es muy engorroso para
ser utilizado como lenguaje de programación, ya que un dato o palabra, en un circuito
que utiliza un microprocesador como el 8085, está formado por 8 bits y una dirección
por 16 bits. Además, tales expresiones numéricas resultan en forma incomprensible.

Por este motivo, los equipos más elementales que se emplean para programar
admiten para la escritura de las instrucciones al menos la codificación hexadecimal. La
traducción a lenguaje binario, también denominado código máquina, se realiza con el
correspondiente decodificador hexadecimal/binario incorporado al equipo.

4.1. Acumulador Registro temporal

Lógicamente este sistema ofrece también grandes inconvenientes, tanto en la fase


de definición como en la de depuración, cuando el programa es complejo. Con el fin de
aproximar la escritura y lectura de programas al lenguaje habitual, se decidió expresar
las instrucciones de los microprocesadores utilizando la abreviatura o las siglas de la
palabra que define la operación que realiza. Dado el origen de las compañías fabricantes
de este tipo de dispositivos, estas palabras están expresadas en inglés. Así, por ejemplo,
la abreviatura MOV, que procede de MOVE y significa MOVER o TRASLADAR, se
utiliza para transferencia de datos entre registros internos o externos.

Estas expresiones se denominan nemónicos, que significa recordatorio. Por tanto,


las expresiones del microprocesador 8085 son un conjunto de 74 nemónicos
compatibles con las de otros dispositivos de INTEL, pero, desgraciadamente, distintas,
aunque realicen la misma operación, a las de otros fabricantes.

Existen equipos de programación que admiten directamente las instrucciones en


forma de nemónicos. Estos equipos disponen de un programa denominado assembler,
que traduce el programa escrito en leguaje ensamblador el sistema binario, que es el
único código capaz de ser interpretado por la máquina. Los equipos más complejos,
denominados genéricamente sistemas de desarrollo, son capaces de traducir a código
máquina cualquier programa escrito en lenguajes de alto nivel, tales como Pascal,
BASIC, etc. Estos equipos facilitan enormemente el desarrollo del software de un
sistema digital.

5. Tipos de instrucciones
El número de instrucciones que cada microprocesador puede interpretar y
ejecutar es distinto en cada caso. Así el 8085 está diseñado para admitir 74 instrucciones
básicas, de tal forma que, si contemplamos las variantes de algunas de ellas, este
dispositivo está preparado par a realizar 246 operaciones distintas.

5.1 Lista de instruciones 8085

Las instrucciones del 8085 se pueden clasificar en cinco grupo:

5.1.1.- Transferencia de datos entre registros o entre posiciones de memoria y registros.

5.1.2.- Operaciones aritméticas.

5.1.3.-Operaciones lógicas

5.1.4.-Bifurcaciones (salto).

5.1.5.- Instrucciones de stack, /S y control de máquina.

Existe un gran cantidad de clasificaciones que sin lugar a dudas ayudarían a comprender mas
sus características. Pero su dominio no está en memorizarlas sin darle sentido, si no el buscar
herramientas que permitan solucionar requerimientos. En programación siempre se empieza con
la estructura elemental, de allí se arma la estructura total. Si no hay practica no hay maestría.

Índice de instrucciones del microprocesador 8085

1Nro Instrucción Nro Instrucción Nro Instrucción Nro Instrucción


1 MOV 21 ANA 41 JP 61 RST
2 MVI 22 ANI 42 JPE 62 EI
3 CMP 23 XRA 43 CALL 63 DI
4 CPI 24 XRI 44 CC 64 IN
5 LXI 25 ORA 45 CNC 65 OUT
6 STAX 26 ORI 46 CZ 66 HLT
7 STA 27 CMC 47 CNZ 67 PUSH
8 LDAX 28 STC 48 CM 68 POP
9 LDA 29 DAA 49 CP 69 DAD
10 INR 30 NOP 50 CPE 70 XCHG
11 DCR 31 RLC 51 CPO 71 XTHL
12 INX 32 RRC 52 RET 72 SPHL
13 DCX 33 RAL 53 RC 73
14 ADD 34 RAR 54 RNC 74
15 ADC 35 JMP 55 RZ
16 ADI 36 JC 56 RNZ
17 ACI 37 JNC 57 RM
18 SUB 38 JZ 58 RP
19 SUI 39 JNZ 59 RPE
20 SBI 40 JM 60 RPO
Tabla 2.1 Set de instrucciones del microprocesador 8085A

No Nemonicos Sintesis de operación y ejemplos

0. Directiva General .ORG 0 : Posicion de programa en la DIRECTIVA

.data 2000H : Direccion donde empiezo a colocar mis datos, en 2000H


dB : Directiva asociada a adatos
dW : Directiva asociada a datos exadecimales.

.define : Asume una variable a un numero

Ejemplo:

dB 1,2,5 Coloca los datos 1,2,5 en forma secuencial en la tabla.


dW 1,3,4,4,1234H Coloca datos en la tabla pero ocupa 2 bytes.

1. MOV R1, R2 Movimiento


Direccionamiento registro.
Bits afectados: El contenido del registro R2 es transferido al registro R1. R1 y R2 pueden ser los registros B, C, D, E, H, L o el acumulador
Direccionamiento: A.
Registro registro
indirecto Supongamos que el registro B contiene 00H y el registro C contiene 30H
MOV B,C
almacenará 30H en el registro B.

MOV Reg, M Direccionamiento registro indirecto.


El contenido de la dirección de memoria, cuya dirección está en los registros H-L, es transferido al registro R. R puede ser
cualquiera de los registros A, B, C, D, E, H o L.

MOV M, Reg Direccionamiento registro indirecto.


El contenido del registro R es transferido a la dirección de memoria indicada por los registros H-L.

Supongamos que el registro H contiene 00H y el registro L contiene 30H. La instrucción


MOV M, A
almacenará el contenido del acumulador en la posición de memoria 0030H.

MVI R1, R2 Cargar un registro con un dato Inmediato

Bits afectados: El primer operando debe ser uno de los registros A, B, C, D, E, H o L, que será cargado con el dato especificado en el
segundo operando (DATOS). El dato no debe exceder de un byte.
Direccionamiento: La instrucción:
Inmediato MVI H, 33H
carga en el registro H el valor 33H, mientras que La instrucción
MVI L, 44H
carga en el registro L el valor 44H.

Supuestos los dos ejemplos anteriores, la instrucción


MVI M, Reg MVI M, 2AH
carga en la posición de memoria 3344H (dirección aportada por los registros H
y L) el valor 2AH.
3 CMP Reg Comparar registro o memoria con acumulador

El contenido del registro o posición de memoria especificados se compara con el contenido del acumulador. Esta
comparación se realiza restando internamente el contenido del registro al del acumulador, permaneciendo éste invariable, y
colocando los bits de condición en función del resultado. Concretamente, el bit de cero se pone a uno si las cantidades
comparadas son iguales, y se pone a cero si son desiguales.

Si el acumulador almacena 0AH y el registro B contiene 05H


CMP B
Compara B con el acumulador efectuando una resta interna.
1. El registro B contiene 05H, se complementa a 2.

Registro 05H: 0 0 0 0 0 1 0 1
Complemento 1 C-1: 1 1 1 1 1 0 1 0
Compemento 2 C-2: + 1
Dato complementado FBH: 1 1 1 1 1 0 1 1

Acumulador 0AH: 0 0 0 0 1 0 1 0
Dato complementado FBH: + 1 1 1 1 1 0 1 1
Nuevo acumulador 05H: 0 0 0 0 0 1 0 1
CY=0 Z=0

El bit de cero se pondra a cero puesto que son desiguales. Z=0

CMP M

4 CPI dato Comparar el contenido del acumulador con un dato Inmediato

Flags afectados: Compara el valor del byte especificado con el contenido del acumulador y posiciona los bits de cero y acarreo para indicar
Z, S, P, CY, AC el resultado. El bit de cero indica igualdad. Un 0 en el acarreo indica que el contenido del acumulador es mayor que DATOS.
Un 1 en el acarreo indica que el acumulador es menor que DATOS. Sin embargo, el significado del bit de acarreo es contrario
Direccionamiento: cuando los valores tienen diferente signo o cuando uno de los valores está complementado. El valor de DATOS no debe
Registro indirecto exceder de un byte.
Si tenemos la secuencia de instrucciones
(1).MVI A, 25H
(2).CPI 20H
La instrucción (1) carga en el acumulador el valor 25H.
La instrucción (2) realiza la siguiente operación de suma (tomando el
complemento a dos del dato inmediato, es decir, E0H):

DATO 20H: 0 0 1 0 0 0 0 0
Complemento 1 C-1: 1 1 0 1 1 1 1 1
Compemento 2 C-2: + 1
Dato complementado E0H: 1 1 1 0 0 0 0 0

Acumulador 25H: 0 0 1 0 0 1 0 1
Dato complementado E0H: + 1 1 1 0 0 0 0 0
Nuevo acumulador 05H: 0 0 0 0 0 1 0 1
Cy=1

Las banderas son afectas. CPI X>Y X=Y X<Y


Z 0 1 0
Cy 0 0 1
S Z X A X P X Cy

Cargar un par de registros con un dato Inmediato


5 LXI Reg,dato
LXI es una instrucción de 3 bytes; su segundo y tercer byte contienen el dato que ha de ser cargado en el par de
Bits afectados: registros (PR). El primer operando debe especificar el par de registros a ser cargados, pueden ser los pares BC, DE, HL, o el
Direccionamiento: SP. El segundo operando especifica los dos bytes a ser cargados. LXI es la única instrucción inmediata que acepta un valor de
Inmediato 16 bits. El resto trabajan con datos de 8 bits.
Si el par de registros especificados es SP, el segundo byte de la instrucción sustituye a los 8 bits menos significativos del
puntero de pila, mientras que el tercer byte de la instrucción reemplaza a los 8 bits más significativos del puntero de pila.
1. La instrucción
LXI B, 00FFH
carga en el registro B el valor 00H y en el registro C el valor FFH.
2. La siguiente instrucción carga en el puntero de pila el valor 1000H
LXI SP, 1000H

6 STAX Reg Almacenar el contenido del acumulador


Bits afectados: El contenido del acumulador se almacena en la posición de memoria especificada por los registros B y C, o los registros
Direccionamiento: D y E.
Registro indirecto
Si el registro B contiene 3FH y el registro C contiene 16H, la instrucción
STAX B
almacenará el contenido del acumulador en la posición de memoria 3F16H.

7 STA Dir Almacenamiento directo desde el Acumulador


Direccionamiento: STA DIR almacena una copia del contenido actual del acumulador en la posición de
Directo memoria especificada por DIR.
Todas las instrucciones que se muestran a continuación introducen el contenido del
acumulador en la posición de memoria 0080H:
STA 0080H

8
LDAX Reg Cargar el acumulador
El contenido de la posición de memoria especificada por los registros B y C, o los registros D y E, reemplaza el
contenido del acumulador.
Si el registro D contiene 3FH y el registro E contiene 16H, la instrucción
LDAX D
cargará en el acumulador el contenido de la posición de memoria 3F16H.

9
LDA Dir Carga directa en el acumulador
Bits afectados:
Direccionamiento: LDA DIR carga el acumulador con el contenido de la memoria direccionada por DIR. La dirección puede ser puesta como un
Registro indirecto número, una etiqueta previamente definida o una expresión.
A continuación se introducen en el acumulador el contenido de la posición de memoria 1000H:
LDA 1000H

10 INR Reg Incrementar registro o memoria


Bits afectados: El contenido del registro o posición de memoria especificados se incrementa en una
Z, S, P, AC unidad.
Direccionamiento: Si el registro A contiene 98H, la instrucción
Registro indirecto INR A
hará que este registro contenga la cantidad 99H

Decrementa registro o memoria


11 DCR Reg El contenido del registro o posición de memoria especificados se incrementa en una
Bits afectados: unidad.
Z, S, P, AC Si el registro A contiene 99H, la instrucción
Direccionamiento: DCR A
Registro indirecto hará que este registro contenga la cantidad 98H.

Incrementar par de registros


12 INX Reg
Direccionamiento: El número de 16 bits contenido en el par de registros especificado se incrementa en una
Registro unidad.
1. Suponiendo que los registros H y L contienen respectivamente 30H y 00H, la
instrucción
INX H
hace que el registro H contenga 30H y el registro L el valor 01H.
2. Si el puntero de pila contiene FFFFH, la instrucción
INX SP
hace que éste contenga 0000H.
13 DCX Reg Decrementar par de registros
Direccionamiento:
Registro El número de 16 bits contenido en el par de registros especificado se decrementa en una
unidad.
Suponiendo que los registros H y L contienen respectivamente 30H y 00H, la
instrucción
DCX H
hace que el registro H contenga 2FH y el registro L el valor FFH.

14
ADD Sumar registro o memoria al acumulador (Suma Aritmética)
Bits afectados: El contenido del registro o posición de memoria especificados se suma al contenido del acumulador, usando
Z, S, P,CY, AC aritmética de complemento a dos. El resultado se guarda en el acumulador.
Direccionamiento: 1. Si el registro B contiene el valor 3AH y el acumulador contiene 6CH, la instrucción
Registro ADD B
realiza la siguiente suma:

Registro B 3AH: 0 0 1 1 1 0 1 0
Acumulador 6CH: + 0 1 1 0 1 1 0 0
Nuevo acumulador A6H: 1 0 1 0 0 1 1 0

2. La instrucción
ADD A
duplica el contenido del acumulador.

Sumar registro o memoria al acumulador con acarreo


ADC Reg
Bits afectados: El contenido del registro o posición de memoria especificados más el contenido del bit de acarreo, se suman al
Z, S, P,CY, AC contenido del acumulador.
Direccionamiento:
15 Registro indirecto Supongamos que el registro B contiene el valor 30H, el acumulador 76H, y el bit de
acarreo está puesto a cero. La instrucción 18 Simulador del microprocesador 8085
ADC C
realizará la siguiente suma:

Registro B 30H: 0 0 1 1 0 0 0 0
Acumulador 76H: 0 1 1 1 0 1 1 0
Bit de acarreo + 0
Nuevo acumulador A6H 1 0 1 0 0 1 1 0

El nuevo contenido del acumulador será A6H, mientras que todos los bits de condición quedarán puestos a cero excepto
los de signo y paridad. Si el bit de acarreo hubiera sido 1 antes de realizar la operación, hubiera tenido lugar la siguiente
suma:

Registro B 30H: 0 0 1 1 0 0 0 0
Acumulador 76H: 0 1 1 1 0 1 1 0
Bit de acarreo 1
Nuevo acumulador A7H 1 0 1 0 0 1 1 1

El acumulador contendría ahora A7H y todos los bits de condición excepto el de


signo, estarían puestos a cero.

16 ADI Sumar al acumulador un dato Inmediato


Bits afectados:
Z, S, P, CY, AC Suma el valor del byte especificado en la instrucción (DATOS), al contenido del
acumulador y deja el resultado en el acumulador. El dato debe ser expresado en forma
de número, un ASCII constante, la etiqueta de un valor previamente definido o una
expresión. El dato no debe exceder de un byte.
Se utiliza aritmética de complemento a dos.

Ejemplo
A continuación presentamos un ejemplo con 3 instrucciones:
(1).MVI A, 34
(2).ADI 20
(3).ADI -20

En todas las instrucciones se utilizan datos en base decimal. Así, por ejemplo, en
la instrucción (2) el valor 20 es 14H.
La instrucción (1) carga en el acumulador el valor 22H.
La instrucción (2) realiza la siguiente suma

Acumulador 22H: 0 0 1 0 0 0 1 0
Dato inmediato 14H: + 0 0 0 1 0 1 0 0
Nuevo acumulador 36H: 0 0 1 1 0 1 1 0

El bit de paridad se pone a uno y el resto se quedan a cero.


La instrucción (3) restaura el valor del acumulador realizando la siguiente suma:

Acumulador 36H: 0 0 1 1 0 1 1 0
Dato inmediato ECH: + 1 1 1 0 1 1 0 0
Nuevoa acumulador 22H: 0 0 1 0 0 0 1 0

Ahora los bits de paridad, acarreo y acarreo auxiliar se quedan a uno y el resto a cero.

17 ACI dato Sumar al acumulador un dato Inmediato con arrrastre


Bits afectados:
Z, S, P, CY, AC Suma el contenido del byte especificado (DATOS) en la instrucción, al contenido del
acumulador, añadiendo además el bit del acarreo. El resultado se almacena en el
acumulador (perdiéndose así el anterior contenido del Acumulador).

El dato (DATOS) debe estar especificado en forma de número, en ASCII


constante, como etiqueta de un valor previamente definido o una expresión. El dato no
debe exceder de un byte.

Tenemos las siguientes instrucciones:


(1).MVI A, 34
(2).ACI 20
y suponemos el bit de acarreo puesto a uno.
La instrucción (1) carga en el acumulador el valor 22H.
La instrucción (2) realiza la siguiente suma:

Registro B 22H: 0 0 1 0 0 0 1 0
Acumulador 14H: 0 0 0 1 0 1 0 0
Bit de acarreo + 1
Nuevo acumulador 37H: 0 0 1 1 0 1 1 1

Todos los bits se ponen a cero.

Restar registro o memoria del acumulador


18 SUB Reg
Bits afectados: El contenido del registro o posición de memoria especificados se resta al contenido del acumulador, usando
Z, S, P,CY, AC aritmética de complemento a dos. El resultado se guarda en el acumulador.
Direccionamiento: Si no hay acarreo del bit de más peso, el bit de acarreo se pone a uno, y viceversa, al contrario de lo que ocurre
Registro indirecto con la operación de suma.
Antes de entrar en los ejemplos recordamos que restar utilizando aritmética de
complemento a dos equivale a complementar cada bit del segundo operando y sumar 1.
1. Si el acumulador contiene 60H y el registro E contiene 28H, la instrucción
SUB E
realizará la siguiente operación de resta: (Registro B)+(-28H)

Acumulador 60H: 0 1 1 0 0 0 0 0
Dato inmediato 28H: 0 0 1 0 1 0 0 0
Registro E 28H: 0 0 1 0 1 0 0 0
Complemento 1 C-1: 1 1 0 1 0 1 1 1
Compemento 2 C-2: + 1
Dato complementado D8H: 1 1 0 1 1 0 0 0

Acumulador 60H: 0 1 1 0 0 0 0 0
Dato complementado D8H: + 1 1 0 1 1 0 0 0
Nuevo acumulador 38H 0 0 1 1 1 0 0 0

A=38H

El acumulador obtiene un nuevo valor A=38H.

19 SUI dato Restar del acumulador un dato Inmediato


Bits afectados Descripción
Z, S, P, CY, AC El byte de datos inmediato se resta del contenido del acumulador usando aritmética de complemento a dos. El resultado se
deja en el acumulador.
Ya que se trata de una operación de resta, el bit de acarreo se pone a uno cuando no hay acarreo del bit de más peso, y se pone
a cero si tiene dicho acarreo.

A continuación presentamos un ejemplo con 2 instrucciones:


(1).MVI A, B3H
(2).SUI B3H
La instrucción (1) carga en el acumulador el valor B3H.
La instrucción (2) realiza la siguiente suma (usando el complemento a dos del
dato inmediato):

Dato inmediato B3H: 1 0 1 1 0 0 1 1


Complemento 1 C-1: 0 1 0 0 1 1 0 0
Compemento 2 C-2: + 1
Dato complementado 4DH: 0 1 0 0 1 1 0 1

Acumulador B3H: 1 0 1 1 0 0 1 1
Dato complementado 4DH: + 0 1 0 0 1 1 0 1
Nuevo acumulador 00H: 0 0 0 0 0 0 0 0

Como era de esperar el resultado final del acumulador es cero ya que le estamos restando su propio valor. El valor 6DH del
dato inmediato corresponde al complemento a dos del valor B3H que estamos restando.
Debido a que existe desbordamiento del séptimo bit se produce acarreo y se pone el bit de acarreo a cero.
El bit de paridad se pone a uno mientras que los demás permanecen inactivos.

20 SBI Restar del acumulador un dato Inmediato con arrrastre

El bit de acarreo se suma internamente al byte de datos inmediato. El valor obtenido se resta del contenido del
acumulador usando aritmética de complemento a dos. El resultado se deja en el acumulador.
Esta instrucción, al igual que SBB, se usa preferentemente para realizar restas multi-byte. Al igual que en el apartado anterior,
el bit de acarreo se pone a uno si no hay acarreo del bit de más peso, poniéndose a cero si lo hay.

Tenemos las siguientes instrucciones:


(1).MVI A, 00H
(2).SBI 01H
y suponemos el bit de acarreo puesto a cero.
La instrucción (1) carga en el acumulador el valor 00H.
La instrucción (2) realiza la siguiente suma (usando el complemento a dos del
dato inmediato):

Acumulador 00H: 0 0 1 0 0 0 0 0
Dato inmediato FFH: 1 1 1 1 1 1 1 1
Bit de acarreo + 0
Nuevo acumulador FFH: 1 1 1 1 1 1 1 1

Cy=1
Z=0
Ca=0
No hay acarreo, por lo que el bit de acarreo se pone a uno. Los bits de cero y
acarreo auxiliar están a cero, mientras que los de signo y paridad se ponen a uno.

ANA Reg
21 Bits afectados: Función lógica AND entre registro o Memoria con acumulador
Z, S, P,CY, AC
Direccionamiento: Se realiza la función lógica AND bit a bit entre el contenido del registro o posición de memoria especificados y el contenido
Registro indirecto del acumulador. El bit de acarreo se pone a cero.

La tabla de verdad de la función lógica AND es:


A B f
0 0 0
0 1 0
1 0 0
1 1 1
Si el registro B contiene 6CH y el acumulador almacena 3AH, la instrucción
ANA B
realiza la siguiente operación:Si el registro B contiene 6CH y el acumulador almacena 3AH, la instrucción
ANA B
realiza la siguiente operación:

Acumulador 3AH: 0 0 1 1 1 0 1 0
Dato inmediato 6CH: 0 1 1 0 1 1 0 0
Nuevo acumulador 28H: 0 0 1 0 1 0 0 0

22 ANI datos Función lógica AND entre el acumulador y un Dato Inmediato


Bis afectados: Realiza una operación Y lógica entre el dato (DATOS) especificado en la instrucción y el contenido del acumulador, el
Z, S, P, resultado queda en el acumulador. Se pone a cero el bit de acarreo. El dato, que no debe exceder de un byte, puede ser
CY, AC expresado en forma de número, un ASCII constante, la etiqueta de algún valor previamente definido o una
Expresión.
Disponemos de las siguientes instrucciones:
(1).MVI A, A0H
(2).ANI 0FH
La instrucción (1) carga en el acumulador el valor A0H.
La instrucción (2) realiza la siguiente operación AND bit a bit entre el
acumulador y el dato inmediato 0FH:
Acumulador A0H: 1 0 1 0 0 0 0 0
Dato inmediato 0FH: 0 0 0 0 1 1 1 1
Nuevo acumulador 00H: 0 0 0 0 0 0 0 0

La instrucción ANI del ejemplo pone a cero los cuatro bits de mayor peso,
dejando invariables los cuatro menores. Ya que los cuatro bits de menor peso del
acumulador eran cero, el resultado final es 00H con lo que el bit de cero se pondrá a
cero.

23 XRA Reg Función lógica O-EXCLUSIVO entre registro o memoria con acumulador.
Bits afectados: Se realiza la función lógica O-EXCLUSIVO bit a bit entre el contenido del registro o
Z, S, P,CY, AC posición de memoria especificados y el contenido del acumulador, guardándose el
Direccionamiento: resultado en este último.
Registro
La tabla de verdad de la función lógica O-EXCLUSIVO es:
A B f
0 0 0
0 1 1
1 0 1
1 1 0

1. Si el registro B contiene 6CH y el acumulador almacena 3AH, la instrucción


XRA B
realiza la siguiente operación:
Acumulador 3AH: 0 0 1 1 1 0 1 0
Registro B 6CH: 0 1 1 0 1 1 0 0
Nuevo acumulador 56H: 0 1 0 1 0 1 1 0

La función O-EXCLUSIVO de cualquier bit con uno da lugar al complemento del mismo. Así, si el acumulador contiene todo
unos, la instrucción
XRA B
produce el complemento a uno del contenido del registro B, y lo guarda en el acumulador.

En algunas ocasiones, un byte se utiliza para reflejar los estados de ciertas condiciones dentro de un programa, donde cada
uno de los ocho bits puede responder a una determinada condición de falso o verdadero, actuado o inhibido, etc.
Mediante la función O-EXCLUSIVO podemos determinar cuántos bits de la palabra han cambiado de estado en un
determinado lapsus de tiempo.

XRI Dato Función lógica O-EXCLUSIVO entre el acumulador y un dato Inmediato


24 Bits afectados: Se realiza la función lógica O-EXCLUSIVO bit a bit entre un byte de datos inmediatos y el contenido del acumulador. El
Z, S, P, CY, AC resultado se guarda en el acumulador. El bit de acarreo se pone a cero.
Ejemplo
Esta instrucción se suele utilizar para complementar bits específicos del acumulador dejando los restantes en su estado
original. De este modo y suponiendo que el acumulador contiene ABH, la instrucción
XRI 80H
complementa el bit de más peso del acumulador, tal y como se muestra en la siguiente figura:
Acumulador ABH: 1 0 1 0 1 0 1 1
Dato inmediato 80H: 1 0 0 0 0 0 0 0
Nuevo acumulador 2BH: 0 0 1 0 1 0 1 1

Función lógica OR entre registro o memoria con acumulador


Se realiza la función lógica AND bit a bit entre el contenido del registro o posición de
memoria especificados y el contenido del acumulador, quedando en este último el
resultado. El bit de acarreo se pone a cero.
La tabla de verdad de la función lógica OR es: A B f
25 ORA Reg 0 0 0
Bits afectados: 0 1 1
Z, S, P,CY, AC 1 0 1
Direccionamiento: 1 1 1
Registro indirecto

Como sea que la función OR de cualquier bit con un uno da como resultado uno, y de
cualquier bit con cero, lo deja invariable, esta función se utiliza frecuentemente para
poner a uno grupos de bits.
Si el registro B contiene OFH y el acumulador almacena 33H, la instrucción
ORA B
realiza la siguiente operación:
Acumulador 33H: 0 0 1 1 0 0 1 1
Registro B 0FH: 0 0 0 0 1 1 1 1
Nuevo acumulador 3FH: 0 0 1 1 1 1 1 1

Este ejemplo concreto garantiza que los cuatro bits de menos peso del
acumulador son unos, mientras que los demás permanecen invariables.

26 ORI datos Función lógica OR entre el acumulador y un dato Inmediato


Bits Afectados: Z, S, P, ORI desarrolla una operación lógica OR entre el contenido especificado por DATOS y el contenido del acumulador. El
CY, AC resultado se deja en el acumulador. Los bits de acarreo y acarreo auxiliar se ponen a cero.
Ejemplo
Si el acumulador inicialmente contiene 3CH, la instrucción
ORI F0H
realiza la siguiente operación OR bit a bit:
Acumulador 3CH: 0 0 1 1 1 1 0 0
Dato inmediato F0H: 1 1 1 1 0 0 0 0
Nuevo acumulador FCH: 1 1 1 1 1 1 0 0
Como vemos la instrucción ORI de nuestro ejemplo activa los cuatro bits de menor peso, dejando invariables los restantes.

Complementar acarreo
27 CMC Si el bit de acarreo es 0, se pone a 1. Si es un 1, se pone a 0.
Bits Afectados Cy

Activar acarreo
28 STC El bit de acarreo se pone a 1.

DAA Ajuste decimal del acumulador


Bitsafectados El número hexadecimal de 8 bits contenido en el acumulador se ajusta como dos dígitos de 4 bits codificados en binario
Z,S,P,CY,AC decimal, según el proceso siguiente:
Direccionamiento (1).Si los cuatro bits menos significativos del acumulador representan un número mayor que 9, o si el bit de acarreo auxiliar
Registro es igual a uno, el acumulador se incrementa en seis unidades. Si no se presentan tales condiciones, el contenido
del acumulador no varía.

(2).Si los cuatro bits más significativos del acumulador representan ahora un número mayor que 9, o si el bit de acarreo es
uno, los cuatro bits más significativos se incrementan en seis unidades. Asimismo, si no tienen lugar las
29 circunstancias expuestas, el contenido del acumulador no se incrementa. Si hay acarreo de los cuatro bits menos significativos
durante el paso (1), el bit de acarreo auxiliar se pone a 1; si no lo hay, se pone a 0. Por otra parte, si hay acarreo de los cuatro
bits más significativos durante el paso (2), se activará el bit de acarreo, poniéndose a cero si no se produce acarreo.

Esta instrucción se utiliza en las operaciones de suma de números decimales. Es la única instrucción cuya operación depende
del bit de acarreo auxiliar.

Supongamos que queremos realizar una suma decimal de dos números (40 + 80).
Ambos bits de acarreo están a cero.
La secuencia de instrucciones podría ser:
(1).MVI B,80H
(2).MVI A,40H ; Acumulador = 40H
(3).ADD B ; Acumulador = 40H + 80H = C0H
(4).DAA ; Acumulador = 20H
; Bit de acarreo = 1

La instrucción DAA opera de la siguiente forma:


1. Como el contenido de los bits [0 – 3] del acumulador es menor que 9 y el bit de
acarreo auxiliar es cero, el contenido del acumulador no varía.
2. Como los 4 bits más significativos del acumulador representan un número
mayor que 9, estos 4 bits se incrementan en 6 unidades, poniendo a uno el bit de
acarreo.
Acumulador C0H: 1 1 0 0 0 0 0 0 Cy=0
+6 60H: 0 1 1 0 0 0 0 0 Cy=0
Nuevo acumulador 20H: 0 0 1 0 0 0 0 0 Cy=1

En resumen puedes obtener un resultado en DECIMAL a partir de una operaciion HEXADECIMAL

30 NOP No se realiza ninguna operación.

Desplazar el acumulador a la izquierda Rotate Left Carry


31 RLC RLC rota un bit hacia la izquierda todo el contenido del acumulador, transfiriendo el bit
Bits Afectado Cy de más alto orden al bit de acarreo y al mismo tiempo a la posición de menor orden del
acumulador.

Cy Az Acc Ao

...
Desplazar el acumulador a la derecha Rotate Rigth Carry
32 RRC RRC rota el contenido del acumulador un bit a la derecha, transfiriendo el bit de más bajo orden a la posición de más alto
Bits Afectado Cy orden del acumulador, además pone el bit de acarreo igual al bit de menor orden del acumulador.
Supongamos que el acumulador

Cy Az Acc Ao

...

Desplazar el acumulador hacia la izquierda a través del bit de acarreo Rotate Arraund Left
33 RAL RAL hace girar el contenido del acumulador y el bit de acarreo un espacio de un bit hacia la salida (izquierda). El bit de
acarreo que es tratado como si fuera del acumulador, se transfiere el bit de menor orden del acumulador. El bit de mayor
orden del acumulador se transfiere al bit de acarreo. No tiene operandos.

Cy Az Acc Ao

...

Rotate Arround the Rigth


RAR RAR rota el contenido del acumulador y del bit de acarreo 1 bit de posición a la derecha. El bit de acarreo que es tratado
34 como si fuera parte del acumulador se transfiere al bit de más alto orden del acumulador. El bit de menor peso del acumulador
se carga en el bit de acarreo. No existen operandos en la instrucción RAR.

Cy Az Acc Ao

...

JMP dir
35 Salto incondicional

La instrucción JMP DIR altera la ejecución del programa cargando el valor especificado
por DIR en el contador de programa.
JC dir
36 La instrucción JC DIR comprueba el valor del bit de acarreo. Si es un 1 la ejecución del
programa continúa en la dirección especificada por DIR. Si es un 0 el programa
continúa su ejecución normal de forma secuencial.

JNC dir Saltar si no hay acarreo


37 La instrucción JNC DIR comprueba el estado del bit acarreo. Si esta a 0 el programa cambia a la dirección especificada por
DIR. Si esta a 1 la ejecución del programa continúa normalmente.

JZ dir Saltar si hay cero


38 La instrucción JZ DIR comprueba el bit de cero. Si está a 1 el programa continúa en la
dirección expresada por DIR. Si está a 0 continúa con la ejecución secuencial normal.

JNZ dir Saltar si no hay cero


39 La instrucción JNZ DIR comprueba el valor del bit de cero. Si el contenido del acumulador no es cero (Bit de cero = 0) el
programa continúa en la dirección especificada por DIR. Si el contenido del acumulador es cero (Bit de cero = 1) el
programa continúa su ciclo normal.

JM dir Saltar si hay signo negativo


40 La instrucción JM DIR comprueba el estado del bit de signo. Si el contenido del acumulador es negativo (bit de signo = 1) la
ejecución del programa continúa en la dirección especificada por DIR. Si el contenido del acumulador es positivo (bit de
signo = 0) continúa la ejecución de la secuencia normal.
JP dir Salta si hay signo positivo
41 La instrucción JP DIR comprueba el estado de bit del signo. Si el contenido del acumulador es positivo (bit de signo = 0) la
ejecución del programa continúa con la dirección especificada por DIR. Si el contenido del acumulador es negativo (bit de
signo = 1) continúa el programa con su ejecución normal.

JPE dir Salta si la paridad es par


42 La paridad existe si el byte que esta en el acumulador tiene un número par de bits. El bit de paridad se pone a 1 para indicar
esta condición.
La instrucción JPE DIR comprueba la situación del bit de paridad. Si esta a 1, la ejecución del programa continúa en la
dirección especificada por DIR. Si esta a 0, continúa con la siguiente instrucción de forma secuencial.
Las instrucciones JPE y JPO son especialmente usadas para comprobar la paridad de los datos de entrada. (Sin embargo con
la instrucción IN los bits no actúan.
Esto puede evitarse sumando 00H al acumulador para activarlos).

CALL dir
43 Llamada incondicional

CALL guarda el contenido del contador de programa (la dirección de la próxima instrucción secuencial) dentro del stack y a
continuación salta a la dirección especificada por DIR.

Cada instrucción CALL o alguna de sus variantes implica una instrucción RET (retorno), de lo contrario el programa podría
"perderse" con consecuencias impredecibles. La dirección debe ser especificada como un número, una etiqueta, o una
expresión. La etiqueta es lo más normal (El ensamblador invierte los bytes alto y bajo de dirección durante el proceso de
ensamblado). Las instrucciones CALL se emplean para llamadas a subrutinas y debemos tener presente que siempre emplean
el stack.

Llamada si hay acarrero


44 CC dir CC comprueba el estado del bit de acarreo. Si el bit está a 1, CC carga el contenido del contador de programa en el stack y a
continuación salta a la dirección especificada por DIR. Si el bit esta a 0, la ejecución del programa continúa con la próxima
instrucción de su secuencia normal. Aunque el uso de una etiqueta es lo más normal, la dirección puede ser especificada
también como un número o una expresión.

CNC dir Llamar si no hay acarreo.


45 CNC chequea el valor del bit de acarreo. Si está en cero CNC carga el contenido de contador de programa en el stack y a
continuación salta a la dirección especificada por la instrucción en DIR. Si el bit está a 1, el programa continúa con su
secuencia normal.
Aunque el uso de una etiqueta es lo más común, la dirección puede también estar indicada por un número o por una
expresión.

CZ dir Llamar si hay cero


46 CZ chequea el bit de cero. Si el bit esta a 1 (indicando que el contenido del acumulador es cero), CZ carga el contenido del
contador de programa en el stack y salta a la dirección especificada en DIR. Si el bit está a 0 (indicando que el contenido del
acumulador es distinto de cero) el programa continúa su desarrollo normal.

CNZ dir Llamar si no hay cero


47 CNZ chequea el bit de Cero. Si está en 0 (indicando que el contenido del acumulador no
es cero), CNZ manda el contenido del contador de programa al stack y salta a la
dirección especificada por DIR. Si el bit está a 1 el programa continúa su desarrollo
normal.

CM dir Llamar si hay signo negativo


48 CM comprueba el estado del bit del signo. Si el bit esta a 1 (indicando que el contenido del acumulador es negativo) CM
manda el contenido del contador de programa al stack y salta a la dirección especificada por DIR. Si el bit es 0 la ejecución
del programa continúa con su secuencia normal. El uso de la etiqueta es lo más corriente, pero la dirección puede
especificarse también por un número o una expresión.
CP dir Llamar si hay signo positivo
49 CP chequea el valor del bit de signo. Si está a 0 (indicando que el contenido del
acumulador es positivo), CP envía el contenido del contador de programa al stack y
salta a la dirección especificada por DIR. Si el bit tiene un 1, continúa el programa
normalmente con la instrucción siguiente.
CPE dir Llamar si la paridad es par.
50 Existe paridad en un byte si el número de unos que tiene es par. El bit de paridad se
pone a 1 para indicar esta condición. CPE chequea el valor del bit de paridad. Si tiene
un 1, CPE envía el contenido del contador de programa al stack y salta a la dirección
especificada por la instrucción en DIR. Si el bit tiene un cero, el programa continúa
normalmente.
CPO dir Llamar si la paridad es impar
51 CPO chequea el bit de paridad. Si el bit esta a 0, CPO carga el contenido del contador
de programa en el stack y salta a la dirección especificada en DIR. Si el bit está a 1 el
programa continúa su desarrollo normal.

RET Retorno incodicional


52 Se realiza una operación de retorno incondicional.
La instrucción RET echa fuera dos bytes de datos del stack y los mete en el
registro contador de programa. El programa continúa entonces en la nueva dirección.
Normalmente RET se emplea conjuntamente con CALL.
RC Retorno si hay acarreo
53 La instrucción RC comprueba el estado del bit de acarreo. Si tiene un 1 (indicando que
hay acarreo) la instrucción saca dos bytes del stack y los mete en el contador de
programa. El programa continúa en la nueva dirección suministrada. Si el bit es 0, el
programa continúa en la siguiente instrucción de la secuencia normal.

RNC Retorno si no hay acarreo


54
La instrucción RNC comprueba el bit de acarreo. Si está a 0 indicando que no hay
acarreo, la instrucción echa fuera del stack dos bytes y los carga en el contador de
programa. Si el bit está a 1 continúa el ciclo normal.

RZ Retorno si hay cero


55 La instrucción RZ comprueba el bit de cero. Si está a 1, indicando que el contenido del acumulador es cero, la instrucción
echa fuera del stack dos bytes y los carga en el contador de programa. Si el bit está a 0, continúa el ciclo normal.

RNZ Retorno si no hay cero


56 La instrucción RNZ comprueba el bit cero. Si está a 0, indicando que el contenido del acumulador no es cero, la instrucción
echa fuera del stack dos bytes y los carga en el contador de programa. Si el bit está a 1, continúa el ciclo normal.

RM Retorno si hay signo negativo


57 La instrucción RM comprueba el bit de signo. Si tiene un 1, indicando dato negativo en el acumulador, la instrucción echa
dos bytes fuera del stack y los mete en el contador de programa. Si el bit tiene 0, continúa el programa normal con la
siguiente instrucción.

RP Retorno si hay signo positivo


58 La instrucción RP comprueba el bit signo. Si está a 0, indicando que el contenido del acumulador es positivo, la instrucción
echa fuera del stack dos bytes y los carga en el contador de programa. Si el bit está a 1 continúa el ciclo normal.

RPE Retorno si la paridad es par


59 La instrucción RPE comprueba el bit de paridad. Si está a 1, indicando que existe paridad, la instrucción echa fuera del stack
dos bytes y los carga en el contador de programa. Si el bit está a 0 continúa el ciclo normal. (Existe paridad si el byte que está
en el acumulador tiene un número par de bits, colocándose el bit de paridad a 1 en este caso).

RPO Retorno si la paridad es impar


60 La instrucción RPO comprueba el bit de paridad. Si está a 0, indicando que no hay paridad, la instrucción echa fuera del stack
dos bytes y los carga en el contador de programa. Si el bit está a 1, continúa el ciclo normal.

RST Es una instrucción CALL para usar con interrupciones. RST carga el contenido del
61 contador de programa en el stack, para proveerse de una dirección de retorno y salta a
una de las "ocho" direcciones determinadas previamente.
Un código de tres bits incluido en el código de operación de la instrucción RST
especifica la dirección de salto. Esta instrucción es empleada por los periféricos cuando
intentan una interrupción.
Para volver a la instrucción en que ha tenido lugar la interrupción, se debe
utilizar una instrucción de RETORNO.
EI Activar interrupciones
62 La instrucción EI pone en servicio el sistema de interrupciones a partir de la siguiente
instrucción secuencial del programa. Esta instrucción activa el flip-flop INTE.
Se puede desconectar el sistema de interrupciones poniendo una instrucción DI
al principio de una secuencia, puesto que no se puede predecir la llegada de una
interrupción.
Al final de la secuencia se incluye la instrucción EI que vuelve a habilitar el
sistema de interrupciones. (RESET también pone fuera de servicio el sistema de
interrupciones además de poner el contador de programa a cero).
DI Desactivar interrupciones
63 Esta instrucción desactiva el flip-flop INTE. Después de la ejecución de una instrucción DI, el sistema de "interrupciones"
esta sin posibilidad de ponerse en marcha. En aplicaciones que empleen las interrupciones, la instrucción DI se emplea
solamente cuando una determinada secuencia no debe ser interrumpida. Por ejemplo, se puede poner fuera de servicio el
sistema de interrupciones incluyendo una instrucción DI el principio del código de secuencia.
La interrupción TRAP del 8085 no puede ser puesta fuera de servicio. Esta interrupción especial esta prevista para serios
problemas que pueden presentarse independientemente del bit de interrupción (fallo de alimentación, etc.).
IN port Entrada
64 La instrucción IN PORT lee los 8 bits de datos que hay en el "PORT" especificado y los
carga en el acumulador. El operando debe ser un número o una expresión que produzca
un valor comprendido entre 00H y FFH.

1. La instrucción
IN 2
deposita en el acumulador los datos de entrada del puerto 2.
OUT port Salida
65

OUT PORT pone el contenido del acumulador en el bus de datos de 8 bits del puerto
seleccionado. El número de puertos oscila de 0 a 255 y es duplicado en el bus de
direcciones. Es la lógica externa la encargada de seleccionar el puerto y aceptar el dato
de salida. El operando (PORT) debe especificar el número del puerto de salida
seleccionado.

1. La instrucción OUT 2 envía el contenido del acumulador al puerto de salida número 2.

66 HLT La instrucción HLT detiene el procesador.

El contador de programa contiene la dirección de la próxima instrucción secuencial. Por otro lado los bits y registros
permanecen inactivos. Una vez en estado de parada el procesador puede volver a ser arrancado solamente por un
acontecimiento externo, es decir una interrupción. Por tanto debemos asegurarnos que las interrupciones estén en disposición
de ser activadas antes de ejecutar la instrucción HLT.
Si se ejecuta HLT estando las interrupciones fuera de servicio, la única manera de volver arrancar el procesador será mediante
un RESET o a través de la interrupción TRAP.
El procesador puede salir temporalmente del estado de parada para servir un acceso directo a memoria, sin embargo
terminado el acceso directo vuelve al estado de parada.
Un propósito básico de la instrucción HLT es permitir una pausa al procesador mientras espera por la interrupción de un
periférico.

Colocar datos en stack


El contenido del par de registros especificado se guarda en dos bytes de memoria definidos por el puntero de stack.
El contenido del primer registro se guarda en la posición de memoria inmediatamente inferior a la del puntero de stack. El
contenido del segundo registro del par se guarda en la posición de memoria dos unidades inferior al puntero de stack. Si se
hace referencia al para de registros PSW, en el primer byte de información se guarda el estado de los cinco bits de condición.
El formato de este byte es el siguiente:

67 PUSH pr
S Z X A X P X Cy

Sea cual sea el par de registros especificado, una vez que los datos se han
guardado, el puntero de pila se decrementa en dos unidades.

1. Supongamos que el registro B contiene 3FH, el registro C contiene 16H y el


puntero de pila vale 2030H. La instrucción
PUSH B
almacenará el contenido del registro B en posición de memoria 2029H, el contenido del registro C en la dirección de memoria
2028H, y decrementa dos unidades el puntero de stack, dejándolo en 2028H.
Gráficamente podemos ver el proceso anterior:

Antes de PUSH Después de PUSH

Puntero Puntero
Stack Stack
2030 2028
Registro B Registro C Registro B Registro C
3F 16 3F 16

MEMORIA DIRECCION MEMORIA DIRECCION

00 2027 00 2027

00 2028 16 2028

00 2029 3F 2029

00 2030 00 2030

2. Supongamos ahora que el acumulador contiene 33H, el puntero de pila tiene 102AH, y los bits de condición de cero,
acarreo y paridad están a uno, mientras que los de signo y acarreo auxiliar están a cero. La instrucción
PUSH PSW
Almacena el contenido del acumulador en la posición de memoria 1028H, y coloca el valor 47H, correspondiente a los
citados estados de los bits de condición, en la posición 1029H, mientras que en el puntero de pila queda el valor 1028H.

Sacar datos del stack


68 POP pr
POP pr copia el contenido de la posición de memoria direccionada por el stack pointer
en el registro de bajo orden del par de registros especificados. A continuación se
incrementa el stack pointer en 1 y copia el contenido de la dirección resultante en el
registro de más alto orden del par. Luego se incrementa el stack pointer otra vez de
modo que se apunta al siguiente dato del stack. El operando debe especificar el par de
registros BC, DE, HL o PSW.
POP PSW usa el contenido de la localización de memoria especificada por el
stack pointer para restablecer los bits de condiciones.

1. Supongamos que las posiciones de memoria 2028H y 2029H contienen respectivamente 16H y 3FH, mientras que el
puntero de pila contiene 2028H. La instrucción
POP B
Carga el registro C con el valor de 16H de la posición de memoria 2028H, carga el registro B con el valor 3FH de la posición
2029H, e incrementa dos unidades el puntero de stack, dejándolo en 2030H. Gráficamente podemos ver este proceso:

Antes de POP
Después de POP
Puntero
Stack Puntero
2028 Stack
Registro B Registro C 2030
00 16 Registro B Registro C
3F 16
MEMORIA DIRECCION
MEMORIA DIRECCION
00 2027
00 2027
16 2028
16 2028
3F 2029
3F 2029
00 2030
00 2030

2. Si las posiciones de memoria 1008H y 1009H poseen respectivamente 00H y


16H, y el puntero de pila vale 1008H, la instrucción
POP PSW
carga 00H en el acumulador y pone los bits de estado de la siguiente forma:

S Z X A X P X Cy
0 0 0 1 1 1 1 0

=16H

DAD pr Suma doble


69 Bits sfectados DAD RP suma el valor de un dato de 16 bits contenido en un determinado par de registros (PR) al contenido del par de
registros HL. El resultado es almacenado en el par HL. Los operandos (PR) pueden ser B = BC, D = DE, H = HL, SP.
Téngase en cuenta que la letra H debe ser empleada para especificar que el par de registros HL debe ser doblado. DAD pone
el bit de acarreo a 1 si hay una salida de acarreo de los registros HL. Y además no afecta a ningún otro bit.

1. Supuesto que los registros D, E, H y L contienen 33H, 9FH, A1H y 7BH


respectivamente, la instrucción
Realiza la siguiente suma:
B – C 339F
H – L A17B
H – L 051A
2. Al ejecutar la instrucción
DAD H
se duplica el valor del número de 16 bits contenido en H – L (equivale a desplazar los 16 bits una posición hacia la izquierda).

70 XCHG

Intercambiar datos entre registros


XCHG cambia el contenido de los registros H y L con el contenido de los registros D y E.
Si los registros H, L, D y E contienen respectivamente 01H, 02H, 03H y 04H, la instrucción XCHG realiza el siguiente
intercambio:

Antes de ejecutar XCHG


Despues de ejecutar XCHG
D E H L
03 04 01 02 D E H L
01 02 03 04

71 XTHL Intercambiar datos con el stack

XTHL cambia los dos bytes de la posición más alta del stack con los dos bytes almacenados en los registros H y L. Así
XTHL salva el contenido actual del par HL y carga nuevos valores en HL.
XTHL cambia el contenido del L con la posición de memoria especificada por el stack pointer y el registro H es
intercambiado con el contenido del SP+1.

Si el puntero de pila contiene 40B4H, los registros H y L contienen AAH y BBH respectivamente, y las posiciones de
memoria 40B4H y 40B5H contienen CCH y DDH respectivamente, la instrucción

Después de XTHL

Antes de XTHL Puntero


Stack
Puntero 40B4
Stack Registro H Registro L
40B4 DD CC
Registro H Registro L
AA BB MEMORIA DIRECCION

MEMORIA DIRECCION 00 40B3

00 40B3 BB 40B4

CC 40B4 AA 40B5

DD 40B5 00 40B6

00 40B6

Cargar el puntero de stack desde los registros H y L


72 SPHL Los 16 bits contenidos en los registros H y L reemplazan el contenido del puntero de stack. El contenido de los registros H y
L permanece invariable.
Si los registros H y L contienen respectivamente 50H y 6CH, la instrucción
SPHL
carga el puntero de stack con el valor 506CH.

Fuente: Apendice A1 de instrucciones del 8085: http://es.scribd.com/doc/81757060/Instrucciones-Del-8085


6.- EJERCICIOS DE PROGRAMACIÓN LENGUAJE
ASSEMBLER 8085.
Para programar en lenguaje assembler, se debe dominar las 74 instrucciones del
microprocesador, esto es el requicito mínimo para ensamblar dado que existe una infinidad de
problemas que se pueden plantear dependiendo de las necesidades de cada caso. Una de
las soluciones mas elementales a la hora de plantear un problema en programación assembler
es crear la lógica por medio de un fluxograma. Por ende recomiendo hacer ejercicios de
lógica a travéz de esta herramienta.

Existen programas para ensamblar del m-8085, que sin lugar a dudas os ayudarán a tener una
programación mas flexible y natural. A continuación dejo una serie de ejercicios que he
encontrado en internet, material del profesor y practicas que he querido transcribir.

Fig.5.-Simulador 8085

SIMULADOR ASSEMBLER (Laboratorio 1)

Una herramienta muy poderosa para simular el ensamblador 8085 es el SIM85. Instalado
este programa, ir a: archivo/ Editor ASM. Llamamos al editor, alli creamos un nuevo
archivo (Copiamos cualquier ejercicio o creamos un programa) ensamblamos haciendo click
en estos dos iconos. El primero ensambla, generado un texto si fue compilado
correcto o incorrectamente. El segundo icono llama a ensamblar y simular. En caso de
problemas se genera un texto indicando el error.
NEMONICO EXP. GRAF. FLAGS
INSTRUCCIONES DE TRANSFERENCIA
MOV r1,r2 (r1)(r2) NINGUNO
MOV r,M (r)[(HL)] NINGUNO
MOV M,r [(HL)] (r) NINGUNO
MVI r,byte (r)byte NINGUNO
MVI M,byte [(HL)] byte NINGUNO
LXI rp,doble (rpl)1º byte NINGUNO
(rph)2º byte
LDA addr (A)[addr] NINGUNO
STA addr [addr](A) NINGUNO
LHLD addr (L)[addr] NINGUNO
(H)[addr+1]
SHLD addr [addr](L) NINGUNO
[addr+1](H)
LDAX rp (A)[(rp)] NINGUNO
STAX rp [(rp)](A) NINGUNO
XCHG (H)(D) (L)(E) NINGUNO
INSTRUCCIONES ARITMÉTICAS
ADD r (A)(A)+(r) TODOS
ADD M (A)(A)+[(HL)] TODOS
ADI byte (A)(A)+byte TODOS
ADC r (A)(A)+(r)+CY TODOS
ADC M (A)(A)+[(HL)]+CY TODOS
ACI byte (A)(A)+byte+CY TODOS
SUB r (A)(A)-(r) TODOS
SUB M (A)(A)-[(HL)] TODOS
SUI byte (A)(A)-byte TODOS
SBB r (A)(A)-(r)-CY TODOS
SBB M (A)(A)-[(HL)]-CY TODOS
SBI byte (A)(A)-byte-CY TODOS
INR r (r)(r)+1 Z, S, P, AC
INR M [(HL)][(HL)]+1 Z, S, P, AC
DCR r (r)(r)-1 Z, S, P, AC
DCR M [(HL)][(HL)]-1 Z, S, P, AC
INX rp (rp)(rp)+1 NINGUNO
DCX rp (rp)(rp)-1 NINGUNO
DAD rp (HL)(HL)+(rp) CY
DAA Ajuste BCD de (A) NINGUNO
INSTRUCCIONES LÓGICAS.
ANA r (A)(A) and (r) TODOS
(CY)0, (AC)1
ANA M (A)(A) and [(HL)] TODOS
(CY)0, (AC)1
ANI byte (A)(A) and byte TODOS
(CY)0, (AC)1
XRA r (A)(A) xor (r) TODOS
XRA M (A)(A) xor [(HL)] TODOS
XRI byte (A)(A) xor byte TODOS
ORA r (A)(A) or (r) TODOS
ORA M (A)(A) or [(HL)] TODOS
ORI byte (A)(A) or byte TODOS
CMP r (A)-(r) TODOS
CMP M (A)-[(HL)] TODOS
CPI byte (A)-byte TODOS

NEMONICO EXP. GRAF. FLAGS


INSTRUCCIONES DE ROTACIÓN Y FLAGS
RLC Rotacion izqda CY
RRC Rotación dcha CY
RAL Rot. izqda. con CY CY
RAR Rot. dcha. con CY CY
CMA Comp. A1 de (A) NINGUNO
CMC Invierte (CY) CY
STC (CY)1 CY
INSTRUCCIONES DE BIFURCACIÓN
ccc=NZ salto si no cero (Z=0), ccc=Z salto si cero (Z=0),
ccc=NC salto si no acarreo (CY=0), ccc=C salto si acarreo
(CY=1) , ccc=PO salto si paridad impar (P=0), ccc=PE
salto si paridad par (P=1), ccc=P salto si positivo (S=0),
ccc=M salto si negativo ( S=1 )
JMP addr (PC)addr NINGUNO
Jccc addr Si ccc=1, (PC)addr; NINGUNO
Si ccc=0, (PC)(PC)+3
CALL addr Guarda PC en la pila NINGUNO
(PC)addr
Cccc addr Si ccc=1, guarda PC en NINGUNO
la pila, (PC)addr;
Si ccc=0, (PC)(PC)+3
RET Recupera PC de la pila NINGUNO
Rccc Si ccc=1, recupera PC NINGUNO
de la pila;
Si ccc=0 (PC)(PC)+1
RSTn (PC)n x 8 NINGUNO
PCHL (PC)(HL) NINGUNO
INSTRUCCIONES DE MANEJO DE LA PILA.
PUSH rp [(SP)-1](rpl) NINGUNO
[(SP)-2](rph)
(SP)(SP)-2
PUSH PSW [(SP)-1](A) NINGUNO
[(SP)-2](RE)
(SP)(SP)-2
POP rp (rph) [(SP)] NINGUNO
(rpl) [(SP)+1]
(SP)(SP)+2
POP PSW (RE) [(SP)] NINGUNO
(A) [(SP)+1]
(SP)(SP)+2
XTLH (L) [(SP)] NINGUNO
(H) [(SP)+1]
SPLH (HL) (SP) NINGUNO
INSTRUCCIONES DE ENTRADA Y SALIDA.
IN puerta (A)[puerta] NINGUNO
OUT puerta [puerta](A) NINGUNO
INSTRUCC. DE CONTROL DE INTERRUPCIONES
EI Habilita interrupciones NINGUNO
DI Inhabilita interrupciones NINGUNO
HLT Para el microprocesador NINGUNO
NOP No hace nada NINGUNO
RIM Lee linea serie y estado NINGUNO
interrupciones.
SIM Escribe en linea serie y NINGUNO
Programa
interrupciones.

6.- EJERCICIOS EN LENGUAJE ASSEMBLER.

Para manejarnos en la programación ASSEMBLER, debemos tener claro con cuales


herramientas disponemos, operaciones, rutinas, tiempo de ejecucion. Conocer las limitantes y
saber desarrollar el camino mas optimo para solucionar un problema.

LXI
STAX STA
LDAX LDA
DCX DCR
INX INR

MVI MOV

Si no eres capaz de diferenciar entre STAX y STA estás en serios problemas....

Ejemplo1:Este programa Suma 1+1 en ASSEMBLER

.ORG 0

MVI A,1H

MVI B,1H

ADD B

HLT
1.-Ingresa el valor del acumulador en la direccion 4200H

.ORG 0

MVI A,10H

STA 4200H

HLT

Analisis: Este programa carga 10H al acumulador enseguida es almacenado en la direccion


especificada por STA. Fluxograma: Cargar acumulador Almacenar FIN.

2.- Creando mi primer COUNTER de 10 a 00H en ciclo.


.ORG 0

MVI C,10H

LOOP: DCR C

JNZ LOOP

HLT

Analisis: El counter es una herramienta de ciclo finito, de gran utilidad se usa para recorrer
determianda cantidad de posiciones en el registro, complementado con un condicionante para
el fin de su ejecución. En general se usa en conjunto a la instreuccion JNZ, JZ, CMP etc.
Elementos condicionantes para efectuar un salto, comparar o logicos. Fluxograma:
Inicializar -> Origen 0, Counter en 10 ->Decrementar Counter-> Si: es igual a 0 FIN, No:
Regresar a decrementar.

3.- Permite sumar valores en el acucmulado

.ORG 0

MVI A,00H ;inicializo Acumulador

MVI C,10H ; dato2 o ounter

MVI B,02H ; dato 1 o tabla

LOOP: ADD B ;permite sumar a=a+b

LXI H,1000H ;en esta direecion se almacena informacion del programa

DCR C ; contador

JNZ LOOP

HLT
4.- Ingresa los valores de forma regresiva de una tabla dada (Laboratorio 2)

El programa debe realizar lo siguiente:

Se tiene una tabla de 10 datos numericos almacenados en formaascendentes a partir de


la direccion de memoria 1000h. Se desea construir una segunda tabla a partir de estos datos y
almacenarlos a partir de la posicion de memoria 1010h, pero en forma inversa, es decir, estos
datos deberan quedar en forma descendente

Desarrollo:

data 1000H
dB 1h,2h,3h,4h,5h,6h,7h,8h,9h,10h

.ORG 0
MVI A,0
MVI L,9 ;COUNTER
LXI B,1009H ;POSICIONAMIENTO
LXI D,1010H ;POSICIONAMIENTO

XX: LDAX B
STAX D
DCX B
INX D

DCR L
JNZ XX
HLT

Descripción: Existen muchas maneras de crear lo que se nos pide. Visualicemos 2 tablas
llamadas BC y DE. En BC ya se han ingresado datos y en DE esos datos se almacenarán de
forma inversa. Ambos con el mismo tamaño N. La manera que abordé este problema fue
empezar a recorrer en forma decreciente la tabla BC y su información se almacenaba en el
acumulador a mismo tiempo que se transfería este dato a la tabla DE.

5.-Suma en el contador la cantidad de unos que hay en una tabla.


LXI H,2000H

MVI C,0

MVI B,10

OTRO: MOV A,M

CPI 1
JNZ XX

INR C

XX: DCR B

JZ FIN

INX H

JMP OTRO

HLT

También podría gustarte