You are on page 1of 54

COMPUTACIN V

MICROPROCESADORES Y MICROCOMPUTADORAS

LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


1.

Registros Internos del Microprocesador

2.

Conjunto de Instrucciones (Microprocesadores 8086/8088)


2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
2.10

Instrucciones de Transferencia de Datos


Instrucciones de Control de Bucles (instrucciones simples)
Instrucciones de Prueba, Comparacin y Saltos
Instrucciones de Llamado y Retorno de Subrutinas
Instrucciones Aritmticas
Instrucciones Lgicas
Instrucciones de Desplazamiento, Rotacin y Adeudos
Instrucciones de Pila
Instrucciones de Control del Microprocesador
Instrucciones de Interrupcin

3.

Formato de las instrucciones

4.

Modos de Direccionamiento y Generacin del Cdigo Objeto


4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9
4.10
4.11
4.12
4.13

5.

Direccionamiento Inmediato
Direccionamiento a Registro
Direccionamiento Directo
Direccionamiento de Registro Indirecto
Direccionamiento de Registro Indirecto con Desplazamiento
Direccionamiento de Registro Indirecto con un Registro Base y un Registro
ndice
Direccionamiento de Registro indirecto con un registro base, un registro
ndice y un registro constante
Cdigo Objeto del 8086/8088
Bit W y Campo REG
Bit D, MOD y R/M
Cdigo Objeto para el Uso de Registro Base y Registro ndice
Sumario del Cdigo Objeto
Interrupciones de los Servicios Bsicos de Entrada y Salida (BIOS, por sus
siglas en ingls)

Programacin en Lenguaje Ensamblador


5.1
5.2
5.3
5.4
5.5

Creacin de Archivos Fuente


Procedimientos en Ensamblador
Procedimiento para Exhibir Nmeros Hexadecimales al Monitor
Principio de Diseo Modular
Esqueleto de un Programa en Ensamblador
5.5.1
5.5.2
5.5.3

Directiva: .DATA
Directiva: .MODEL SMALL
Directiva: .DOSSEG

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -1

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

5.6
5.7
5.8
5.9
5.10
5.11
5.12
5.13
5.14
5.15
5.16
5.17
5.18
5.19
5.20
5.21
5.22
5.23
5.24
5.25

Ejercicio 1
Ejercicio 2
Ejercicio 3
Ejercicio 4
Ejercicio 5
Ejercicio 6
Ejercicio 7
Ejercicio 8
Ejercicio 9
Ejercicio 10
Ejercicio 11
Ejercicio 12
Ejercicio 13
Ejercicio 14
Ejercicio 15
Ejercicio 16
Ejercicio 17
Ejercicio 18
Ejercicio 19
Ejercicio 20

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -2

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

REGISTROS INTERNOS DEL MICROPROCESADOR


La Unidad Central de Proceso (CPU, por sus siglas en ingls) tiene 14 registros
internos cada uno de 16 bits. Los primeros cuatro, AX, BX, CX y DX, son de uso
general y se pueden usar tambin como registros de 8 bits. Es decir, AX se puede
dividir en AH y AL (AH es el byte alto, high, y AL es el byte bajo, low) Lo mismo es
aplicable a los otros tres (BX en BH y BL, CX en CH y CL y DX en DH y DL)
Estos son los nicos registros que pueden usarse de modo dual (en 8 o 16 bits)
Los registros de la CPU son conocidos por sus nombres propios, que son:

AX
BX
CX
DX
DS
ES
SS
CS
BP
SI
DI
SP
IP
F

(acumulador)
(registro base)
(registro contador)
(registro de datos)
(registro del segmento de datos)
(registro del segmento extra)
(registro del segmento de pila)
(registro del segmento de cdigo)
(registro de apuntadores base)
(registro ndice fuente)
(registro ndice destino)
(registro del apuntador de pila)
(registro del apuntador de siguiente instruccin)
(registro de banderas)

El registro AX se usa para almacenar resultados, lectura o escritura desde o


hacia los puertos. El BX sirve como apuntador base o ndice. El CX se utiliza en
operaciones de iteracin, como un contador que automticamente se incrementa o
decrementa de acuerdo con el tipo de instruccin usada. El DX se usa como puente
para el acceso de datos.
El DS es un registro de segmento cuya funcin es actuar como polica donde se
encuentran los datos. Cualquier dato, ya sea una variable inicializada o no, debe estar
dentro de este segmento. La nica excepcin es cuando tenemos programas del tipo
*.com, ya que en stos slo puede existir un segmento. El registro ES tiene el
propsito general de permitir operaciones sobre cadenas, pero tambin puede ser una
extensin del DS.
El SS tiene la tarea exclusiva de manejar la posicin de memoria donde se
encuentra la pila (stack) Esta es una estructura usada para almacenar datos en forma
temporal, tanto de un programa como de las operaciones internas de la computadora
personal (PC, por sus siglas en ingls) En trminos de operacin interna, la CPU usa
este segmento para almacenar las direcciones de retorno de las llamadas a rutinas. El
registro de segmentos ms importante es el CS o segmento de cdigo. Es aqu donde
se encuentra el cdigo ejecutable de cada programa, el cual est directamente ligado a
los diferentes modelos de memoria.
El registro BP (base pointer) se usa para manipular la pila sin afectar al registro
de segmentos SS. Es til cuando se usa interfaz entre lenguajes de alto nivel y el
3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR
LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -3

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

ensamblador. Puesto que dicha interfaz se basa en el concepto de la pila BP, nos
permite acceder parmetros pasados sin alterar el registro de segmento SS. Los
registros SI y DI son tiles para manejar bloques de cadenas en memoria, siendo el
primero el ndice fuente y el segundo el ndice destino. En otras palabras, SI representa
la direccin donde se encuentra la cadena y DI la direccin donde ser copiada.
El registro SP apunta a un rea especfica de memoria que sirve para almacenar
datos bajo la estructura LIFO (ltimo en entrar, primero en salir), conocida como pila
(stack) El registro IP (instruction pointer) apunta a la siguiente instruccin que ser
ejecutada en memoria.
A continuacin se describe el significado de cada bit del registro F (banderas)
Todas las banderas apagadas:
NV

UP

DI

PL

NZ

NA

PO

NC

ZR

AC

PE

CY

Todas las banderas prendidas:


OV

DN

EI

NG

Significado de los bits:

Overflow

Direction

Interrupts

Sign

Zero

Auxiliary Carry

Parity

Carry

NV = no hay desbordamiento
OV = S lo hay
UP = hacia adelante
DN = hacia atrs
DI = desactivadas
EI = activadas
PL = positivo
NG = negativo
NZ = no es cero
ZR = s lo es
NA = no hay acarreo auxiliar
AC = hay acarreo auxiliar
PO = paridad non
PE = paridad par
NC = no hay acarreo
CY = s lo hay

El registro de banderas es un registro de 16 bits, pero no todos los bits se usan.


PSW Contiene 9 banderas. Tres banderas de control TF, DF, IF y seis banderas de status
CF, PF, AF, ZF, SF, OF.

Estas 6 ltimas banderas representan el resultado de una operacin aritmtica


o lgica. Permiten al programa alterar el curso de ejecucin basado en los
valores lgicos que almacenan.

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -4

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

AF

CF

OF

SF

PF

ZF

Llevar auxiliar = 1, indica que hubo llevar del nibble (4 bits) 0 al nibble 1. O un
pedir prstamo del nibble alto al nibble bajo.
Llevar = 1, cuando ha ocurrido un llevar o pedir prstamo del resultado (8 o
16 bits)
Sobreflujo = 1, indica que ha ocurrido un sobreflujo aritmtico. Esto significa
que el tamao del resultado excede la capacidad de ALMACENAMIENTO del
destino y el dgito significativo se perdi.
Signo. Esta bandera se activa cuando el bit ms significativo del resultado es 1.
Ya que los nmeros binarios negativos son representados usando notacin C2,
SF refleja el signo del resultado:
0 indica +
1 indica Paridad. Cuando esta bandera est activa, el resultado de la operacin tiene un
nmero par de unos. Esta bandera se usa para verificar errores en la
transmisin.
Cero. Esta bandera se activa cuando el resultado de la operacin es cero.

Las tres banderas de control sern discutidas despus durante el curso

DF =
IF =
TF =

bandera de direccin
bandera de interrupcin
bandera de trampa

CONJUNTO DE INSTRUCCIONES (Microprocesadores 8086/8088)


Se pueden clasificar en los siguientes grupos:
Instrucciones de Transferencia de Datos.
Estas instrucciones mueven datos de una parte a otra del sistema; desde y hacia la
memoria principal, de y a los registros de datos, puertos de E/S y registros de
segmentacin.
Las instrucciones de transferencia de datos son las siguientes:

MOV
XCHG
IN
OUT
XLAT
LEA
LDS
LES
LAHF
SAHF
PUSH FUENTE
POP DESTINO

transfiere
intercambia
entrada
salida
traduce usando una tabla
carga la direccin efectiva
carga el segmento de datos
carga el segmento extra
carga los indicadores en AH
guarda AH en los indicadores
(sp) fuente
destino (sp)

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -5

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Control de Bucles (instrucciones simples)


stas posibilitan el grupo de control ms elemental de nuestros programas. Un bucle es
un bloque de cdigo que se ejecuta varias veces. Hay 4 tipos de bucles bsicos:
o
o
o
o

Bucles sin fin


Bucles por conteo
Bucles hasta
Bucles mientras

Las instrucciones de control de bucles son las siguientes:

INC
DEC
LOOP
LOOPZ,LOOPE
LOOPNZ,LOOPNE
JCXZ

incrementar
decrementar
realizar un bucle
realizar un bucle si es cero
realizar un bucle si no es cero
salta si CX es cero

Instrucciones de Prueba, Comparacin y Saltos.


Este grupo es una continuacin del anterior, incluye las siguientes instrucciones:

TEST
CMP
JMP
JE, JZ
JNE, JNZ
JS
JNS
JP, JPE
JNP, JOP
JO
JNO
JB, JNAE
JNB, JAE
JBE, JNA
JNBE, JA
JL, JNGE
JNL, JGE
JLE, JNG
JNLE, JG

verifica
compara
salta
salta si es igual a cero
salta si no igual a cero
salta si signo negativo
salta si signo no negativo
salta si paridad par
salta si paridad impar
salta si hay capacidad excedida
salta si no hay capacidad excedida
salta si por abajo (no encima o igual)
salta si no est por abajo (encima o igual)
salta si por abajo o igual (no encima)
salta si no por abajo o igual (encima)
salta si menor que (no mayor o igual)
salta si no menor que (mayor o igual)
salta si menor que o igual (no mayor)
salta si no menor que o igual (mayor)

Instrucciones de Llamado y Retorno de Subrutinas.


Para que los programas resulten eficientes y legibles tanto en lenguaje ensamblador
como en lenguaje de alto nivel, resultan indispensables las subrutinas:

CALL
RET

llamada a subrutina
retorno al programa o subrutina que llam

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -6

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Instrucciones Aritmticas.
Estas instrucciones son las que realiza directamente el 8086/8088
a.

Grupo de adicin:

b.

MUL
IMUL
AAM

multiplicacin
multiplicacin entera
ajuste ASCII para la multiplicacin

DIV
IDIV
AAD

divisin
divisin entera
ajuste ASCII para la divisin

Conversiones:

f.

resta
resta con acarreo negativo
ajuste ASCII para la resta
ajuste decimal para la resta

Grupo de divisin:

e.

SUB
SBB
AAS
DAS

Grupo de multiplicacin:

d.

suma
suma con acarreo
ajuste ASCII para la suma
ajuste decimal para la suma

Grupo de sustraccin:

c.

ADD
ADC
AAA
DAA

CBW
CWD
NEG

pasar octeto a palabra


pasar palabra a doble palabra
negacin

Tratamiento de cadenas:
Permiten el movimiento, comparacin o bsqueda rpida en bloques de datos:

MOVC
MOVW
CMPC
CMPW
SCAC
SCAW
LODC
LODW
STOC
STOW

transferir carcter de una cadena


transferir palabra de una cadena
comparar carcter de una cadena
comparar palabra de una cadena
buscar carcter de una cadena
buscar palabra de una cadena
cargar carcter de una cadena
cargar palabra de una cadena
guardar carcter de una cadena
guardar palabra de una cadena

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -7

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

REP
CLD
STD

repetir
poner a 0 el indicador de direccin
poner a 1 el indicador de direccin

Instrucciones Lgicas.
Son operaciones bit a bit que trabajan sobre octetos o palabras completas:

NOT
AND
OR
XOR

negacin
producto lgico
suma lgica
suma lgica exclusiva

Instrucciones de Desplazamiento, Rotacin y Adeudos.


Bsicamente permiten multiplicar y dividir por potencias de 2

SHL, SAL
SHR
SAR
ROL
ROR
RCL
RCR
CLC
STC

desplazar a la izquierda (desplazamiento aritmtico)


desplazar a la derecha
desplazamiento aritmtico a la derecha
rotacin a la izquierda
rotacin a la derecha
rotacin con acarreo a la izquierda
rotacin con acarreo a la derecha
borrar acarreo
poner acarreo a 1

Instrucciones de Pila.
Una de las funciones de la pila del sistema es la de salvaguardar (conservar) datos (la
otra es la de salvaguardar las direcciones de retorno de las llamadas a subrutinas):

PUSH
POP
PUSHF
POPF

introducir
extraer
introducir indicadores
extraer indicadores

Instrucciones de Control del microprocesador.


Hay varias instrucciones para el control de la CPU, ya sea a ella sola, o en conjuncin con
otros procesadores:

NOP
HLT
WAIT
LOCK
ESC

no operacin
parada
espera
bloquea
escape

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -8

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Instrucciones de Interrupcin.

STI
CLI
INT
INTO
IRET

poner a 1 el indicador de interrupcin


borrar el indicador de interrupcin
interrupcin
interrupcin por capacidad excedida (desbordamiento)
retorno de interrupcin

Las instrucciones de transferencia condicional del control del programa se


pueden clasificar en 3 grupos:
1.

Instrucciones usadas para comparar dos enteros sin signo:


a. JA o JNBE. Salta si est arriba o salta si no est abajo o si no es igual (jump if above o
jump if not below or equal) El salto se efecta si la bandera ce CF = 0 o si la
bandera de ZF = 0
b. JAE o JNB. Salta si est arriba o es igual o salta si no est abajo (jump if above or equal o
jump if not below) El salto se efecta si CF = 0.
c. JB o JNAE. Salta si est abajo o salta si no est arriba o si no es igual (jump if below or
equal o jump if not above or equal) El salto se efecta si CF = 1.
d. JBE o JNA. Salta si est abajo o si es igual o salta si no est arriba (jump if below or equal
o jump if not above) El salto se efecta si CF = 1.
e. JE o JZ.
Salta si es igual o salta si es cero (jump equal o jump if zero) El salto se efecta
si ZF = 1 (tambin se aplica a comparaciones de enteros con signo)
f. JNE o JNZ. Salta si no es igual o salta si no es cero (jump if not equal o jump if not zero) El
salto se efecta si ZF = 0 (tambin se aplica a comparaciones de enteros con
signo)

2.

Instrucciones usadas para comparar dos enteros con signo:


a. JG o JNLE. Salta si es ms grande o salta si no es menor o igual (jump if greater o jump if
not less or equal) El salto se efecta si ZF = 0 o OF = SF.
b. JGE o JNL. Salta si es ms grande o igual o salta si no es menor que (jump if greater or
equal o jump if not less) El salto se efecta si SF = OF.
c. JL o JNGE. Salta si es menor que o salta si no es mayor o igual (jump if less o jump if not
greater or equal) El salto se efecta si SF = OF.
d. JLE o JNG. Salta si es menor o igual o salta si no es ms grande (jump if less or equal o
jump if not greater) El salto se efecta si ZF = 1 o SF = OF.

3.

Instrucciones usadas segn el estado de banderas:


a. JC
b. JNC
c. JNO
d. JNP o JPO
e. JNS
f. JO
g. JP o JPE
h. JS

Salta si hay acarreo (jump if carry) El salto se efecta si CF = 1.


Salta si no hay acarreo (jump if not carry) El salto se efecta si CF = 0.
Salta si no hay desbordamiento (jump if not overflow) El salto se efecta si OF
= 0.
Salta si no hay paridad o salta si la paridad en non. El salto se efecta si PF
= 0.
Salta si el signo est apagado (jump if not sign) El salto se efecta si SF = 0.
Salta si hay desbordamiento (jump if overflow) El salto se efecta si OF = 1.
Salta si hay paridad o salta si la paridad es par (jump if parity o jump if parity
even) El salto se efecta si PF = 1.
Salta si el signo est prendido (jump if sign set) El salto se efecta si SF = 1.

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -9

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Las comparaciones con signo van de acuerdo con la interpretacin que usted le
quiera dar a los bytes o palabras de su programa. Por ejemplo, suponga que tiene un
byte cuyo valor es 11111111 en binario y que desea compararlo con otro cuyo valor es
00000000. Es 11111111 mayor que 00000000? S y NO, eso depende de la
interpretacin que usted le quiera dar. Si trabaja con nmeros enteros sin signo S LO
SER, pues 255 es mayor que 0. Por el contrario, si tiene signo entonces SER MENOR
puesto que 1 es siempre menor que 0.
Lo anterior lleva a seleccionar las instrucciones de comparacin y de salto de
acuerdo con la interpretacin que se les d a los bytes o palabras; reflexione sobre este
punto.
Los saltos condicionales se encuentran limitados al rango de 128 a +127 bytes
como mxima distancia, ya sea adelante o hacia atrs. Si desea efectuar un salto a
mayores distancias es necesario crear una condicin mixta entre saltos condicionales y
no condicionales.
Iteraciones.
Con los saltos condicionales y no condicionales se pueden crear estructuras de
iteracin bastante complejas, aunque existen instrucciones especficas para ello tal
como loop.
Esta instruccin es muy til cuando se va a efectuar cierto bloque de
instrucciones un nmero finito de veces. He aqu un ejemplo:
CUENTA:
.
.
.
MOV
ITERA:
.
.
LOOP

DW, 100

CX, CUENTA

ITERA

El bloque de instrucciones que se encuentra entre la etiqueta ITERA y la


instruccin loop ser ejecutado hasta que el registro CX sea igual a 0. Cada vez que
se ejecuta la instruccin loop, el registro CX es decrementado en 1 hasta llegar a 0.
Esta instruccin tiene la limitante de que debe encontrarse en el rango de +128 a 127
(mximo nmero de bytes entre ITERA y loop)
Iteraciones condicionales
Existen otras dos variantes de la instruccin loop. Las instrucciones loope y
loopz decrementan CX e iteran si CX = 0 y ZF = 1, mientras que loopne y looppnz
iteran si CX 0 y ZF 0. Un punto importante es que al decrementarse CX las
banderas NO RESULTAN AFECTADAS. Por lo tanto, le corresponde a usted afectarlas
dentro del bloque de iteracin.

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -10

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

FORMATO DE LAS INSTRUCCIONES


Cada instruccin en lenguaje ensamblador del 8088 est compuesta de 4
campos:
etiqueta operacin operando comentario

El campo comentario se utiliza para propsitos de documentacin y es opcional.


Campo etiqueta: Una etiqueta debe comenzar con un carcter alfabtico y puede contener
hasta 31 caracteres, incluyendo:

Letras de la A a la Z
Nmeros del 0 al 9
Los smbolos especiales: - $ . @ %

No se puede utilizar un nombre que coincida con una palabra reservada o


directiva del ensamblador. Si el nombre incluye un punto, entonces el
punto debe ser el primer carcter.
Campo operacin: Contiene el nemotcnico de la instruccin, que es de 2 a 6 caracteres.
Campo operando: Contiene la posicin o posiciones donde estn los datos que van a ser
manipulados por la instruccin.
Campo comentario: Se utiliza para documentar el cdigo fuente del ensamblador. Debe
separarse del ltimo campo por al menos un espacio e iniciar con ;.
Cuando inicia un comentario en una lnea sta deber tener en la
primera columna el carcter ;.

MODOS DE DIRECCIONAMIENTO Y GENERACIN DEL CDIGO OBJETO


Generacin de la direccin de la instruccin.
Todos los registros internos del 8086/8088 son de 16 bits. El bus de direccin
es de 20 bits, por lo que se usa ms de un registro interno para generar la direccin de
20 bits.
Los 2 registros usados para la direccin de la instruccin son el IP y el CS. Se
combinan en una forma especial para generar la direccin de 20 bits.
direccin de 20 bits = 1610 * CS + IP

Por ejemplo: Si los registros CS e IP contienen los valores:


CS = 1000H
IP = 0414 H

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -11

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

La direccin de 20 bits es:


1610 * 1000H + 0414H = 10000H + 0414H = 10414H

Esta es la direccin en memoria desde la cual la nueva instruccin debe


buscarse.
Al registro IP se le refiere como offset, el registro CS * 1610 apunta a la
direccin de inicio o segmento en memoria desde el cual se calcula el offset. La
Figura A muestra grficamente cmo se calcula la direccin de 20 bits.
CS*16

Direccin de 20 bits

Bus de direccin
Del sistema

IP

FIGURA A. Clculo de la direccin de 20 bits

Cada direccin generada por el 8086/8088 usa uno de los 4 registros de


segmento. Este registro de segmento es recorrido 4 bits hacia la izquierda antes de ser
sumado al offset.
La instruccin del CPU especifica cules registros internos se usan para generar
el offset.
Vamos a ver los diferentes modos de direccionamiento tomando como ejemplo
la instruccin MOV.
Instruccin MOV
Transfiere un byte desde el operando fuente al operando destino. Tiene el siguiente
formato:
MOV

destino, fuente

Direccionamiento Inmediato
El operando fuente aparece en la instruccin. Un ejemplo, es el que mueve un valor
constante a un registro interno.
MOV

AX, 568

Direccionamiento a Registro
Indica que el operando a ser usado est contenido en uno de los registros internos de
propsito general del CPU. En el caso de los registros AX, BX, CX o DX los registros
pueden ser de 8 a 16 bits

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -12

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Ejemplos:
MOV
MOV

; AX BX
; AL BL

AX, BX
AL, BL

Cuando usamos direccionamiento a registro, el CPU realiza las operaciones


internamente, es decir, no se genera direccin de 20 bits para especificar el operando
fuente.
Direccionamiento Directo
Especifica en la instruccin la localidad de memoria que contiene al operando. En este
tipo de direccionamiento, se forma una direccin de 20 bits.
Ejemplo:
MOV

CX, COUNT

El valor de COUNT es una constante. Es usada como el valor offset en el clculo de la


direccin de 20 bits
El 8086/8088 siempre usa un registro de segmento cuando calcula una direccin fsica.
Cul registro se debe usar para esta instruccin? Respuesta: DS
En la Figura B, se muestra el clculo de la direccin desde la cual se tomar el dato que
se carga en CX.
COUNT = CONSTANTE

DS*16

+
DIRECCIN DEL SISTEMA DE 20 BITS
Cuando accedamos datos, el registro DS se usa con un offfset para calcular la direccin de 20 bits,
ste es el segmento por omisin. Puede ser invalidado por usar un prefijo de segmento en la
instruccin.
Ejemplo:
MOV

CX, ES: COUNT

FIGURA B. Uso del segmento de datos y una constante para desplazamiento

Este es el segmento por omisin que se usa. Sin embargo, cualquiera de los 4 segmentos
puede usarse. Esto se efecta especificando el registro apropiado en la instruccin.
Por ejemplo, suponga que deseamos usar el registro ES en lugar del DS:
MOV

CX, ES: COUNT

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -13

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Direccionamiento de Registro Indirecto


Con el modo de direccionamiento de registro ndice, la direccin offset de 16 bits est
contenida en un registro base o registro ndice. Esto es, la direccin reside en el registro
BX, BP, SI o DI.
Ejemplo:
MOV

AX, [SI]

El valor de 16 bits contenido en el registro SI debe ser el offset usado para calcular la
direccin de 20 bits.
Otra vez, debe usarse un registro de segmento para generar la direccin final. El valor de
16 bits en SI se combina con el segmento apropiado para generar la direccin.
Direccionamiento de Registro Indirecto con Desplazamiento
Este tipo de direccionamiento incluye a los dos modos de direccionamiento anteriores. La
direccin offset de 16 bits se calcula sumando el valor de 16 bits especificado en un
registro interno y una constante.
Por ejemplo, si usamos el registro interno DI y el valor constante (desplazamiento),
donde COUNT ha sido previamente definido, el nemotcnico para esta construccin es:
MOV

AX, COUNT [DI]

Si:

COUNT =
DI =

0378H
04FAH
0872H

Entonces, la direccin offset de 16 bits es 0872H


Direccionamiento de Registro Indirecto con un Registro Base y un Registro ndice
Este modo de direccionamiento usa la suma de dos registros internos para obtener la
direccin offset de 16 bits a usarse en el clculo de la direccin de 20 bits.
Ejemplos:
MOV
MOV

[BP] [DI], AX
AX, [BX] [SI]

; el offset es BP + DI
; el offset es BX + SI

Direccionamiento de Registro ndice Indirecto con un Registro Base, un Registro ndice y


un Registro Constante
Este es el modo de direccionamiento ms complejo. Es idntico al modo de
direccionamiento anterior, excepto que se suma una constante.
Ejemplo: Suponga que tenemos los siguientes valores en los registros:
DI =
BX =
COUNT =

0367H
7890H
0012H
7C09H

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -14

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Este modo de direccionamiento indica que el offset especificado por la suma de DI + BX


+ COUNT sea usado para mover el dato en memoria en el registro AX.
MOV

AX, COUNT [BX] [DI]

La direccin offset de 16 bits es 7C09H. La direccin completa en 20 bits se calcula de


la expresin:
1610*DS + 7C09H

Si el DS contiene 3000H, la direccin completa de 20 bits es:


3000H + 7C09H = 37C09H

Cdigo Objeto del 8086/8088

Como programador, debes escribir los nemotcnicos. El cdigo objeto es


generado por la computadora (son los bytes que ejecuta el CPU) Con el conjunto de
instrucciones del 8086/8088, cada tipo de modo de direccionamiento puede requerir un
nmero diferente de bytes. En los ejemplos siguientes proporcionaremos el nmero de
bytes requeridos por cada modo de direccionamiento.
Bit W y campo REG
La instruccin MOV AX, 568H
Indica mover inmediatamente al registro interno AX el valor 568H. El registro interno
puede ser de 1 byte o de una palabra. Esta instruccin requiere 2 o 3 bytes, como se
indica en la Figura C.
1011 W REG
1 BYTE

DATA
1 o 2 BYTES

FIGURA C. Uso del bit N y del campo REG.

El primer byte contiene los bits ms significativos (MSB) como 1011. El prximo bit es W.
W indica:

1 para word
0 para byte

Esto es, si el registro destino es de 16 bits o de 8 bits.


Los siguientes 3 bits del primer byte, campo REG, determinan cul registro est
involucrado. La Figura D, muestra el cdigo de seleccin del registro.
REG
000
001
010
011
100
101
110

REGISTRO DE REGISTRO
16 BITS
DE 8 BITS
AX
AL
CX
CL
DX
DL
BX
BL
SP
AH
BP
CH
SI
DH

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -15

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

REGISTRO DE REGISTRO
16 BITS
DE 8 BITS
111
DI
BH

REG

FIGURA D. Registro involucrado en la operacin

Campo DATA. Si el registro de destino es de 1 byte, el dato debe estar en el segundo


byte de la instruccin. Si el destino es de una palabra, el segundo byte de la instruccin
son los 8 bits menos significativos (lsb) del dato, el tercer byte de la instruccin son los 8
bits ms significativos (MSB) del dato. La siguiente tabla, muestra los nemotcnicos 2 o
3 bytes
NEMOTCNICO
CDIGO OBJETO
MOV AX, 568 Instruccin de 3 bytes
B8
68
05
MOV

instruccin de 2 bytes
B0
56

AL, 56

Bit D, MOD y R/M


En este ejemplo, moveremos datos desde memoria o moveremos un registro hacia o
desde otro registro. Usaremos una instruccin como:
MOV

AX, BX

Esta instruccin es de 2 bytes porque no nos referimos a memoria. Los bytes aparecern
como lo muestra la Figura E:
1000 10 DW

MOD REG R/M

1er BYTE

2do BYTE

FIGURA E.

El primer byte contiene los 2 bits menos significativos como DW. El bit W es para word=1
o para byte=0. La D es para indicar si el dato ser almacenado en el operando
especificado por los campos MOD y R/M (D = 0) o si va a ser almacenado en el registro
especificado por el campo REG (D = 1)
La Figura F muestra las asignaciones para MOD y R/M. Note en la descripcin de
MOD=11, el campo R/M es codificado con un formato de registro. Este formato se mostr
en la Figura D.

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -16

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Registros base e ndice especificados por R/M


para operandos en memoria (MOD <> 11)
R/M
REGISTRO BASE
REGISTRO NDICE
000
BX
SI
001
BX
DI
010
BP
SI
011
BP
DI
100
NINGUNO
SI
101
NINGUNO
DI
110
BP
NINGUNO
111
BX
NINGUNO
MOD DESPLAZAMIENTO
COMENTARIO
00 CERO
01 8 BITS contenido
La instruccin contiene
del prximo byte de
la instruccin, signo
un byte adicional
extendido a 16 bits
10 16 bits contenidos en
La instruccin contiene
los prximos 2 bytes
2 bytes adicionales
de la instruccin
11 Registro R/M
Si MOD = 00 y R/M = 110, entonces
1. Lo expuesto arriba no se aplica
2. La instruccin contiene 2 bytes adicionales
3. La direccin offset es contenida en esos bytes
FIGURA F. Definiciones para el cdigo objeto del 8086/8088 de los campos MOD y R/M

Para esta instruccin deseamos almacenar el dato en el registro AX. Por lo tanto el bit D
= 0. Esto significa que el dato debe ser almacenado en la localidad especificada por los
campos MOD y R/M. Por lo tanto, MOD = 11. El campo R/M = 000, indicando que el
registro AX es el destino para los datos. El campo REG para el segundo byte de datos es
011. indicando que el registro BX es el registro fuente a ser utilizado. El segundo byte de
la instruccin es 11 011 000 = D8. Por lo que el cdigo objeto para la instruccin es:
MOV

AX, BX

es 89
D8

Cdigo Objeto para el uso de Registro Base y Registro ndice


Examinemos un ltimo ejemplo para generar cdigo objeto para el 8086/8088. En ste
vamos a calcular el cdigo objeto para la instruccin:
MOV

CX, COUNT [BX] [SI]

Esta instruccin es de 4 bytes, como se muestra en la Figura G:


1000 10 DW
1er. BYTE

MOD REG R/M


2o. BYTE

Add LOW
3er. BYTE

Add HIGH
4o. BYTE

FIGURA G. Formato del cdigo objeto para una instruccin como:


MOV CX, COUNT [BX] [SI]
3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR
LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -17

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

El primer byte de la Figura G, debe tener el bit D=1. Esto es debido a que el destino para
el dato debe ser especificado por el campo REG en el segundo byte. El bit W=1. porque
es una transferencia de palabra. El primer byte es:
10001011 = 8B

En el segundo byte, ya que estamos usando una constante que requiere 16 bits, el campo
MOD = 10. Refiriendo a la Figura F, sta indica que el desplazamiento debe ser
formateado en 2 bytes y deben seguir a este segundo byte. El prximo campo para el
segundo byte es el campo de registro (REG) Ya que debemos usar el registro CX, este
valor debe ser 001 (esto se obtiene de la Figura D)
Finalmente, el campo R/M. Ya que el campo MOD<> 11, este campo debe especificar
cul registro base y cul registro de ndice estn siendo usados para generar la direccin
offset de 16 bits. En nuestro caso, usamos el campo [BX + SI + DESPLAZAMIENTO]

Esto corresponde a R/M = 000, ver Figura F


El segundo byte es 1000 1000 = 88
El tercer y cuarto byte corresponden al desplazamiento
En este caso, el valor de COUNT = 0345H. Los ltimos 2 bytes son 4503H

Esto da el siguiente cdigo objeto total para la instruccin:


MOV

CX, COUNT [BX] [SI]

8BH
88H
45H
03H

Sumario del Cdigo Objeto


Una pregunta que surge al programador Debo conformar los campos D, W, REG,
MOD y R/M, en cada instruccin? NO, la computadora lo hace (el lenguaje ensamblador
lo genera) Esta seccin se present para permitirle al programador un mejor
entendimiento del trabajo interno del microprocesador 8086/8088
Interrupciones de los Servicios Bsicos de Entrada y Salida (BIOS, por sus siglas en
ingls)

FUNCIN INT 21

(AH)=1

ENTRADA DESDE EL TECLADO

Esta funcin espera a que se digite un carcter en el teclado. Muestra el carcter en la


pantalla (eco) y retorna el cdigo ASCII en el registro AL.
(AL) = carcter ledo desde el teclado

Ejemplo:
MOV
INT

(AH)=2

AH, 1
21h

;AL = dato ASCII ledo desde el teclado

SALIDA EN EL EXHIBIDOR (display)

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -18

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Despliega un carcter en la pantalla. Algunos caracteres tienen un significado


especial:
o
o
o
o
o
o

7 CAMPANA: Suena durante un segundo


8 BACKSPACE: Mueve el cursor hacia la izquierda un carcter
9 TABULADOR: Mueve el tabulador a su prxima posicin (cada 8
caracteres)
0Ah LF: Mueve el cursor a la siguiente lnea
0Dh CR: Mueve el cursor al inicio de la lnea corriente
(DL): Carcter a desplegar en la pantalla

Ejemplo: Desplegar un carcter


MOV
MOV
INT

DL, 40
AH, 2
21h

; carcter a desplegar
; aparece en la posicin corriente del cursor
; el carcter contenido en DL

CURSOR

Ejemplo: Hacer que suene la campana 2 segundos


MOV
MOV
INT
INT

(AH)=8

DL, 7
AH, 02
21h
21h

; DL = campana
; 1 segundo
; 1 segundo

ENTRADA DESDE EL TECLADO SIN ECO

Lee un carcter desde el teclado, pero no se despliega en la pantalla


(AL) = carcter ledo desde el teclado
MOV
INT

(AH)=9

AH, 08
21h

;AL = carcter

DESPLIEGA UNA CADENA DE CARACTERES

Despliega en la pantalla la cadena apuntada por el par de registros DS:DX.


Debemos marcar el fin de la cadena con el carcter $
DS:DX apuntan a la cadena que se va a desplegar

(AH)=0A h

LEE UNA CADENA

Lee una cadena de caracteres desde el teclado Dnde queda la informacin?

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -19

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

(AH)=25h

ACTIVA EL VECTOR DE INTERRUPCIN

Activa un vector de interrupcin, para que apunte a una nueva rutina


(AL) = nmero de interrupcin
ES:BX direccin del manipulador de interrupciones

(AH)=35h

CONSIGUE VECTOR DE INTERRUPCIN

Consigue la direccin de la rutina de servicio para el nmero de interrupcin dado


en AL
(AL) = nmero de interrupcin
ES:BX direccin del manipulador de interrupcin

(AH)=4Ch

SALIDA AL DOS

Retorna al DOS. Trabaja para ambos archivos *.com y *.Exe. Recuerde que INT
20h trabaja solamente para archivos *.com
(AL) = cdigo de retorno, normalmente activo a 0, pero se puede activar a
cualquier otro nmero y usar los comandos del DOS, IF y ERRORLEVEL, para
detectar errores
PROGRAMACIN EN LENGUAJE ENSAMBLADOR

Los archivos deben terminar con la extensin ASM. Las letras minsculas
trabajan igual que las maysculas, pero durante el presente trabajo se utilizarn
maysculas para evitar confusin entre el nmero 1 y la minscula l, el 0 (cero) y la
letra O. Considrense las siguientes lneas de un programa:
.MODEL SMALL
.CODE
MOV
MOV
INT
INT

AH, 2H
DL, 2AH
21H
20H

END

Una H despus de cada nmero indica al ensamblador que los nmeros son
hexadecimales. Recuerde que DEBUG asume que todos los nmeros son
hexadecimales pero el ensamblador asume que todos los nmeros son decimales.
El ensamblador puede confundir nmeros con etiquetas, para evitar esto coloque
un 0 (cero) antes de un nmero hexadecimal que inicie con una letra.
Ejemplo:
MOV
MOV

DL, ACH
DL, 0ACH

; AC es una etiqueta
; AC es un nmero hexadecimal

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -20

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Con el fin de hacer ms legibles los programas, usaremos el tabulador para el


espaciado.
A las directivas del ensamblador se les llama tambin pseudo-operaciones.
Se les conoce como directivas porque en lugar de generar instrucciones, proporcionan
informacin y direcciones al ensamblador.
La pseudo-operacin END marca el fin del archivo fuente.
Creacin de Archivos Fuente

El ensamblador puede usar archivos fuente que contengan caracteres ASCII


estndar. Considere que no todos los procesadores de texto escriben archivos en disco
usando solamente los caracteres ASCII estndar. Antes de ensamblar un programa
verifique que est en cdigo ASCII.
Puede ver caracteres extraos en el programa. Muchos procesadores de texto
agregan informacin de formateo adicional en el archivo. El ensamblador los trata como
errores. Utilice la versin no documento de su procesador de texto. Tambin se
requiere una lnea en blanco despus de la instruccin END
Para ensamblar el programa:
A>MASM PROGRAMA;
MICROSOFT MACRO ASSEMBLER VERSION 5.10
COPYRIGHT MICROSOFT CORP 1981, 1988. ALL RIGHTS RESERVED
49822 + 219323 BYTES SYMBOL SPACE FREE
0 WARNING ERRORS
0 SEVERE ERRORS
A>

El ensamblador crea un archivo intermedio *.OBJ el cual contiene nuestro


programa e informacin adicional usada por otro programa llamado LINKER
<encadenador>.
Encadenar al archivo *.OBJ
A>LINK ARCHIVO;
Microsoft Overlay Linker Version 3.64
copyright microsoft corp 1983-1988. All rights reserved
LINK : warning L4021: No Stack Segment

Hemos creado nuestro archivo *.EXE. Ahora s necesitamos crear nuestra


versin *.COM. El archivo EXE2BIN.EXE del DOS convierte un archivo EXE a un
archivo BIN.
A>EXE2BIN ARCHIVO ARCHIVO.COM
A>
3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR
LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -21

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Si listamos los archivos que hemos creado, obtendramos:


A>DIR ARCHIVO.*
Volume in drive A has no label
directory of A:\
archivo.ASM 100
archivo.OBJ 200
600
archivo.EXE
50
archivo.COM

Recuerde los detalles del DEBUG.


A>DEBUG ARCHIVO.COM
- U
397F:0100
397F:0102
397F:0104
397F:0106

B402
B22A
CD21
CD20

MOV
MOV
INT
INT

AH, 02
DL, 2A
21
20

Note que las dos primeras y la ltima lnea no aparecen en el listado. Se


eliminan en la versin final del lenguaje de mquina porque son directivas y stas son
para documentacin. El ensamblador toma en cuenta esta documentacin a costa de
ms lneas de cdigo.
Comentarios. Para comentar una lnea ponga el ;. Todo lo que est despus del ; el
ensamblador lo considera como comentario.
Etiquetas. Pueden tener hasta 31 caracteres y pueden contener letras, nmeros y
cualesquiera de los siguientes smbolos:

.
@
_
$

interrogacin
punto
arroba
subrayado
dlar

Las etiquetas no deben iniciar con un nmero decimal y el punto se utiliza


solamente como el primer carcter.
Una de las principales diferencias entre el DEBUG y el ensamblador reside en las
etiquetas. Recuerde que con DEBUG debemos hacer el clculo nosotros. El
ensamblador refiere a etiquetas y l calcula el desplazamiento.
Cuando ponemos : despus de una etiqueta, decimos que la etiqueta es cercana
(NEAR). El trmino NEAR tiene que ver con los segmentos.
Procedimientos en ensamblador

El ensamblador asigna direcciones a las instrucciones. Cada vez que hacemos


un cambio al programa, debemos ensamblar nuevamente dicho programa.
Considrese el siguiente programa:

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -22

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

.MODEL SMALL
.CODE
PRINT _A_J
MOV
MOV

PROC
DL, A
CX, 10

PRINT _LOOP:
CALL WRITE _CHAR
INC
DL
LOOP PRINT _LOOP
MOV AH, ACh
INT
21h
PRINT _A_J

; inicia con el carcter A


; imprime 10 caracteres

; imprime carcter
; siguiente carcter del alfabeto
; continua
; retorna al DOS

ENDP

WRITE _CHAR PROC


MOV AH, 02
INT
21h
RET
WRITE _CHAR ENDP
END PRINT _A_J

; activa el cdigo de la funcin para sacar CHAR


; imprime el carcter que est en DL
: retorna de este procedimiento

PROC y ENDP son directivas para definir procedimientos. PROC define el inicio y
ENDP define el final.
En este ejemplo, tenemos 2 procedimientos; por lo tanto, necesitamos indicarle al
ensamblador cul debe usar como el procedimiento principal (donde debe el
microprocesador iniciar la ejecucin de nuestro programa) La directiva END indica al
ensamblador cual es el procedimiento principal. El procedimiento principal puede estar
en cualquier lugar del programa. Sin embargo como estamos tratando con archivos
*.COM, debemos colocar primero el procedimiento principal.
NOTA: Si encuentras algn mensaje de error que no reconozcas, verifica que hayas
digitado el programa adecuadamente. Si an falla, consulta el manual del
ensamblador
Despus, usa el DEBUG para desensamblar el programa y ver cmo el
ensamblador pone los procedimientos juntos.
C> DEBUG PRINT:A_J.COM

Procedimiento para exhibir nmeros decimales en el monitor

Digita el siguiente programa y nmbralo VIDEO_IO.ASM.


.MODEL SMALL
.CODE
TEST_WRITE_HEX

PROC

MOV DL, 3Fh


CALL WRITE_HEX
INT
20h
TEST_WRITE_HEX
ENDP

; prueba con 3Fh

; retorna al DOS

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

MOV
INT

AH, 4Ch
21h

3 -23

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

PUBLIC

WRITE_HEX

;este procedimiento convierte el byte en el registro DL a hex


;y escribe los dos dgitos hexadecimales en la posicin corriente
;del cursor
DL byte a ser convertido a hexadecimal
;
WRITE_HEX_DIGIT
;usa a:
WRITE_HEX
PUSH
PUSH
MOV
MOV
SHR
CALL
MOV
AND
CALL
POP
POP
RET
WRITE_HEX

PROC
CX
DX
DH, DL
CX, 4
DL, CX
WRITE_HEX_DIGIT
DL, DH
DL, 0Fh
WRITE_HEX_DIGIT
DX
CX

PUBLIC

WRITE_HEX

; almacena registros usados en este procedimiento


; hacemos una copia del byte

;despliega el primer dgito hexadecimal


; vamos con el nibble bajo
; elimina el nibble alto
; despliega al segundo dgito hexadecimal

ENDP

;este procedimiento convierte los 4 bit menos significativos de DL a un dgito hexadecimal


;y lo escribe en la pantalla
DL los 4 bits menos significativos contienen el nmero a ser impreso
;;
WRITE_CHAR
;usa a:
WRITE_HEX_DIGIT
PROC
PUSH DX
CPM DL, 10
JAE
HEX,_LETTER
ADD DL, 0
JMP SHORT WRITE_DIGIT

; es el nibble <10?
; no convierte a letra
; suma 30
;escribe carcter

HEX_LETTER:
ADD DL, A-10

;suma 37, convierte a letra hexadecimal

WRITE_DIGIT:
CALL WRITE_CHAR
POP DX
RET
WRITE_HEX_DIGIT
ENDP
PUBLIC

;despliega letra en la pantalla

WRITE_CHAR

;este procedimiento imprime un carcter en la pantalla usando


;funcin del DOS
DL byte a imprimir en la pantalla
;
WRITE_CHAR
PUSH
MOV
INT
POP
RET
WRITE_CHAR

PROC
AX
AH, 2
21h
AX

; funcin para sacar carcter


; saca carcter

ENDP

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -24

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

END

TEST_WRITE_HEX

En este programa, hay una nueva directiva PUBLIC la cual indica al ensamblador que
genere informacin adicional al LINKER. El LINKER nos permite traer partes separadas
de nuestro programa, ensamblarlas desde diferentes archivos fuente en un solo
programa. La directiva PUBLIC informa al ensamblador que el procedimiento nombrado
despus de PUBLIC debe ser hecho pblico o disponible a los procedimientos de otros
archivos.
Esqueleto de un programa en ensamblador

Para referencia futura, lo mnimo que requiere un programa en ensamblador es:


.MODEL SMALL
.CODE
NOMBRE_PROCEDIMIENTO PROC
INSTRUCCIONES

INT

20h

MOV
INT

AH, 4Ch
21h

NOMBRE_PROCEDIMIENTO ENDP
END
Directiva: .DATA

Declara un segmento de datos que se usa para variables de memoria. El segmento


creado por .DATA es _DATA.
Directiva: .MODEL SMALL

Se considera un programa como SMALL cuando contiene hasta 64K de cdigo y 64K
de datos.
Ya que .DATA y .STACK son datos, se ponen en un solo segmento cuando se usa el
modelo de memoria MODEL SMALL.
DS, SS

DGROUP
_DATA

El agrupamiento de los segmentos STACK y


DATA en un solo segmento es controlado por
un mecanismo del ensamblador llamado
GROUPS.

STACK

El ensamblador crea un grupo llamado


DGROUP que a su vez crea un solo segmento
con .DATA y STACK.

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -25

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Directiva: .DOSSEG
Causa que el STACK SEGMENT se cargue en memoria despus del DATA
SEGMENT; hay una razn para esto. El segmento de datos que creamos tiene datos
que necesitan estar en el archivo *.EXE, as que puedan ser copiados en memoria
cuando nuestro programa est corriendo. De igual forma, el STACK necesita tomar
espacio en memoria, pero la memoria del STACK no necesita estar inicializada
(solamente el SS:SP tiene que activarse)
De esta forma, poniendo el STACK SEGMENT despus del DATA SEGMENT no
necesitamos espacio en el disco para el STACK.
La directiva DOSSEG indica al ensamblador que queremos los segmentos de nuestro
programa cargado en un orden especfico (el segmento de cdigo primero y el STACK
al ltimo)
Veamos lo expuesto en un ejemplo:
Obtener la suma de 10 datos y desplegar el resultado en la pantalla.
DOSSEG
.MODEL SMALL
.STACK
. DATA

; asigna un STACK de 1K

PUBLIC DATOSSUM
DATOSSUM DB
01h, 02h, 03h, 04h, 05h
DB
06h, 07h, 08h, 09h, OAh
.CODE
.SUMA

; datos que vamos


; a procesar

PROC
MOV
MOV

AX, DGROUP
DS, AX

XOR
XOR
MOV

BX, BX
DL, DL
CX, OAh

; ndice de acceso al rea de datos


; acumulador de datos
; nmero de datos a procesar

ACUMULA:
ADD DL, DATOSSUM [BX]
INC
BX
LOOP ACUMULA
MOV
INT
MOV
INT
SUMA

AH, 02h
21h
AH, 4Ch
21h

; DL contiene el resultado
; despliega el resultado
; AL = dato a desplegar
;
; salida al DOS

ENDP
END

Los siguientes ejercicios propuestos, son con el fin de mostrar el uso del
conjunto de instrucciones del microprocesador y sus modos de direccionamiento.
3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR
LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -26

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Empezamos a usar instrucciones bsicas y modos de direccionamiento


bsicos y vamos aumentando la complejidad de las instrucciones y de los modos de
direccionamiento en forma tal que al concluir los ejercicios hayamos cubierto un 80%
del conjunto de instrucciones de la mquina.
Para cada ejercicio est propuesta la solucin en un diagrama de flujo,
despus se muestra la codificacin en lenguaje ensamblador y para los usuarios de
la utilera DEBUG del DOS, se muestra la codificacin en lenguaje de mquina.
Todos los programas con DEBUG inician en la localidad 100 y los comandos a
utilizar son: R (registro), T (ejecucin paso a paso) y E (examina y cambia memoria)
Con estos comandos, podemos ejecutar cualquiera de los programas.
Con el fin de aprovechar el lenguaje ensamblador, tambin se muestra la
codificacin y la ejecucin en el Turbo Ensamblador de Borlan.
EJERCICIO 1. El contenido de la localidad 0200 tiene un dato de 8 bits. Realizar un
programa que coloque en la localidad de memoria 0201 el nibble (4
bits) ms significativo, tomando en cuenta que el nibble menos
significativo debe ser 0.
SOLUCIN
Se puede ver grficamente el contenido de las localidades 0200 y 0201 para
comprender mejor el enunciado:
200

b 7 b6 b5 b4

B3 b2 b1 b0

201

b 7 b6 b5 b4

Podemos hacerlo con la operacin AND, donde:


bn 1 = bn
bn 0 = 0
Diagrama de flujo:
MSCARA

AL [200]

AL AL and F0

[201] AL

FIN
3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR
LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -27

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Codificacin en lenguaje ensamblador:


MASCARA:
MOV AL, [200]
AND AL, F0
MOV [201], AL
MOV AH, 4C
INT
21

;mueve el contenido de la localidad 200 a AL


;coloca 1111 0000 en AL
;mueve el contenido de AL a la localidad 201
;mueve el contenido de 4C a AH

Codificacin en lenguaje mquina:


0100
0103
9105
0108
010A

A0
24
A2
4B
CD

00
F0
01
4C
21

20
02

Ejecucin:

R
T
T
T
T
E

EJERCICIO 2.

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -28

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

EJERCICIO 3. Realizar un programa que coloque en la localidad de memoria 202


el nmero menor de los contenidos en las localidades 200 y 201.
Considere nmeros sin signo.
NOTA: El DEBUG asume que los datos son hexadecimales, mientras que el
ensamblador considera que son decimales. En caso de usar el
ensamblador agregar H al final del dato.

SOLUCIN
Grficamente, se tiene:
200

N1

201

N2

El menor de los dos

202

Diagrama de flujo:
COMPARA

AL [200]

(1)

AL vs [201]

(2)

AL [201]

NO

AL [201]

SI

(3)

SII
[202] AL

(4)

FIN

(5)

Codificacin en lenguaje ensamblador:


COMPARA: MOV

SII:

CMP
JNB
MOV
MOV
MOV
INT

AL, [200]
AL, [201]
SII
AL, [201]
[202], AL
AH, 4C
21

Si empleamos el DEBUG, podemos utilizar el comando ASSEMBLY e iniciar en la


localidad de memoria 100; o bien, podemos utilizar la tabla de instrucciones y codificar
directamente en lenguaje de mquina empleando el comando E, que permite capturar
en hexadecimal el programa.
3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR
LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -29

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Codificacin en lenguaje mquina:


0100
0103
0107
0109
010C
010F
0111

A0
3A
73
A0
A2
B4
CD

00
06
03
01
02
4C
21

02
01

02

02
02

Para ejecutar el programa, cargamos el registro IP con el valor de inicio del programa,
escribiendo:
_R IP 100 despus con el comando _T (Trace) ejecutamos paso a paso el programa.

EJERCICIO 4. Sumar 2 nmeros binarios de 24 bits y almacenar el resultado a


partir de la localidad de memoria 0206h. Los bits menos
significativos de los nmeros empiezan en las localidades 0200h y
0203h.
SOLUCIN
Se puede ver grficamente el contenido de las localidades 0200h a 0208h para
comprender mejor el enunciado:
200

N0

_E

201

N1

_E

202

N2

203

M0

204

M1

205

M2

_E

200

AA

AA

AA

203

BB

BB

BB

206

00

00

00

65

66

66

Para introducir los datos, usamos la


instruccin E (examina y/o cambia el
contenido de la localidad de memoria

206

N0 + M0

207

N1 + M1 + C

208

N2 + M2 + C

Codificacin en lenguaje ensamblador:


SUMA:
MOV
ADD
MOV
MOV
ADC
MOV
MOV
ADC
MOV
RET

AL, [200]
AL, [203]
[206], AL
AL, [201]
AL, [204]
[207], AL
AL, [202]
AL, [205]
[208], AL

;mover el contenido de la localidad 200 a AL


;sumar el contenido de la localidad 201 a AL
;mover el contenido de AL a la localidad 206
;mover el contenido de la localidad 201 a AL
;sumar el contenido de la localidad 204 con AL
;mover el contenido de AL a la localidad 207
;mover el contenido de la localidad 202 a AL
;sumar el contenido de la localidad 205 con AL
;mover el contenido de AL a la localidad 208

8 LSB

2 BYTE

8 MSB

NOTA: Observe que en las instrucciones de MOVer no se afecta ninguna bandera del PSW.
[200] se refiere al contenido de la direccin 200.
3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR
LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -30

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

AA AA AA = 1010
BB BB BB = 1011
Acarreos
111

1010
1011
111

1010
1011
111

1010
1011
111

1010
1011
111

1010
1011
1

0110

0110

0110

0110

0110

0101

EJERCICIO 5. Uso del registro CX como contador. Vamos a mover los 8 bits menos
significativos del registro BL al registro BH.
Sean los datos iniciales:
BX = BH y BL = 43A6

La instruccin que usaremos ser RLC


BX, 1, 8 veces. Para este
tipo de repeticiones usaremos al registro CX como contador.
SOLUCIN
Diagrama de flujo:
ROTA8

BX 43A6

CX 08

nmero inicial

RLC BX, 1

CX CX - 1

loop

NO
CX = 0?
SI
continua
FIN

Codificacin en lenguaje ensamblador:


ROTA8:

MOV
MOV
OTRAVEZ: RLC
LOOP
MOV
INT

BX, 43A6
CX, 08
BX, 1
OTRAVEZ
AH, 4C
21

;(1)
;(2)
;(3)
;(4)
;(5)
;(6)

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -31

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

NOTA: Observar que en (4) ponemos LOOP


DEBUG pone un .

OTRAVEZ y como es un salto hacia atrs el

Codificacin en lenguaje mquina:


0100
0103
0106
0108
010A
010C

B3
B9
D1
E2
B4
CD

A6
08
D3
FC
4C
21

43
00

;(1)
;(2)
;(3)
;(4)
;(5)
;(6)

NOTA: En 0108 saltamos hacia atrs 4 localidades de memoria, es decir:


0000 0100
Como el salto es hacia atrs, lo ponemos como negativo en notacin complemento a 2,
es decir:
C1 =

1111

C2 =

1111
F

1011
+1
1100
C

Cuando saltamos hacia delante el nmero es positivo. Para salto corto usamos 8 bits y
para salto largo 16 bits.

EJERCICIO 7. Calcular la suma verificacin de una serie de datos. La longitud de


la serie de datos est en la localidad 201h y la serie comienza en la
localidad 202h. Almacenar la suma verificacin en la localidad 200h.
La suma verificacin se forma haciendo la suma O exclusiva entre
todos los nmeros de la serie.
SUGERENCIA: Utilice CX como contador.

SOLUCIN
200

Suma verificacin

201

longitud

202

inicio

Diagrama de flujo:
SUMA VERIF

CH 0
CL [201]

BX 202

Direccin de inicio

AL [BX]
3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR
LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -32

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

BX BX + 1

AL AL BX

CX CX - 1
NO
CX = 0?
SI
[200] AL

FIN

Codificacin en lenguaje ensamblador:


SUMAVERIF:
MOV
MOV
MOV
MOV
SUMAO: INC
XOR
DEC
LOOP
MOV
RET

CH, 0
CL, [201]
BX, 200
AL, [BX]
BX
AL, [BX]
CX
SUMAO
[200], AL

;poner 0 en CH
;mover el contenido de la localidad 201 a CL
;mover el contenido de 200 a BX

;mover el contenido de BX a AL
;incrementar BX
;O exclusiva contenidos AL y BX
;decrementar CX
;mover el contenido de AL a la localidad 200

Codificacin en lenguaje mquina:


0100
0102
0106
0108
0109
010C
010D
010F
0111
0114
0116

B5
8A
3B
4B
8A
43
32
E2
A2
B4
CD

00
0E
02

01
02

02

07
07
F8
00
4C
21

02
Retorno al DOS

Si utilizamos la tabla de instrucciones y sus respectivos cdigos de DEBUG, podemos capturar


en lenguaje de mquina el programa. Estando en DOS teclear:
C>DEBUG

_E 100

_R IP,100

_T

Introducimos el programa. Para ejecutarlo, colocamos 100 en el registro IP:


despus, para ejecutar el programa paso a paso usamos el comando T:
etc.

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -33

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

EJERCICIO 8. Calcular la suma de una serie de nmeros de 16 bits. La longitud de


la serie est en la localidad de memoria 0202 y la serie empieza en la
localidad de memoria 0203. Almacenar la suma en las localidades de
memoria 0200 y 0201. Considere que la adicin puede estar contenida
en 16 bits
SOLUCIN
200

8 bits menos significativos

201

8 bits ms significativos

202

Longitud = 3

203

01 (bits menos significativos)

204

02 (bits ms significativos)

205

01 (bits menos significativos)

206

02 (bits ms significativos)

207

01 (bits menos significativos)

208

02 (bits ms significativos)

N0

N1

N2

Diagrama de flujo:
INICIO

CARRY 0
CL [202]
CH 0

CONTADOR

BX 203
AX 0

AX AX + [BX] + carry

BX BX + 2

CX CX - 1
NO
CX = 0?

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -34

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

SI
[200] AL

[201] AH

FIN

Codificacin en lenguaje ensamblador:


INICIO:

CLC
MOV
MOV
MOV
MOV
RETORNO: ADC
INC
LOOP
MOV
END

CH, 0
CL, [202]
BX, 203
AX, 0
AX, [BX]
BX
RETORNO
[200], AX

Codificacin en lenguaje mquina: Usamos el DEBUG para ejecutar el programa en


lenguaje de mquina
0100
0101
0103
0107
010A
010D
010F
0112
0114

F8
B5
8A
B3
B8
13
83
E2
A3

00
0E
03
00
07
C3
F9
00

02
02
00

CLC
MOV
CH, 0
MOV
CL, [202]
MOV
BX, 203
MOV
AX, 0
ADC
AX, [BX]
ADD
BX, 2
LOOP, RETORNO
MOV
[200], AX

02

02
20

EJERCICIO 9. Determinar el nmero de elementos que sean positivos, negativos


y cero. La longitud del bloque est en la localidad 0203, el bloque
inicia en la localidad 0204. En la localidad 0200 deposite el nmero de
elementos negativos, en la 0201 el nmero de elementos ceros y en
la 0202 el nmero de elementos positivos.
SOLUCIN
En forma grfica, se tiene:
200

Nmero de elementos NEGATIVOS

201

Nmero de elementos CERO

202

Nmero de elementos POSITIVOS

203

LONGITUD

204

INICIO

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -35

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Diagrama de flujo:
INICIO

[200] 0
[201] 0
[202] 0
CH 0
CL [203]
BX 204h

AL [BX]
AL vs 00
SI
NO

AL 0

Z=1
NO

negativos

SI
cero

[200] [200]+1

[201] [201]+1

positivos
[202] [202]+1

BX BX+1
CX CX-1
NO
CX = 0
SI
FIN

Codificacin en lenguaje ensamblador:


INICIO:

MOV
MOV
MOV
MOV
MOV
MOV
MOV
MOV
RETORNO: CMP
JGE
INC
SIGUE:
INC
LOOPNZ
FIN:
RET
SII:
JNZ
INC
JMP

AL, 00h
[200], AL
[201], AL
[202], AL
CH, AL
CL, [203]
BX, 0204
AL, [BX]
AL, 00h
SII
[200]
BX
RETORNO

;SI es palabra reservada


;SI ndice fuente

NO
[201]
SIGUE

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -36

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

NO:

INC
JMP

[202]
SIGUE

EJERCICIO 10. Encontrar al elemento ms pequeo de un bloque de datos. La


longitud del bloque est en la localidad 4001 y el bloque inicia en la
localidad 4002. Almacene el resultado en la localidad 4000,
considerando nmeros sin signo.
SOLUCIN
Grficamente, se tiene:
4000

MENOR

4001

LONGITUD

4002

DATO 1
DATO 2

DATO n

Diagrama de flujo
MENOR

DI 4002
AL [DI]
CL [4001]
CX = contador

CH 00

DI DI+1

<
AL vs [DI]

AL [DI]

CX CX-1

CX = 0?
NO
SI
4000 [AL]
3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR
LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -37

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

FIN

Codificacin en lenguaje ensamblador:


MENOR:

X:

Y:

MOV
MOV
MOV
MOV
INC
CMP
JB
MOV
LOOP
MOV
END

DI, 4002
AL, [DI]
CL, [4001]
CH, 0
DI
AL, [DI]
Y
AL, [DI]
X
[4000], AL

;JL para nmeros con signo

EJERCICIO 11. Determinar cuntos bits valen 1 en el contenido de la localidad de


memoria 200. Almacene el resultado en la localidad 201
SOLUCIN
Grficamente, se tiene:
200

DATO

201

# DE UNOS DE DATO

Diagrama de flujo
UNOS

[201] 0
AL [200]
CX 0008

X
Rotamos hacia la
izquierda AL REG AL

NO
C = 1?
SI
[201] [201]+1

Y
CX CX-1

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -38

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

NO
CX = 0?
SI
FIN

Codificacin en lenguaje ensamblador:


MENOR:

X:

Y:

MOV
MOV
MOV
MOV
ROL
JNC
INC
LOOP
END

AL, 00h
[201], AL
AL, [200]
CX, 0008h
AL
Y
[201]
X

EJERCICIO 12. Determinar la longitud de un mensaje ASCII. Los caracteres son de


7 bits, el octavo es 0. La cadena de caracteres en la cual viene
incluido el mensaje inicia en la localidad 201. El mensaje inicia con
STX (02h) y finaliza con ETX (03h) Colocar la longitud del mensaje en
la localidad 200 (no contar STX ni ETX)
SOLUCIN
Grficamente, se tiene:
200

LONGITUD DEL MENSAJE

201

INICIO 02h STX

202
203

LONGITUD DEL MENSAJE

FINAL 03h ETX

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -39

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Diagrama de flujo
LONG

[200] 00
DI 202

X
AL [DI]
AL vs ETX

SI
Z = 1?
NO
[200] [200]+1

FIN

DI DI+1

Codificacin en lenguaje ensamblador:


LONG:

MOV
MOV
MOV
CMP
JE
INC
INC
JMP
END

X:

FIN:

[200], 00h
DI, 0202h
AL, [DI]
AL, ETX
FIN
[200]
DI
X

EJERCICIO 13. Investigar una cadena de caracteres ASCII para determinar el


ltimo carcter distinto del blanco. La cadena empieza en la
localidad 202 y finaliza con CR (0Dh) Colocar la direccin del ltimo
carcter diferente del espacio en la localidad 200 y 201.
SOLUCIN
Grficamente, se tiene:
200
201
202

INICIA CADENA
LONGITUD DE LA CADENA
0Dh CR

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -40

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Diagrama de flujo
DIR

SI 202

X
AL [SI]
AL vs CR
Si
AL = CR
No

[200] SI

AL vs SPACE
FIN
Si
AL = SPACE
No
SI SI+1

SI SI-1

Codificacin en lenguaje ensamblador:


DIR:
X:

MOV
MOV
CMP
JE
CMP
JE
INC
JMP
ANTESALM: DEC
ALMACENA: MOV
END

SI, 202
AL, [SI]
AL, 0dh
Almacena
AL, 20h
ANTESALM
SI
X
SI
200, SI

;AL vs CR
;AL vs SPACE

EJERCICIO 14. Reemplazar todos los dgitos que estn a la derecha del punto
decimal por caracteres blancos. La cadena inicia en la localidad
201 y consiste de nmeros decimales codificados en ASCII y un
posible punto decimal (2Eh) La longitud est en la localidad 200. Si
no aparece punto decimal, asuma que est implcito en el lado
derecho.
NOTA: En ASCII los decimales 0,,9 se representan como 30,,39.

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -41

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

SOLUCIN
Grficamente, se tiene:
200

LONGITUD DE LA CADENA

201

INICIA CADENA

2E

PUNTO DECIMAL

20h
20h
BLANCOS
20h
20h

Diagrama de flujo
PUNTO
AH = BLANCO
BX 201

AH 20

R2

CH 0
CL [200]

BX
BX+1

R1
AL [BX]

[BX] AH

AL vs 2E

CX CX-1
SII
NO

Z=1

CX = 0
NO

BX BX+1

SI
FIN

CX CX-1

NO
CX = 0
SI
FIN

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -42

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Codificacin en lenguaje ensamblador:


PUNTO:

RI:

SII:
R2:

MOV
MOV
MOV
MOV
CMP
JZ
INC
LOOP
END
MOV
INC
MOV
DEC
JNZ
END

BX, 201
CL, [0200]
CH, 00h
AL, [BX]
AL, 2Eh
SII
BX
R1
AH, 20h
BX
[BX], AH
CX
R2

EJERCICIO 15. Verificar la paridad par de caracteres ASCII. La longitud de la


cadena est en la localidad 201h e inicia en la 202h. Si la paridad de
todos los caracteres de la cadena es correcta, borrar el contenido de
la localidad 200h; en caso contrario colocar FF
SOLUCIN
Grficamente, se tiene:
200

00 si la paridad es correcta
FF si la paridad es incorrecta

201

Longitud de la cadena

202

Inicia la cadena

Fin de la cadena

AL = DATO
b7 b6 b5 b4 b3 b2 b1 b0 Contamos los UNOS
Si contador = par

Correcto

Si contador = non

Incorrecto

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -43

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Diagrama de flujo

Rutina de verificacin de paridad

PARIDAD

S_PARIDAD

BX 202

PILA CX

CH 0

CX 8

CL [201]

AH 0

R2
AL [BX]
Verifica y marca
con 00 o FF la
localidad 200

S_PARIDAD

AL (C)

NO

BX BX+1

C=1

CX CX-1

SI
AH AH+1

CX = 0
NO

CX CX-1
SI
NO

FIN
C=0
SI
AH (C)

NO
C=1
SI
[200] FF

CX PILA

Retorno de
subrutina

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -44

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Codificacin en lenguaje ensamblador:


Paridad:
PARIDAD:

X:

MOV
MOV
MOV
MOV
CALL
INC
LOOPNZ
END

BX, 202
CH, 00
CL, [201]
AL, [BX]
S_PARIDAD
BX
X

Rutina de verificacin de paridad:


S_PARIDAD: PUSH

MOV
MOV
RCR
JNC
ADD
LOOPNZ
RCR
JNC
MOV
POP
RET

R2:

SII:

NO:

CX
CX, 0008h
AX,00h
AL
SII
AH, 01h
R2
AH
NO
[0200], FFh
CX

EJERCICIO 16. Comparar dos cadenas de caracteres ASCII para determinar cul
sigue a la otra en orden alfabtico. La longitud de las cadenas est
en la localidad 201. Una cadena inicia en la localidad 202 y la otra en
la localidad 252. Si la cadena que inicia en la localidad 202 es menor
o igual a la otra cadena, borrar la localidad 200, en caso contrario
almacenar FF en la localidad 200.
SOLUCIN
Grficamente, se tiene:
200

00 si la cadena 1 es menor o igual a la cadena 2


FF si la cadena 1 es mayor que la cadena 2

201

Longitud de las cadenas

202

Inicia la cadena 1

252

Inicia la cadena 2

NOTA: En lugar de utilizar los dos registros de ndice, vamos a utilizar un apuntador ms
un desplazamiento.

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -45

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Diagrama de flujo

COMPARA

[200] 00
DI 202
CH 00
CL [0201]

AL
[DI]
AL vs [DI+10h]

NO
Z=1
SI
DI DI+1
CX CX-1

SII
SIGNO = NO
[200] FF

No
CX = 0
Si
FIN

Codificacin en lenguaje ensamblador:


COMPARA:

R:

NO:
SII:

SUB
MOV
MOV
MOV
MOV
CMP
JNC
INC
LOOPNZ
END
JB
MOV
END

[200], [200]
DI, 0202h
CH, 00h
CL, [0201]
AL, [DI]
AL, [DI+10h]
NO
DI
R

;asumimos que cadena 1 es menor o igual a cadena 2


;DI apunta al inicio de la cadena 1
;CX igual a la longitud de las cadenas

;apunta a la otra cadena

SII
[0200], FFh

EJERCICIO 17.

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -46

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Tablas.
La instruccin XLAT realiza la traduccin a travs de una tabla de bsqueda. La
tabla se debe cargar en memoria y la direccin de inicio (base) se guarda en el
registro BX antes de utilizar esta instruccin.
Si los datos de esta tabla son A(0), A(1), , A(255), un valor i en AL se
reemplaza por el valor A(i) al ejecutarse XLAT.
Funcionamiento de la instruccin XLAT.
Los contenidos de los registros BX y AL se suman para obtener la direccin de una
posicin de memoria y el contenido de dicha posicin se copia en AL.
La instruccin XLAT traduce datos de 8 bits; por lo tanto, estn restringidos a un rango de
0 a 255.
BX A(0) BX + AL =Direccin de una posicin de memoria
El contenido de dicha posicin se copia en AL
A(1)
A(2)
A(3)

A(i)

EJERCICIO 18. Conversin del cdigo GRAY a cdigo GRAY-EXCESO 3, sin


utilizar la instruccin XLAT.
SOLUCIN
La tabla funcional para la conversin de cdigos, se muestra a continuacin:
DEC

Cdigo GRAY
EXCESO 3

Cdigo GRAY

G3 G2 G1 G0 GE3 GE2 GE1 GE0


5000

AH

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1

0
0
0
0
1
1
1
1
1
1
1
1
0
0
0
0

0
0
1
1
1
1
0
0
0
0
1
1
1
1
0
0

0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0

0
0
0
0
0
1
1
1
1
1
1
1
1
0
0
0

0
1
1
1
1
1
1
1
1
0
0
0
0
0
0
0

1
1
1
0
0
0
0
1
1
1
1
0
0
0
0
1

AL

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1

DATO

3 -47

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Si consideramos que esta tabla de valores se encuentra almacenada a partir de la


localidad 5000h, podemos comparar el contenido del acumulador contra cada uno de los
contenidos de las localidades, hasta encontrar la que acople.
Cuando se encuentra el acoplamiento, los 4 bits menos significativos de esa localidad son
el resultado de la conversin.
Diagrama de flujo

GRAY_GEX3

SI 5000

R
AH [SI]
LSR

AH, Y

AH vs AL

SI
AH = AL
NO
SI SI+1

AH [SI]
AH AH .AND. 0F

FIN

Codificacin en lenguaje ensamblador:


GRAY_GEX3: MOV

R:

MOV
LSR
LSR
LSR
LSR
CMP
JE
INC
JMP
CONVIERTE: MOV
AND
END

SI, 5000h
AH, [SI]
AH
AH
AH
AH
AH, AL
CONVIERTE
SI
R
AH, [SI]
AH,0Hh

;direccin de inicio de la tabla


;obtenemos GRAY en los 4 bits
;menos significativos

;obtenemos la conversin en los


;4 bits menos significativos de AH

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -48

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Errores de programacin frecuentes.


1.
2.
3.
4.
5.
6.

Invertir el orden de sus operandos


Utilizar las banderas en forma incorrecta
Considerar la lgica en forma errnea
Confundir direcciones y datos
Manejar errneamente matrices y cadenas. El problema suele encontrarse en
que se exceden los lmites
Organizar el programa en forma inadecuada. Inicio de contadores,
apuntadores, no almacenar resultados, etc.
La mejor manera de acelerar los programas del microprocesador consiste en
reducir el nmero de saltos.

Ejemplos de solucin de problemas utilizando software y hardware.


Ejemplo 1. Se tiene un convertidor analgico/digital (A/D) y se desea leer la
informacin cada segundo hasta tener 100 valores, los cuales deben
almacenarse en una tabla de datos. Adems,

Calcular el valor promedio de los valores ledos e indicarlo en un


exhibidor numrico.
Obtener el valor mnimo y desplegarlo en un exhibidor numrico.
Adquirir el valor mximo y presentarlo en un exhibidor numrico.
Iniciar nuevamente el ciclo despus de una hora.

SOLUCIN

Se necesita una memoria de acceso aleatorio (RAM) para los valores ledos del
convertidor A/D.
Se requieren tres puertos paralelos de entrada/salida (E/S) para los exhibidores
numricos correspondientes a VMX, VMN y VPROM.
Se necesita un puerto de E/S para el convertidor A/D.
Se requiere una memoria de programable de slo lectura (PROM) para el programa.

El diagrama a bloques de la siguiente figura, muestra la solucin:


P 8088
AB

DB

AB = Bus de Direccin
DB = Bus de Datos

RAM
1 Kx8
100 VALORES

PROM
1 Kx8
PROGRAMA

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -49

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

8255
PA

VMN

PB

VPROM

PC

VMX

EXHIBIDORES NUMRICOS

CONVERTIDOR
8

8255
PA

A/D

PB
NO USADOS
PC

Configuracin de los
Circuitos Integrados

Localidades

RAM
ROM

Las primeras de 1K
Las ltimas de 1K

8255

Direccin

Contenido

40
41
42
43

VMIN = PA
VPROM = PB
VMX = PC
C A/D = CONTROL

E/S

8255

Direccin
50
51
52
53

Contenido
C A/D = PA
No usado = PB
No usado = PC
CONTROL

Diagrama de flujo

CAD.ASM

INICIACION

Define puerto de entrada y puertos de salida

100 VALORES

Lee 100 valores del convertidor A/D cada


segundo

V_MIN

Obtiene el valor mnimo

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -50

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Obtiene el valor mximo

V_MAX

Obtiene el valor promedio

V_PROM

DESPLIEGA

Pone en los exhibidores numricos los


valores calculados

RETARDO_1H

Temporiza una hora y volvemos nuevamente


a ejecutar el proceso

Ejemplo 2. Se tienen 2 mquinas herramientas que aceptan informacin en cdigo


Gray y en cdigo Exceso-3. La mquina que les proporciona la
informacin trabaja en cdigo binario y alimenta cada segundo un dato,
consistente en 2 nibbles.
Resuelva el problema
microprocesador.

de

conversin

de

cdigo

con

un

SOLUCIN

La solucin del hardware (mecamtica) se presenta en el siguiente diagrama a


bloques:
P
AB

AB Bus de Direccin
DB Bus de Datos
DB
PROM
1Kx8
8255
8
MQUINA 1
PA
BINARIO
8
MQUINA 2
PB
GRAY
8
MQUINA 3
PC
EXC-3
REGISTRO
DE
CONTROL

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -51

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Configuracin de los
Circuitos Integrados

Localidades

PROM

Las ltimas de 1K

8255

Direccin
E/S

40
41
42
43

Contenido
MAQ1 = PA
MAQ2 = PB
MAQ3 = PC
CONTROL

Entrada
Salida
Salida

Diagrama de flujo

CONV.ASM

INICIACION

LEE DATO BIN

Define puerto A como entrada y los puertos B


y C como salida
Lee dato binario de la mquina 1

CONV_GRAY

Se convierte dato a cdigo GRAY, usando


tablas de conversin y se pone el resultado en
la mquina 2

CONV_EXC3

Se convierte dato a cdigo EXC3, usando


tablas de conversin y se pone el resultado en
la mquina 3

UN_SEG

Temporizamos un segundo y volvemos a


iniciar el proceso

Ejemplo 3. Cierto proceso debe llevarse a cabo en forma secuencial cada segundo
por cada paso. El proceso se realiza empezando por A, despus B, a
continuacin C y finalmente D. Si se efecta en el orden indicado deber
activarse desde el inicio un diodo emisor de luz (LED, por sus siglas en
ingls) verde y al finalizar el proceso, retornar al programa principal.
Si el proceso no se lleva a cabo en el orden mencionado, lo llevaremos al
estado ERROR y se debe activar un LED rojo para indicar esta
condicin. El circuito deber permanecer en ese estado hasta que se
aplique un pulso de RESET retornando al estado inicial.

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -52

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

SOLUCIN
Para la parte del hardware, proponemos un sistema mnimo conteniendo una PROM de
2Kx8 y un adaptador de perifricos en paralelo 8255, como se muestra en el siguiente
diagrama a bloques:
P

AB

AB Bus de Direccin
DB Bus de Datos
DB
PROM
2Kx8
8255
PA

En los 4 bits ms significativos


conectamos los sensores de los
procesos

PB

En el bit ms significativo conectamos


el LED verde y en el segundo bit ms
significativo el rojo

PC

No se usa

a 1, a 0

REGISTRO
DE
CONTROL

Vamos a ubicar la PROM en las ltimas localidades del espacio de direccionamiento y


al 8255 en las primeras localidades del espacio de ENTRADA/SALIDA, como se indica
en la siguiente tabla:
Direccin
Puerto
de E/S
0
A
Entrada
1
B
Salida
2
C
No usado
3
Registro de control

Se deben leer los 4 sensores conectados al puerto A cada segundo.

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -53

COMPUTACIN V
MICROPROCESADORES Y MICROCOMPUTADORAS

Diagrama de estados:

1/verde
INICIO

1/verde
A

1/verde
B

1/verde
C

0/rojo

0/rojo

0/rojo
0/rojo

ERROR
RESET
Apaga rojo
Apaga verde

Subrutinas requeridas:
INICIACIN
ACTIVA_ROJO
ACTIVA_VERDE
UN_SEGUNDO

Diagrama de flujo

INICIACION

AL

Puerto A = ENTRADA
Puerto B = SALIDA
Puerto C = NO USADO

[03] AL

RET

3. LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR


LUIS URIETA PREZ Y PABLO FUENTES RAMOS

3 -54

You might also like