Está en la página 1de 61

Fundamentos del lenguaje ensamblador

Fundamentos del
lenguaje ensamblador

4.1.-El lenguaje ensamblador y el lenguaje de mquina.


Al dar una definicin, en pocas palabras, de una computadora, se puede decir que se trata de un equipo
para interpretar y ejecutar una secuencia de elementos de informacin almacenados en la memoria y
realizar una serie de operaciones que estarn determinadas por la secuencia de pasos ejecutados. Las
operaciones efectuadas incluyen la transformacin de datos por la unidad aritmtica a partir de cdigos en
memoria, as como la especificacin de la direccin de la siguiente instruccin a ser ejecutada.
La interpretacin de las sucesivas instrucciones en una secuencia y su realizacin, constituye lo que se
llama ejecucin de un programa. Aquellos programas que pueden ejecutarse directamente por el
microprocesador, se dice que estn en lenguaje de mquina.
Los programas escritos en lenguaje de mquina son muy difciles de implementar, ello se debe a que el
usuario tiene que convertir el nemotcnico que representa a la instruccin en cdigo binario, especificar la
direccin de memoria donde se encuentre la instruccin y trabajar con las variables asociadas a una o
varias direcciones de memoria.
4.2.-La puesta a punto de programas en ensamblador.
Para poner a punto un programa en lenguaje ensamblador hay que pasar por diferentes etapas. En la fig.
4.1 se muestra un diagrama en bloques genrico de los pasos a seguir.

PROGRAMACION

EDICION

ENSAMBLAJE

PUESTA A PUNTO

CARGA/ENLACE

Fig. 4.1.- Pasos para la puesta a punto de un programa en ensamblador.

235

Fundamentos del lenguaje ensamblador


4.2.1.-La Programacin.
La programacin requiere de ejercitacin, experimentacin y de concentracin. Generalmente el costo
para el desarrollo del software en un sistema basado en microprocesador es mucho mayor que el costo
para el desarrollo del hardware.
Para el programador de microprocesadores es importante conocer, adems del repertorio de instrucciones,
la arquitectura interna del procesador.
Los pasos a seguir en la programacin son:
a.-)Anlisis del problema: En este primer paso el programador debe cerciorarse de la informacin de
entrada y el resultado que se quiere producir, se establece adems una relacin con el hardware basada en
la capacidad de RAM y ROM demandada, el procedimiento de entrada/salida, la capacidad de la pila
(stack), las condiciones de tiempo, etc.
b.-)Diseo: Se deben desarrollar varios objetos de datos (elementos), para cada objeto habr un conjunto
de operaciones bsicas a realizar. Considere que estas operaciones existen en forma de subrutinas y
escriba un algoritmo que resuelva el problema de acuerdo a los requerimientos.
Definicin de algoritmo: Es un conjunto de instrucciones que llevan a cabo una tarea en particular y debe
satisfacer los criterios de: entrada, precisin, limitacin y eficacia.
Los diagramas de flujo( equivalentes al algoritmo) pueden dividirse en tres niveles:
(1).-Conceptual: Se hace una descripcin general del problema, independientemente del tipo de
microprocesador (grandes bloques).
(2).-Diagramas de flujo con los algoritmos para cada una de las operaciones bsicas: Tambin
independiente del microprocesador, cada bloque del diagrama conceptual es subdividido de acuerdo al
algoritmo necesario para desarrollarlo, pensando en las operaciones que tienen que ser desarrolladas en el
bloque, fijando las acciones y la secuencia en que se van a ejecutar.
(3).- Diagrama de flujo con las instrucciones: Dependiente del microprocesador, cada smbolo en este
diagrama debe representar de una a tres instrucciones. A partir de este diagrama el programa puede ser
escrito directamente.
c.-)Anlisis: Se puede elaborar un algoritmo alternativo y compararlo con el anterior.
d.-)Escribir el programa fuente: Se escribe el programa fuente.
Los elementos que identifican las partes constituyentes de una lnea en ensamblador son:
DIRECCIN CODIGOHEX ETIQUETAS OPERADOR

OPERANDOS

COMENTARIOS

4.2.2.-La Edicin.
El programa elaborado se edita en cualquier editor de textos que exporte en formato ASCII, obtenindose
el archivo fuente correspondiente (tpicamente con extensin .ASM .SCR).

236

Fundamentos del lenguaje ensamblador


4.2.3.-El Ensamblaje.
A travs del mismo se depuran los errores de sintaxis, el ensamblaje se realiza sobre el lenguaje fuente
previamente elaborado. Ante la presencia de errores se debe proceder a la correccin de los mismos a
travs del proceso de edicin.
4.2.4.-La carga-enlace.
Ejecutada a travs del enlazador, permite al usuario escribir programas en ensamblador que estn
constituidos por varios mdulos. El Enlazador resuelve referencias externas y realiza reubicaciones de
direcciones, adems de generar diferentes formatos de archivos. Cuando se generen errores en la
carga/enlace, deben depurarse los mismos en el editor. Debe tenerse especial cuidado en que despus de
corregirse los errores, el archivo fuente debe ser nuevamente ensamblado para que el enlazador ejecute su
accin sobre el archivo objeto corregido.

Como ejemplo, veamos los pasos a seguir en la seccin de programa expuesto en algoritmo 4.1,
elaborado para un microcontrolador perteneciente a la serie MCS51.
INICIO:

LAZO:

MOV DPTR,#3000H
XRL A,A
MOV R1,10H
MOVX @DPTR,A
INC DPTR
DJNZ R1,LAZO

; Se define un puntero
; Coloca al acumulador en cero
; Se define un contador
; Se llena una zona de RAM
; con ceros

CONTINUA:

Algoritmo 4.1.- Ejemplo de un programa en ensamblador para la serie MCS51.


Una vez escrito el programa, puede ensamblarse a mano, para ello debe establecerse una direccin de
memoria de partida; utilizada como referencia para ubicar las restantes instrucciones. Si la primera
instruccin se ubica en la direccin 0000H, la segunda (XRL A,A) ser ubicada en la direccin 03h
puesto que la primera instruccin ocupa 3 bytes, as se le asigna a cada instruccin una posicin, tal y
como se muestra en algoritmo 4.2.
Direccin
0000
0003
0005
0007
0008
0009
000B

PROGRAMA
INICIO:

LAZO:

MOV DPTR,#3000H
XRL A,A
MOV R1,10H
MOVX @DPTR,A
INC DPTR
DJNZ R1,LAZO

CONTINUA:

Algoritmo 4.2.- Ubicacin de cada cdigo en ensamblador en memoria.


Posteriormente se verifican las longitudes de las instrucciones y las direcciones asignadas, y se est en
condiciones de construir una tabla de nombres simblicos. La tabla de nombres o tabla de smbolos tiene
tres entradas (INICIO, LAZO y CONTINUA). Por conveniencia, se colocan en orden alfabtico:
Nombre
CONTINUA

Posicin
000B

237

Fundamentos del lenguaje ensamblador


INICIO
LAZO

0000
0007

El paso que sigue es la sustitucin del nemotcnico de la instruccin por el cdigo binario que la
representa y posteriormente se introduce el valor de los operandos, que sern valores inmediatos,
nmeros de registro o elementos de memoria. Cuando se haga una referencia simblica se consulta la
tabla de nombres y el valor correspondiente al smbolo en cuestin se adosa a la instruccin. El resultado
se muestra en algoritmo 4.3.
Direccin
1
2
3
4
5
6
7

0000
0003
0005
0007
0008
0009
000B

Cdigo

Programa

90 30 00 INICIO:
65 E0
A9 10
F0
LAZO:
A3
D9 FC
CONTINUA:

MOV DPTR,#3000H
XRL A,A
MOV R1,10H
MOVX @DPTR,A
INC DPTR
DJNZ R1,LAZO

Algoritmo 4.3.- Cdigos de operacin y bytes en memoria (lenguaje de mquina).


La dificultad de escribir un programa directamente en lenguaje de mquina radica en:
a)La complejidad de seguir la pista para la ubicacin de las instrucciones durante la redaccin del
programa.
b)La necesidad de reubicar la direccin de salto o transferencia cuando (ante la presencia de un error) hay
que aadir instrucciones al programa.
c)El colocar una direccin a cada instruccin (sin utilizar el lenguaje simblico) implica que para que
dicho programa funcione a partir de otra direccin de memoria es necesario direccionarlo de nuevo por
parte del programador.
Por las dificultades anteriores han sido elaborados programas traductores, capaces de llevar formas o
smbolos ms comprensibles por el hombre al lenguaje de mquina.
Los lenguajes de programacin que constituyen entradas a los traductores reciben el nombre de lenguaje
fuente mientras que los lenguajes producto a la traduccin de un lenguaje fuente, reciben el nombre de
lenguaje objeto.
Cuando el lenguaje fuente es slo una mera representacin simblica de la secuencia de instrucciones del
lenguaje de mquina, la traduccin a realizar es simple y se dice que slo requiere de un ensamblaje. Al
programa que realiza esta traduccin se le llama ensamblador. Usualmente cada instruccin en lenguaje
ensamblador genera una instruccin en lenguaje de mquina, como se muestra en la fig. 4.2.

Programa en
lenguaje fuente

Ensamblador

Figura 4.2.- El ensamblador como traductor del lenguaje fuente.

238

Programa en
lenguaje de mquina

Fundamentos del lenguaje ensamblador


Cuando el lenguaje fuente es un lenguaje de alto nivel (PASCAL, C, etc.) y el lenguaje destino es el
cdigo de mquina, al traductor se le llama compilador.
Un ensamblador tpico consta de dos pasos: el primero calcula la longitud de cada instruccin y actualiza
un puntero de posicin. La tabla de smbolos tambin se elabora en la primera fase, disponiendo todos los
nombres y referencias simblicas en orden alfabtico. Cada nombre se coloca en la tabla tal como se
encuentra; por consiguiente, un smbolo incluido en un campo de operandos entra en la tabla si antes no
ha aparecido como nombre. En este caso, el smbolo se encontrar ms all de la posicin actual. Al final
de la primera fase todos los smbolos de la tabla deben haber recibido un nmero de identificacin. Si un
smbolo no ha sido resuelto, constituir una referencia no completada, lo que origina errores. El
ensamblador lee despus las lneas de sentencias originales una vez ms, construyendo esta vez el cdigo
en lenguaje de mquina, convirtiendo las direcciones de referencia a la memoria y otros campos con los
valores tomados del campo de operandos de la lnea original o con valores simblicos extrados de la
tabla de smbolos.
Existe una amplia variedad de ensambladores, de hecho pueden existir diferentes ensambladores para
trabajar en un mismo microprocesador o en un mismo sistema de cmputo. No obstante, las posibilidades
de diferentes ensambladores son muy similares por lo que se analiza la comprensin sobre los principios
bsicos sin entrar en detalles particulares.
4.2.5.- Las directivas del ensamblador (Pseudo instrucciones).
Cualquier ensamblador posee determinadas instrucciones que son un conjunto de operaciones no
generativas que no producen cdigo en lenguaje de mquina y cuya funcin fundamental es especificar,
como parte del programa en lenguaje ensamblador, donde deben localizarse las variables y diferentes
partes del programa en la memoria RAM y ROM. A tal grupo de instrucciones se les llama directivas del
ensamblador.
Las directivas del ensamblador se clasifican en las siguientes categoras:
(a).- Control de segmento: Permite definir segmentos donde se localiza cdigo de programa y constantes
o variables en memoria de datos.
(b).- Definicin de smbolos: Permite crear smbolos que pueden usarse para representar registros,
nmeros y direcciones.
(c).- Inicializacin de memoria: Permite inicializar zona de cdigos o constantes, generalmente del tipo
byte o palabras.
(d).- Reserva de memoria: Reservan espacio en memoria (generalmente en memoria de datos).
(e).- Enlace de programas: Permite ensamblar mdulos de programas independientes, de forma tal que
puedan intercambiarse referencias y variables entre ellas.
(f).- Control de direcciones: Permite definir determinada zona de direcciones, donde se coloca cdigo o
datos.
Las directivas bsicas del ensamblador son:
ORG: El operando asociado con esta directiva se interpreta como una direccin (tpicamente de 16 bits).
Esta define una direccin a partir de la cual ser colocado el cdigo de operacin de la instruccin que
siga a la directiva. Las instrucciones sern colocadas en direcciones sucesivas hasta que se defina la

239

Fundamentos del lenguaje ensamblador


prxima directiva. Si no se utiliza, queda implcita la instruccin ORG 00H. Es una directiva de control
de direcciones.
Ejemplo 4.1:
ORG 100H
ORG RESET ; RESET puede ser una expresin absoluta o relocalizable
DS: Se utiliza para reservar bytes en memoria RAM (variables). Viene acompaada de una etiqueta que
identifica una direccin en RAM y de un nmero a la derecha indicador del nmero de bytes de datos que
deben reservarse y en los cuales no se almacenan datos despus de su definicin ( la directiva DSW
reserva palabras de 16 bits).
Ejemplo 4.2:
Etiqueta: DS 20 ; Etiqueta identifica la direccin a partir de la cual se reservan los bytes
; en este caso se reservan 20 bytes.
DB: La directiva de definicin de bytes es utilizada para almacenar cadenas y tablas. A travs de ella se le
indica al ensamblador que interprete al operando como un dgito (menor o igual a 255) que debe ser
almacenado en un byte de memoria ROM. Algunos ensambladores permiten almacenar el equivalente
ASCII de una cadena de caracteres ( la directiva DW reserva palabras de 16 bits). Es una directiva de
inicializacin de memoria.
Ejemplo 4.3:
Etiqueta: DB CADENA ; El ensamblador coloca en la posicin el cdigo ASCII equivalente a la
; cadena de caracteres CADENA.
Tabla: DB 0,1,A
EQU: Permite asignar un valor a determinada etiqueta o nombre de un smbolo. Puede ser usarse para
definir operandos, registros, expresiones o direcciones. Los nombres de smbolos definidos con esta
directiva no pueden redefinirse o cambiarse. Es una directiva de definicin de smbolos.
Ejemplo 4.4:
Acumulador EQU A
Contador_Max EQU 100
CODE, DATA, XDATA: Permiten asignar direcciones a determinado smbolo. Los smbolos definidos con
esta directiva no pueden redefinirse. Son directivas de control de segmento.
Ejemplo 4.5:
Reset CODE 0000h

; La direccin en memoria de programa puede ser 0000H a FFFFH

Tabla_7seg DATA 20h

; La direccin en memoria de datos puede ser 00H a FFH

Datos_ext XDATA 1000h ; Define una direccin en memoria de datos externa, puede ser
; 0000H a FFFFH.
DSEG, CSEG: Definen segmentos absolutos en memoria de datos y programa respectivamente.

240

Fundamentos del lenguaje ensamblador

Ejemplo 4.6:
CSEG AT 3000H
DSEG AT 20H
SEGMENT: Permite definir segmentos relativos, cuya posicin en memoria quedar finalmente
establecida por el enlazador.
Ejemplo 4.7:
PILA SEGMENT DATA ; declara segmento
RSEG PILA
; selecciona segmento
DS 10H
; reserva 16 bytes
END: Define el final de un programa o mdulo.
4.2.6.- Sistema de desarrollo KEIL.
Un sistema de desarrollo est compuesto de varios programas de aplicacin que se pueden usar para crear
aplicaciones en un microcontrolador. Se puede usar el ensamblador para ensamblar un programa, el
compilador para compilar un programa en cdigo C a un archivo objeto, y se puede usar el enlazador para
crear un mdulo objeto absoluto deseable, a partir de un emulador.
Cuando se usa el KEIL, el ciclo de desarrollo de un proyecto es el mismo que un proyecto de desarrollo
de cualquier software, el cual consta de los siguientes pasos:
1.- Crear los archivos en C o ensamblador.
2.- Compilar o ensamblar los archivos fuentes.
3.- Corregir los errores en el archivo fuente.
4.- Enlazar ficheros objeto del compilador y ensamblador.
5.- Probar la eficiencia de la aplicacin.
El diagrama en bloques de la figura 4.3 muestra una herramienta de desarrollo para la serie MCS51.
Como se muestra, los archivos se crean con Vision/51 IDE y entonces pasan al compilador C51 o el
ensamblador A51. El compilador y el ensamblador procesan los archivos fuente y crean archivos objetos
relocalizables.
El archivo objeto creado por el compilador y el ensamblador puede usarse por LIB51 (controlador de
bibliotecas) para crear una biblioteca. Una biblioteca es un conjunto de programas ordenados,
especialmente formateados de mdulos objeto, que el enlazador puede procesar. Cuando el enlazador
procesa una biblioteca, slo se utilizan los mdulos objetos necesarios para la creacin del programa.
Los archivos objetos creados por el compilador y el ensamblador, y los archivos de biblioteca creados por
el controlador de bibliotecas se procesan por el enlazador para crear un mdulo objeto absoluto. Un
archivo o mdulo objeto absoluto es un archivo objeto cuyo cdigo no es relocalizable, ello es, los
cdigos residen en localizaciones fijas.

241

Fundamentos del lenguaje ensamblador


El archivo objeto absoluto creado por el enlazador se usa para programar la ROM u otros dispositivos de
memoria. Este puede usarse, adicionalmente, con el dScope-51 (depurador/ simulador) o con un
emulador.
El depurador/ simulador dScope-51 es un programa de alto nivel que permite una depuracin rpida y
fiable. El depurador contiene un simulador y un target que permite simular el 8051, incluyendo
perifricos. Definiendo configuraciones especficas, se pueden simular los atributos y perifricos que
posee la serie MCS51.
El RTX-51 es un sistema multitarea en tiempo real que simplifica el diseo de un sistema, la
programacin y depuracin (utilizada para aplicaciones complejas).

Vision/51

Compilador
C51

Biblioteca
C

Macro
ensamblador
A51

Sistema de
operacin en
tiempo real
RTX51

Controlador
de biblioteca
LIB51

Linker BL51 para banco de cdigos.

Emulador y
programacin de
EPROM

Depurador (DScope-51)

Simulador
de
perifrico y CPU

Monitor-51

Figura 4.3.- Estructura de la herramienta de desarrollo KEIL.


242

Fundamentos del lenguaje ensamblador

Para crear un proyecto con Vision2 (ver fig. 4.4) se ejecuta Project New Project. El cual solicita el
nombre del archivo de proyecto. Previamente se debe crear una nueva carpeta con el icono Create New
Folder.
Si el nombre del archivo es Projecto1, Vision2 crea un nuevo archivo de proyecto con el nombre
PROJECT1.UV2 el cual contiene un target implcito y un nombre de grupo de archivos. Estos se pueden
ver en Project Window Files.
Posteriormente, en el men Project Select Device for Target se selecciona el CPU a utilizar. Si est
disponible, se puede seleccionar un manual aplicando Project Window Books.
Para crear nuevos archivos fuente se ejecuta File New. Este abre un editor donde se puede escribir el
cdigo fuente. El cdigo fuente que se crea se debe adicionar al proyecto usando Add Files en Project
Window Files.
Se pueden definir los parmetros relevantes del hardware y los componentes internos del dispositivo
seleccionado usando el comando Options for Target ( es una de las opciones ms importantes del
sistema de desarrollo), ello incluye:
-

Frecuencia de reloj.
Memoria interna.
Memoria externa, etc.

El comando Option - Build Target traslada el archivo fuente a cdigo hexadecimal, en caso de que
existan errores, en la ventana Output Window - Build aparecern los errores de compilacin.
Despus de corregir los errores de sintaxis, se procede a la puesta a punto del sistema (debugger)
utilizando las herramientas de Vision2.
Una vez que se ha concluido la puesta a punto del proyecto, se debe crear el archivo INTEL HEX con el
que se programar la EPROM interna del microcontrolador (o simulador), para ello se debe habilitar la
opcin Create HEX en Options for Target - Output.
Ejemplo 4.8:
Utilizando directivas, establezca un programa a partir de la direccin 0000H. Tal programa utilizar una
constante (VALOR_CONST) cuyo valor debe ser 10H. Establezca tres tablas, una a partir de la direccin
300H, una en segmento relativo y otra en 500H respectivamente, almacenando valores como bytes,
palabras y caracteres. Defina una subrutina a partir de la direccin 600H y reserve valores en RAM (a
partir de 20H) de la siguiente forma: una variable (VAR) de 1 byte de longitud y una cadena de 10 bytes.
Solucin:
NAME EJEMPLO_48
VALOR_CONST EQU 10H
RESET CODE 0000H
CSEG AT 300H
Tabla_1: DB 04h
DB 05h
DB 0ffh

; se define una constante


; define direccin de cdigo de inicio
; en memoria de programa (300H)
; Se definen bytes a partir de 300H

243

Fundamentos del lenguaje ensamblador


Codigo_tabla2 SEGMENT CODE
RSEG Codigo_tabla2
Tabla_2:
DW 4025h
DW 0ff03h
DW 450Eh ;

; En memoria de programa, relocalizable.

CSEG AT 500h
; en memoria de programa (500H)
Tabla_3:
DB 'CADENA DE CARACTERES' ; Se define cadena que ser codificada en ASCII
DSEG AT 20H
; reserva variable
VAR:
DS 1
; 1 byte en la direccin 20h
CADENA:
DS 10D
; Se reservan 10 bytes
; Se define la direccin de inicio del programa
CSEG AT RESET
; direccin absoluta en memoria de programa
CALL SUBRUTINA
; Identificando al programa
; Direccin de la subrutina a partir de la 600H
CSEG AT 600H
SUBRUTINA:
MOV A,VALOR_CONST;
MOV VAR,A;
RET;
END
; Fin del programa

Figura 4.4.- Detalle del depurador de KEIL en el sistema Vision-2.

244

Fundamentos del lenguaje ensamblador

El ensamblador generara el siguiente archivo .LST:


A51 MACRO ASSEMBLER EJEMPLO_48
MACRO ASSEMBLER A51 V6.02
OBJECT MODULE PLACED IN .\ejemplo_48.OBJ
ASSEMBLER INVOKED BY: C:\KEIL\C51\BIN\A51.EXE .\ejemplo_48.asm SET(SMALL)
LOC OBJ

0010
0000
---0300 04
0301 05
0302 FF

---0000
0000 4025
0002 FF03
0004 450E
---0500
0500 43414445
0504 4E412044
0508 45204341
050C 52414354
0510 45524553
---0020
0020
0021
0021

---0000 D100

---0600
0600 E510
0602 F520
0604 22

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

20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

SOURCE

NAME EJEMPLO_1
VALOR_CONST EQU 10H
RESET CODE 0000H
CSEG AT 300H
Tabla_1: DB 04h
DB 05h
DB 0ffh
Codigo_tabla2 SEGMENT CODE
RSEG Codigo_tabla2
Tabla_2:
DW 4025h
DW 0ff03h
DW 450Eh ;
CSEG AT 500h
Tabla_3:
DB 'CADENA DE CARACTERES'

DSEG AT 20H
VAR:
DS 1
CADENA:
DS 10D

CSEG AT RESET
CALL SUBRUTINA

CSEG AT 600H
SUBRUTINA:
MOV A,VALOR_CONST;
MOV VAR,A;
RET;

END

245

Fundamentos del lenguaje ensamblador


XREF SYMBOL TABLE LISTING
---- ------ ----- ------NAME
CADENA . . . . . .
CODIGO_TABLA2. . .
EJEMPLO_1. . . . .
RESET. . . . . . .
SUBRUTINA. . . . .
TABLA_1. . . . . .
TABLA_2. . . . . .
TABLA_3. . . . . .
VALOR_CONST. . . .
VAR. . . . . . . .

T Y P E V A L U E ATTRIBUTES / REFERENCES
D ADDR 0021H A
25#
C SEG 0006H
REL=UNIT 10# 11
N NUMB ----1
C ADDR 0000H A
3# 30
C ADDR 0600H A
31 35#
C ADDR 0300H A
6#
C ADDR 0000H R SEG=CODIGO_TABLA2 12#
C ADDR 0500H A
18#
N NUMB 0010H A
2# 36
D ADDR 0020H A
22# 37

REGISTER BANK(S) USED: 0


ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S)

Ntese como la directiva en ensamblador:


Codigo_tabla2 SEGMENT CODE
RSEG Codigo_tabla2

; En memoria de programa, relocalizable.

ha generado bytes en memoria de programa que coinciden con el programa en RESET, lo anterior lo
resuelve el enlazador o a travs de la definicin de direcciones absolutas.
4.2.7.-El enlazador( Linker).
El enlazador es una herramienta muy til cuando se trabajan programas muy largos que se realizan a
partir de varias secciones de cdigo o subprogramas. Su funcin fundamental es aceptar varios mdulos
objetos generados a partir del ensamblador, resolver las referencias a variables externas, incorporar
subrutinas a partir de determinada biblioteca y cargar cada mdulo objeto en cualquier lugar de memoria
que se desee. Si el algoritmo 4.1 se quisiera definir a partir de la direccin 4000H, resulta:
2
3
4
5
6
7
8

4000
4003
4005
4007
4008
4009
400B

PUNTERO EQU 4000H


90 30 00 INICIO: MOV DPTR,PUNTERO
65 E0
XRL A,A
A9 10
MOV R1,10H
F0
LAZO: MOVX @DPTR,A
A3
INC DPTR
D9 FC
DJNZ R1,LAZO
CONTINUA:

Ntese como las direcciones de la tabla de smbolos cambian por la adicin de la direccin de inicio
4000H:
Nombre
8
2
5

CONTINUA
INICIO
LAZO

Posicin
400B
4000
4007

Ntese adems como los valores definidos a partir de directivas absolutas (EQU) no cambian. Los
smbolos y direcciones que cambian cuando el programa es ubicado en una nueva direccin se llaman
direcciones y smbolos relocalizables.

246

Fundamentos del lenguaje ensamblador

A partir de los archivos objetos generados por el ensamblador, el enlazador procesa los mismos y genera
los siguientes archivos:
(a).- Archivo listado (.LST): Contiene informacin acerca de cada paso ejecutado en el proceso de enlace
y localizacin de mdulos, tabla de cdigos localizados en memoria, lista de segmentos y smbolos y
referencias cruzadas generadas por las directivas PUBLIC y EXTERN.
(b).- Archivo objeto (.OBJ): Es utilizado por el depurador o debugger en la fase de depuracin del
programa.
(c).- Archivo hexadecimal (.HEX): Es el resultado de la conversin del archivo objeto en hexadecimal,
creando un archivo con el formato Intel HEX para la programacin de la ROM interna o externa del
sistema microcomputador.
Para facilitar el trabajo con el enlazador, un posible formato para la construccin de mdulos objeto se
muestra a continuacin:
----------------------------------------------; Importar smbolos externos
----------------------------------------------; Exportar smbolos a otros mdulos
----------------------------------------------; Declaracin de segmentos y variables
----------------------------------------------; Declaracin de constantes
----------------------------------------------; Programa en ensamblador
----------------------------------------------Ejemplo 4.9:
Como ejemplos de como trabaja el enlazador, analicemos los programas( PROG_PRIN y
SUMA_MULTIPLE) que se muestran a continuacin:
NAME PRINCIPAL
;Este programa llenara dos zonas de
; RAM para ser sumadas
; Biblioteca de simbolos externos
EXTRN CODE (SUMARA) ; mdulo definido externamente
PUBLIC DIR_DATOS_A
; variables globales
PUBLIC DIR_DATOS_B
PUBLIC CANT_DATOS
; Define zona de memoria de datos
DIR_DATOS_A DATA 40H
DS 10D;
DSEG AT 50H
DIR_DATOS_B:
DS 10D;

247

Fundamentos del lenguaje ensamblador

; Constante
CANT_DATOS EQU 0AH
CSEG AT 00H
RESET:
MOV R1,#DIR_DATOS_A
MOV R0,#DIR_DATOS_B
MOV R3,#CANT_DATOS
LLENA:
MOV @R1,#03
MOV @R0,#05
INC R0
INC R1
DJNZ R3,LLENA
CALL SUMARA
END

; Se inicializa punteros
; Se inicializa contador
; Se llena zona de datos

La subrutina, como mdulo independiente, puede crearse como sigue:


NAME SUMA_MULTIPLE
; Sumara datos en multiple precision
; Biblioteca de simbolos externos
EXTRN DATA (DIR_DATOS_A)
EXTRN DATA (DIR_DATOS_B)
EXTRN NUMBER (CANT_DATOS)
PUBLIC SUMARA
SUMA_MULTIPLE SEGMENT CODE
RSEG SUMA_MULTIPLE
SUMARA:
MOV R0,#DIR_DATOS_B ; Se definen los datos inicializados
MOV R1,#DIR_DATOS_A ; en programa externo
MOV R3,#CANT_DATOS
CLR CY
CONT:
MOV A,@R0
ADDC A,@R1
MOV @R1,A
INC R0
INC R1
DJNZ R3,CONT
RET
END

El resultado que genera el ensamblador sera, para el programa principal:


MACRO ASSEMBLER A51 V6.02
OBJECT MODULE PLACED IN .\principal.OBJ
ASSEMBLER INVOKED BY: C:\KEIL\C51\BIN\A51.EXE .\principal.asm SET(SMALL) DEBUG EP
LOC OBJ

LINE
1

SOURCE

NAME PRINCIPAL

248

Fundamentos del lenguaje ensamblador

0040
0000

14

---0050
0050

17
18

000A

21

---0000
24
0000 7940
0002 7850
0004 7B0A
0006
28
0006 7703
0008 7605
000A 08
000B 09
000C DBF8
000E 120000 F

2 ;Este programa llenara dos zonas de


3 ; RAM para ser sumadas
4
5 ; Biblioteca de simbolos externos
6
7 EXTRN CODE (SUMARA)
8 PUBLIC DIR_DATOS_A
9 PUBLIC DIR_DATOS_B
10 PUBLIC CANT_DATOS
11
12 ; Define zona de memoria de datos
13 DIR_DATOS_A DATA 40H
DS 10D;
15
16 DSEG AT 50H
DIR_DATOS_B:
DS 10D;
19
20 ; Constante
CANT_DATOS EQU 0AH
22
23 CSEG AT 00H
RESET:
25 MOV R1,#DIR_DATOS_A ; Se inicializa punteros
26 MOV R0,#DIR_DATOS_B
27 MOV R3,#CANT_DATOS
; Se inicializa contador
LLENA:
29 MOV @R1,#03
; Se llena zona de datos
30 MOV @R0,#05
31 INC R0
32 INC R1
33 DJNZ R3,LLENA
34 CALL SUMARA
35 END

SYMBOL TABLE LISTING


------ ----- ------NAME
TYPE

V A L U E ATTRIBUTES

CANT_DATOS . . . .
DIR_DATOS_A. . . .
DIR_DATOS_B. . . .
LLENA. . . . . . .
PRINCIPAL. . . . .
RESET. . . . . . .
SUMARA . . . . . .

000AH
0040H
0050H
0006H
----0000H
-----

N NUMB
D ADDR
D ADDR
C ADDR
N NUMB
C ADDR
C ADDR

A
A
A
A
A
EXT

REGISTER BANK(S) USED: 0


ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S)

El resultado del programa SUMA_MLTIPLE, despus del proceso de ensamblaje sera:


MACRO ASSEMBLER A51 V6.02
OBJECT MODULE PLACED IN .\secundario.OBJ
ASSEMBLER INVOKED BY: C:\KEIL\C51\BIN\A51.EXE .\secundario.asm SET(SMALL) DEBUG EP

249

Fundamentos del lenguaje ensamblador

LOC OBJ

LINE

---0000
0000 7800
0002 7900
0004 7B00
0006 C2D7
0008
0008 E6
0009 37
000A F7
000B 08
000C 09
000D DBF9
000F 22

F
F
F

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

SOURCE

NAME SUMA_MULTIPLE
; Sumara datos en multiple precision
; Biblioteca de simbolos externos
EXTRN DATA (DIR_DATOS_A)
EXTRN DATA (DIR_DATOS_B)
EXTRN NUMBER (CANT_DATOS)
PUBLIC SUMARA
SUMA_MULTIPLE SEGMENT CODE
RSEG SUMA_MULTIPLE
SUMARA:
MOV R0,#DIR_DATOS_B ; Se definen datos inicializados
MOV R1,#DIR_DATOS_A ; en programa externo
MOV R3,#CANT_DATOS
CLR CY
CONT:
MOV A,@R0
ADDC A,@R1
MOV @R1,A
INC R0
INC R1
DJNZ R3,CONT
RET
END

SYMBOL TABLE LISTING


------ ----- ------NAME

T Y P E V A L U E ATTRIBUTES

CANT_DATOS . . . . N ADDR ----EXT


CONT . . . . . . . C ADDR 0008H R SEG=SUMA_MULTIPLE

El resultado del enlace entre ambos mdulos resulta en el siguiente archivo generado por el enlazador:
BL51 BANKED LINKER/LOCATER V4.02
BL51 BANKED LINKER/LOCATER V4.02, INVOKED BY:
C:\KEIL\C51\BIN\BL51.EXE principal.obj, secundario.obj TO enlace RAMSIZE (256)
INPUT MODULES INCLUDED:
principal.obj (PRINCIPAL)
secundario.obj (SUMA_MULTIPLE)
LINK MAP OF MODULE: enlace (PRINCIPAL)
TYPE BASE
LENGTH RELOCATION SEGMENT NAME
----------------------------------------------------******* DATA MEMORY *******
REG 0000H 0008H ABSOLUTE "REG BANK 0"
0008H 0048H
*** GAP ***

250

Fundamentos del lenguaje ensamblador


DATA 0050H

000AH

ABSOLUTE

******* CODE MEMORY *******


CODE 0000H 0011H ABSOLUTE
CODE 0011H 0010H UNIT
SUMA_MULTIPLE
SYMBOL TABLE OF MODULE: enlace (PRINCIPAL)
VALUE
TYPE
NAME
---------------------------------------MODULE
PRINCIPAL
N:000AH
PUBLIC
CANT_DATOS
D:0040H
PUBLIC
DIR_DATOS_A
D:0050H
PUBLIC
DIR_DATOS_B
C:0006H
SYMBOL
LLENA
N:0000H
SYMBOL
PRINCIPAL
C:0000H
SYMBOL
RESET
C:0000H
LINE#
25
C:0002H
LINE#
26
C:0004H
LINE#
27
C:0006H
LINE#
29
C:0008H
LINE#
30
C:000AH
LINE#
31
C:000BH
LINE#
32
C:000CH
LINE#
33
C:000EH
LINE#
34
------ENDMOD
PRINCIPAL
------MODULE
SUMA_MULTIPLE
C:0011H
SEGMENT
SUMA_MULTIPLE
C:0011H
PUBLIC
SUMARA
C:0019H
SYMBOL
CONT
B:00D0H.7
SYMBOL
CY
C:0011H
LINE#
14
C:0013H
LINE#
15
C:0015H
LINE#
16
C:0017H
LINE#
17
C:0019H
LINE#
19
C:001AH
LINE#
20
C:001BH
LINE#
21
C:001CH
LINE#
22
C:001DH
LINE#
23
C:001EH
LINE#
24
C:0020H
LINE#
25
------ENDMOD
SUMA_MLTIPLE
INTER-MODULE CROSS-REFERENCE LISTING
-----------------------------------NAME . . . . USAGE MODULE NAMES
---------------------------------CANT_DATOS . NUMB; PRINCIPAL SUMA_MULTIPLE
DIR_DATOS_A. DATA; PRINCIPAL SUMA_MULTIPLE
DIR_DATOS_B. DATA; PRINCIPAL SUMA_MULTIPLE
SUMARA . . . CODE; SUMA_MULTIPLE PRINCIPAL
LINK/LOCATE RUN COMPLETE. 0 WARNING(S), 0 ERROR(S)

251

Fundamentos del lenguaje ensamblador

El programa PROG_PRIN utiliza dos direcciones de datos (DIR_DATOS_A, DIR_DATOS_B) y una


constante (CANT_DATOS) que son compartidas con la subrutina SUMA_MLTIPLE. A travs de la
directiva PUBLIC se indica que las etiquetas (constantes) definidas a la derecha pueden ser utilizadas por
otros programas. El programa principal hace un llamado a subrutina que no est en el mdulo objeto y
que es definida en otro mdulo, lo que se indica con la pseudoinstruccin EXTRN.
Para la subrutina SUMA_MULTIPLE las direcciones DIR_DATOS_A, DIR_DATOS_B y la constante
CANT_DATOS sern definidas externamente. La subrutina SUMARA es PUBLIC pues es referenciada
por PROG_PRIN( un mdulo externo a ella).
El enlazador cargar PROG_PRIN y a partir del ltimo cdigo colocar la primera instruccin de
SUMARA( la que posee un desplazamiento en el PC de 0011H). Todas las instrucciones de SUMARA
sern colocadas en direcciones desplazadas en 11h valores, en nuevas direcciones de memoria.
4.2.8.-La creacin de un mdulo en ensamblador.
Los mdulos, como las subrutinas, deben brindar informacin que el usuario necesite sin necesidad de
examinar la arquitectura interna del programa, las especificaciones tpicas que deben definirse son:
a)Descripcin del propsito del mdulo.
b)Longitud en bytes de la subrutina.
c)Lista de parmetros de entrada.
d)Lista de parmetros de salida.
e)Registros y localizaciones de memoria utilizadas (til cuando el mdulo se use como respuesta a
interrupcin, donde deben salvarse todos los registros implicados), en esta ltima se debe definir si las
direcciones son o no relocalizables.
f)Un ejemplo de valores de las variables de salida ante la definicin de variables a la entrada.
g)Definir la biblioteca de smbolos externos.
Ejemplo 4.10:
Un ejemplo de como puede definirse un mdulo se expone en el siguiente programa:
NAME CONVERSION_BCD_7SEG
;****************************************************************
; Este programa permite convertir un valor en BCD
*
; a su equivalente 7 segmentos
*
;****************************************************************
;*BYTES QUE OCUPA EN MEMORIA: 18 BYTES
*
;****************************************************************
;*PARAMETROS DE ENTRADA: DIR_DATO_BCD:direccion donde debe estar*
;*
colocado el valor en BCD a convertir
*
;*
con formato 0NH donde N es el valor en BCD
*
;****************************************************************

252

Fundamentos del lenguaje ensamblador


;*PARAMETROS DE SALIDA: Valor equivalente a 7 segmentos en
*
;*
DIR_DATO_BCD
*
;****************************************************************
;*REGISTROS UTILIZADOS: A,R0,PC
*
;****************************************************************
;*LOCALIZACION DE MEMORIA: DIR_DATO_BCD, definida por quien *
;*
llame a este modulo
*
;****************************************************************
;*EJEMPLO: Debe ser definido por otro modulo:
*
;*
PUBLIC DIR_DATO_BCD
*
;
DSEG AT 50H
*
;
DIR_DATO_BCD:
*
;
DS 1D;
*
;*
*
;* Si (50H)=03 devuelve (50H)=66h
*
;* Forma de llamado: CALL BCD_7SEG
*
;****************************************************************
;*NOTA: La direccion donde se coloque la tabla puede ser
*
;* relocalizada, pero siempre a continuacion de RET
*
;****************************************************************
EXTRN DATA (DIR_DATO_BCD)
BCD_7SEG SEGMENT CODE
RSEG BCD_7SEG
BCD_7SEG:
MOV R0,#DIR_DATO_BCD
MOV A,@R0
ADD A,#02H
; Salto 2 bytes de cdigo (dos prximas instrucciones)
MOVC A,@A+PC
MOV @R0,A
RET
; a continuacin de la instruccin RET
POSIC_TABLA SEGMENT CODE
RSEG POSIC_TABLA
dw 3344h
; posibles cdigos equivalentes 7_seg
dw 5566h
dw 7788h
dw 99aah
dw 0bbcch
END

4.3.- Algunas ideas para la programacin en ensamblador.


La programacin en ensamblador es una tarea ardua y laboriosa, aunque algunos conceptos que se presentan
aqu pueden resultar evidentes, son tiles para la programacin en ensamblador.
(a).- Establecer un registro a cero: Un registro puede ser puesto a cero a travs de las instrucciones: MOV
REG,00 XRL REG,REG. Para la comprensin de la segunda opcin debe conocerse la funcin OR
EXCLUSIVO.
El or exclusivo devuelve como resultado un "1" si solo uno de los operandos vale 1, como se aprecia a
continuacin:

253

Fundamentos del lenguaje ensamblador

XOR
0
1

0
0
1

1
1
0

De lo anterior se deduce que el or exclusivo de un nmero consigo mismo es cero. Un ejemplo se muestra a
continuacin:

XOR

1010
1100
----------0110

Para colocar a cero un registro puede utilizarse tambin la instruccin SUB REG,REG (sustraccin de un
nmero por el mismo).
(b).- Complementar un bit: A menudo puede ser necesario cambiar el estado de un bit( especialmente para
trabajar sobre banderas establecidas por programa o sobre terminales de puerto, como puede ser el control
de un led en un reloj digital), para ello puede utilizarse el or exclusivo. La funcin or exclusivo de
cualquier bit con el bit correspondiente en "1" complementa dicho bit.
Ejemplo 4.11:
Complemente el bit 1 y 5 de un valor almacenado en un registro de 8 bits:
REGISTRO
XOR

XXXXXXXX
0 0 1 00 0 1 0
----------------------RESULTADO X X XcX X X XcX
Donde Xc representa el complemento de X.
(c).- Setear un bit: Para ello es til la funcin OR, la cual da como resultado un "1" si al menos uno de los
operandos es "1":
OR
0
1

0
0
1

1
1
1

Por tanto, el OR de cualquier informacin contenida en cualquier bit con "1" resultar un 1.
Ejemplo 4.12:
Setee los bits 1 y 5 de la informacin contenida en cualquier registro.
REGISTRO X X X X X X X X
OR
0 0 1 0 0 0 1 0
---------------------RESULTADO X X 1 X X X 1 X
Ntese como la informacin contenida en los bits sobre los que se hace el OR con 0, mantienen su valor.

254

Fundamentos del lenguaje ensamblador


(d).- Resetear un bit: Para ello puede utilizarse la funcin AND, en la misma basta que uno de los
operandos sea cero para que el resultado sea cero:
AND
0
1

0
0
0

1
0
1

Ejemplo 4.13:
Coloque los bits 1 y 5 de un registro a cero.
REGISTRO X X X X X X X X
AND
1 1 0 1 1 1 0 1
-----------------------RESULTADO X X 0 X X X 0 X
Ntese como la informacin contenida en los bits sobre los que se hace el AND con "1" mantienen su valor.
(e).- Realizar la sustraccin a travs de suma: Algunos dispositivos (como algunos microcontroladores) no
poseen instrucciones de sustraccin. Un mtodo alternativo es realizar la sustraccin a travs de la suma,
para lo cual la operacin:
MINUENDO
- SUSTRAENDO
--------------------RESTA
Puede realizarse ejecutando los siguientes pasos:
a)Se realiza el complemento a 1 del minuendo.
b)Se le suma a la anterior operacin el sustraendo.
c)Se realiza el complemento a uno del resultado.
Ejemplo 4.14:
Realice la siguiente operacin:
01001001B - 00110110B
a)Se realiza el complemento a uno del minuendo:
10110110B
b)Se le suma el sustraendo:
10110110B
+00110110B
--------------11101100B

255

Fundamentos del lenguaje ensamblador

c)Se le determina el complemento a uno del resultado:


00010011B
Y este es el resultado de la sustraccin planteada.
Un problema ser determinar cundo la operacin anterior no da un resultado apropiado ( prstamo en la
operacin de sustraccin normal). Para ello el acarreo se utiliza como indicador.
Ejemplo 4.15:
Realice la siguiente operacin:
00010000B - 00100000B
a)Se realiza el complemento a uno del minuendo:
11101111B
b)Se le suma el sustraendo:
11101111B
+00100000B
--------------CY=1 00001111B Con un acarreo de "1"
c)Se le determina el complemento a uno del resultado:
11110000B
De lo anterior se puede deducir porqu se utiliza la puesta a 1 de la bandera acarreo como indicador
similar a la solicitud de prstamo cuando la operacin de sustraccin se realiza por el microprocesador.
(f).- Multiplicando y dividiendo por potencias de dos: La multiplicacin y la divisin son operaciones
aritmticas de uso comn para la solucin a problemas exigidos a un sistema de cmputo, su ejecucin tarda
varios perodos de reloj (existen microprocesadores que no lo tienen includo y se debe implementar por
programa).
Se puede obtener( basado en la posicin relativa de las cifras que conforman el nmero) el producto y la
divisin de determinado valor a travs de la simple rotacin.
Multiplicacin: El rotar un valor a la izquierda permite obtener el producto del valor almacenado por dos,
para multiplicar por N( donde N tiene que ser una potencia de dos) se puede utilizar:
PRODUCTO = MULTIPLICANDO(N)
donde N = 2n y n = Nmero de rotaciones a la izquierda.
Ejemplo 4.16:

256

Fundamentos del lenguaje ensamblador


Multiplique por 16 el siguiente dato: 00000100B=4D
N=16=24
Como n=4, entonces la solucin sera rotar el dato cuatro veces a la izquierda, de lo que resulta:
01000000B=64D
Divisin: Se realiza rotando a la derecha el dividendo n unidades, para lo cual se puede aplicar la siguiente
frmula:
COCIENTE = DIVISOR / N
Donde N = 2n y n = Nmero de rotaciones a la derecha.
Ejemplo 4.17:
Divida por 64 el siguiente valor: 01001010B
N=64= 26
Como n es seis, entonces se debe rotar seis unidades a la derecha, de lo que resulta:
COCIENTE = 00000001B
Se debe tener en cuenta que la rotacin puede conllevar a la prdida de informacin (como en el ejemplo
anterior). Tal prdida puede evitarse con la utilizacin de mltiple precisin en el manejo de datos.
(g) La multiplicacin de nmeros empaquetados en BCD por dos: Para ello lo que se hace es doblar el
nmero( adicionar el nmero con l mismo) y posteriormente se realiza el ajuste decimal del resultado (el
mayor valor en ocho bits ser 99H).
(h) La divisin de nmeros empaquetados en BCD por dos: Para ello se rota a la derecha el nmero y se le
sustrae tres a cualquier dgito que sea ocho o mayor.
(i).- Redondeo de nmeros: Este tipo de aplicacin se desarrolla fundamentalmente cuando se trata el dato
en mltiple precisin (ver seccin 4.4).
Para redondear un nmero binario se utiliza el siguiente principio: Si el bit ms significativo del byte que
ser truncado es 1 (128 o mayor si se interpreta como entero sin signo), se le aade 1 al byte ms
significativo adyacente.
Ejemplo 4.18:
Redondee a un byte los nmeros siguientes, resultados de una suma:
MSByte
00101100

LSByte
10010000

Como el bit MSB del byte menos significativo es 1, se incrementa en 1 el byte ms significativo, siendo el
resultado:

257

Fundamentos del lenguaje ensamblador

00101101
Tambin se puede redondear nmeros empaquetados en BCD. Para realizar este tipo de operacin se tiene
en cuenta que si el dgito ms significativo que ser truncado es 5 o mayor, se le aade 1 al byte adyacente
ms significativo, ejecutando posteriormente el ajuste decimal.
Ejemplo 4.19:
Redondee a dos dgitos los cuatro dgitos empaquetados en BCD que se muestran a continuacin:
MSByte
01001001

LSByte
01100010

Se debe eliminar el byte menos significativo, como el nmero que representa el dgito ms significativo a
truncar( 6D=0110) es mayor que 5, se suma 1 al dgito inmediato superior (1001).
01001001
+
1
-----------01001010
Posteriormente se debe realizar el ajuste decimal (sumar 6, pues el resultado es un cdigo errneo) de lo que
resulta:
01010000=50H
4.4.- Ejemplos de programas en ensamblador.
Sistemas en mltiple precisin:La precisin simple aplicada a los microprocesadores significa el tratamiento
de datos con un nmero de bits cuyo tamao coincida con el tamao de los registros de propsito general
del microprocesador utilizado para el diseo del sistema. En la presente seccin se trata como manipular
datos que poseen un nmero de bits superiores al formato bsico de trabajo del microprocesador, para lo
que se tomar como referencia el tratamiento sobre un tamao de 8 bits, lo cual puede generalizarse a un
nmero superior de bits.
4.4.1.- La adicin y la sustraccin.
La adicin y la sustraccin en mltiple precisin implica, bsicamente, conservar el acarreo o el prstamo
de adiciones o sustracciones del byte contiguo de orden inferior y sumarlo o sustraerlo a la posicin del bit
menos significativo del byte de orden superior.
Si se interpreta el dato como entero con signo, entonces el bit ms significativo del byte ms significativo
representar el signo en un dato de orden n, siendo los bytes de orden inferior representaciones de simples
dgitos binarios.
Ejemplo 4.20:
Realice la siguiente operacin de suma:
MSByte LSByte

258

Fundamentos del lenguaje ensamblador


00000010 11001001
+00001000 10100101
-------------------------

713
+2213
--------

Como las microcomputadoras de 8 bits suelen utilizar operandos de 8 bits, la operacin anterior debe
ejecutarse en dos fases: primero sumando el byte de ms bajo orden, conservando el acarreo que debe
trascender a la operacin de los bytes ms significativos:
11001001
+10100101
-------------CY=1 01101110
En el segundo paso, se suman los dos bytes de orden superior, sumando el acarreo precedente de la suma
anterior al bit menos significativo:
00000010
+00001000
+
1 Acarreo precedente
-------------00001011
Los dos resultados se combinan en la suma resultante de 16 bits:
MSByte LSByte
00001011 01101110 = 2926D
El proceso consiste, pues, en sumar dos bytes cada vez, conservar el acarreo y aadirlo al siguiente byte de
orden superior, volver a conservar el acarreo para un posible prximo paso y as sucesivamente, repitiendo
el proceso tantas veces como bytes tengan los operandos. En los microprocesadores existe la instruccin de
suma con acarreo (ADC), til para esta aplicacin.
Ejemplo 4.21:
NAME SUMA_MULTIPLE
;==========================================================
;PROPSITO DEL PROGRAMA: Sumar dos numeros multibytes
;almacenados en memoria.
;==========================================================
;PARAMETROS DE ENTRADA:
;
;R0-Apunta a la direccin mas significativa del primer sumando
;R1-Apunta a la direccin mas significativa del segundo sumando
;B-Contiene el numero de bytes de cada sumando
;==========================================================
;PARAMETROS DE SALIDA:
;
;El resultado de la operacion se devuelve en las mismas
;localizaciones del primer sumando
;==========================================================
;FORMA DE LLAMADO:CALL SUM_MULTIPLE
;==========================================================
;REGISTROS UTILIZADOS:A,R0,R1,B

259

Fundamentos del lenguaje ensamblador


;==========================================================
;BYTES QUE OCUPA EN MEMORIA: 21 Bytes.
;==========================================================
;EJEMPLO:
;
; Entrada:
;DIR_0=20H DIR_1=35H CONTADOR=04H y en memoria existe:
;
(20H...23H)=(88H,88H,88H,88H)
;
(35H...39H)=(22H,22H,22H,22H)
;
; Salida: (20H...23H)=(AAH,AAH,AAH.AAH)
;==========================================================
EXTRN NUMBER (DIR_0)
EXTRN NUMBER (DIR_1)
EXTRN NUMBER (CONTADOR)
PUBLIC SUM_MULTIPLE
SUMA_MULTIPLE SEGMENT CODE
RSEG SUMA_MULTIPLE
SUM_MULTIPLE:
mov R0,#DIR_0;
mov R1,#DIR_1;
mov B,#CONTADOR;
PROX_BYTE:
mov A,@R1
addc A,@R0
mov @R0,A
inc R1
inc R0
djnz B,PROX_BYTE
jnc FIN
mov A,#01H
add A,@R0
mov @R0,A
FIN: ret
End

;SE OBTIENE SUMANDO


; SE ADICIONA COSUMANDO CON ACARREO
;RESULTADO EN DIRECCION DE R0
;PROXIMO DATO DE 8 BITS
;CONTROL DE NMERO DE BYTES DE OPERANDOS
; SE GARANTIZA POSIBLE ULTIMO ACARREO

PROGRAMA DE COMPROBACIN:
NAME PROGRAMA_COMPROBACION
; Comprobacin del algoritmo de suma mltiple
EXTRN CODE (SUM_MULTIPLE)
PUBLIC CONTADOR
PUBLIC DIR_0
PUBLIC DIR_1
CONTADOR EQU 04H;
DIR_0 EQU 20H;
DIR_1 EQU 35H;
DSEG AT DIR_0 ; DIRECCION DE SUMANDO Y DESTINO
DS CONTADOR ;
DSEG AT DIR_1 ; DIRECCIN DE COSUMANDO
DS CONTADOR ; NMERO DE BYTES DE OPERANDOS

260

Fundamentos del lenguaje ensamblador

INICIO SEGMENT CODE


RSEG INICIO
CALL SUM_MULTIPLE
END

La Sustraccin.
La sustraccin es semejante a la adicin, pero en este caso el acarreo (que se setea en la sustraccin como
indicacin de prstamo) debe ser sustrado al byte siguiente de orden superior.
Ejemplo 4.22:
Realice la siguiente sustraccin, considerando un formato bsico de 8 bits:
MSByte LSByte
00010010 00011010 4634D
-00010000 10010010 -4242D
-------------------------- --------Como primer paso, se debe sustraer los bytes de ms bajo orden, considerando el posible prstamo.
00011010
-10010010
-------------B=1 10001000
Posteriormente, se realiza la sustraccin del prstamo a la operacin del byte de orden superior:
00010010
-00010000
1 Sustraccin del prstamo precedente
------------00000001
El resultado sera:
MSByte LSByte
00000001 10001000 = 392D
Los prstamos deben ser sustrados a las operaciones de sustraccin de los bytes precedentes, semejante a la
adicin. Los microprocesadores pueden sustraer con prstamo, operacin til para esta aplicacin.
Ejemplo 4.23:
NAME SUSTRACCIN_MULTIPLE
;**********************************************************
; PROPSITO DEL PROGRAMA: La sustraccion de dos numeros
; multibytes almacenados en memoria.
;**********************************************************
; Parmetros de entrada:
; R0 - Apunta a la direccin ms significativa del minuendo.

261

Fundamentos del lenguaje ensamblador


; R1 - Apunta a la direccin ms significativa del sustraendo.
; R2 - Contiene el nmero de bytes de cada operando.
;**********************************************************
; Parametros de salida: El resultado de la operacion se
; devuelve en las mismas localizaciones del minuendo
; (primer operando).
;**********************************************************
; Registros utlilizados: A,R0,R1,B.
;**********************************************************
; Forma de llamado: Call RESTA_MULTI
;**********************************************************
; EJEMPLO:
; Entrada:
; Si R0--> 24h, R1-->34h y R2= 5h
;
(20h....24h)=(88h,88h,88h,88h,88h)
;
(30h....34h)=(22h,22h,22h,22h,22h)
; Salida:
;
(20h....24h)=(66h,66h,66h,66h,66h)
; Si CY=1 despus de la ejecucin, resultado incorrecto.
;**********************************************************
PUBLIC RESTA_MULTI
EXTRN NUMBER (DIR_MINU)
EXTRN NUMBER (DIR_SUST)
EXTRN NUMBER (CANT_BYTES)
RES_MULTIPLE SEGMENT CODE
RSEG RES_MULTIPLE
RESTA_MULTI:
mov r0,#DIR_MINU;
mov r1,#DIR_SUST;
mov B,#CANT_BYTES;
clr C
;PREPARA ACARREO PARA LA PRIMERA SUSTRACCIN
PX_BYTE: Mov A,@R0
;SE OBTIENE EL MINUENDO
subb A,@R1
;SE SUSTRAE CON ACARREO EL SUSTRAENDO
mov @R0,A
;RESULTADO EN DIRECCION DE R0
dec R0
;PROXIMO DATO DE 8 BITS
dec R1
djnz B,PX_BYTE
;CONTROL DE NMERO DE BYTES DE OPERANDOS
ret
end
PROGRAMA DE COMPROBACIN:
NAME PROGRAMA_COMPROBACION
; Comprobacin del algoritmo de sustraccin mltiple
DIR_MINU EQU 24h;
DIR_SUST EQU 34H;
CANT_BYTES EQU 05H;
EXTRN CODE (RESTA_MULTI)
PUBLIC DIR_MINU ;DIRECCION DE MINUENDO Y DESTINO
PUBLIC DIR_SUST ;DIRECCIN DE SUSTRAENDO
PUBLIC CANT_BYTES ;NMERO DE DATOS DE LOS OPERANDOS

262

Fundamentos del lenguaje ensamblador


CALL RESTA_MULTI
END

4.4.2.- La rotacin.
En la fig. 4.5 se muestra como efectuar la rotacin en ambos sentidos (derecha e izquierda) de un dato en
mltiple precisin.
En la rotacin a la derecha se toma el byte ms significativo y se rota a la derecha a travs del acarreo (C)
(en el primer paso se colocar el valor de C en el bit ms significativo), posteriormente C posee el valor que
exista en el bit menos significativo, el cual ser introducido en el bit ms significativo del prximo dato de
menor orden, el proceso se repite en dependencia del nmero de bytes. En C se devuelve el valor del bit
menos significativo del dato de menor orden (byte menos significativo o LSByte).
En la rotacin a la izquierda se toma inicialmente el byte menos significativo y se rota a la izquierda a
travs del acarreo (de acuerdo a ello el bit menos significativo tendr el valor de C y el bit 7 ser devuelto
en este ltimo), para el prximo paso C ser colocado en el bit menos significativo del prximo byte de
mayor orden, el proceso se repite de acuerdo al nmero de bytes hasta que C devuelve el valor del bit ms
significativo del byte de mayor orden (MSByte).
La rotacin de nmeros multibytes puede ser til en la conversin BCD-binario, multiplicacin y divisin
en mltiple precisin o multiplicacin y divisin por potencias de dos.

.....

.....

.....

.....

MSByte

LSByte
(a) Rotacin a la derecha.
C

.....

.....

.....

MSByte

.....
LSByte

(b) Rotacin a la izquierda.


Figura 4.5.- Rotacin en mltiple precisin.
Ejemplo 4.24:
NAME ROTAR_DERECHA
;=============================================================================
;PROPSITO DEL PROGRAMA:Rotar un numero multibytes a la derecha
;=============================================================================
;PARAMETROS DE ENTRADA:
;
;B-Nmero de bytes del operando

263

Fundamentos del lenguaje ensamblador


;R0-Direccion menos significativa del nmero a rotar
;En el acarreo (CY)debe estar lo que se desea entrar en el bit 7 de la direccion
;menos significativa.
;=============================================================================
;FORMA DE LLAMADO:CALL ROTA_DERECHA
;=============================================================================
;REGISTROS UTILIZADOS:A,R0,B,C
;=============================================================================
;BYTES QUE OCUPA EN MEMORIA: 13
;=============================================================================
;EJEMPLO:
; Entrada:
; Si R0=20H B=03H CY=1 (20H...22H)=(77H,66H,22H)
; Salida:
;
(20H...22H)=(BBH,B3H,11H)
;=============================================================================
PUBLIC ROTA_DERECHA
EXTRN NUMBER (DIR_BYTEALTO)
EXTRN NUMBER (CANT_BYTES)
ROTA_DER SEGMENT CODE
RSEG ROTA_DER
ROTA_DERECHA:
Mov B, #CANT_BYTES;
Mov R0, #DIR_BYTEALTO;
SETB C; CLR C SI C=0;
RotaDer:Mov A,@R0
; Valor a rotar
RrC A
; Rota a la derecha el valor
Mov @R0,A
; Almacena valor rotado
Inc R0
;
DjnZ B,RotaDer
; Control del nmero de bytes
Ret
End
PROGRAMA DE COMPROBACIN:
NAME PROGRAMA_COMPROBACION
; Comprobacin del algoritmo de rotacin a la derecha
EXTRN CODE (ROTA_DERECHA)
PUBLIC DIR_BYTEALTO
PUBLIC CANT_BYTES
DIR_BYTEALTO EQU 20h; DIRECCIN DEL BYTE MS SIGNIFICATIVO
CANT_BYTES EQU 03H; NMERO DE DATOS DEL OPERANDO
CALL ROTA_DERECHA
END

4.4.3.- Comparacin de dos cadenas.


Cuando se comparan dos cadenas, la cadena 1 puede ser mayor, menor o igual que la cadena 2. Para ello, se
definen dos punteros que apunten al byte que define al dato ms significativo de ambas cadenas, basta que
un dato ms significativo de la cadena 1 sea mayor o menor que el dato equivalente de la cadena 2 para que

264

Fundamentos del lenguaje ensamblador


la cadena sea mayor o menor. En caso que los datos sean iguales, el proceso debe repetirse hasta que se
comparen los datos menos significativos, que determinarn la igualdad en ambas cadenas.
Ejemplo 4.25:
NAME COMPARACION_MULTIBYTES
;=============================================================================
;PROPSITO DEL PROGRAMA:Comparar dos nmeros almacenados en memoria
;=============================================================================
;Los bytes menos significativos de los dos numeros a comparar estaran en las
;direcciones mas bajas
;=============================================================================
;PARAMETROS DE ENTRADA:
;
;B- Nmero de bytes a comparar
;R0-Octeto ms significativo del nmero 1
;R1-Octeto ms significativo del nmero 2
;=============================================================================
;PARAMETROS DE SALIDA:
;
;A-Resultado de la comparacion (bandera):
;A=00H si nmero_1>nmero_2
;A=01H si nmero_1<nmero_2
;A=02H si nmero_1=nmero_2
;=============================================================================
;FORMA DE LLAMADO:CALL COMPARA
;=============================================================================
;BYTES QUE OCUPA EN MEMORIA: 28
;=============================================================================
;REGISTROS UTILIZADOS:A,R0,R1,B, DIRECCIN_DATO 7FH
;=============================================================================
;EJEMPLO:
; Entrada:
; Si B=3 ,R0=20H, R1=30H y (20h...22h)=77H,88H,55H (30..32h)=77H,77H,77H
; Salida:
; A=00H
;=============================================================================
PUBLIC COMPARA
EXTRN NUMBER (DIR_N1)
EXTRN NUMBER (DIR_N2)
EXTRN NUMBER (CANT_BYTES)
COMP SEGMENT CODE
RSEG COMP
COMPARA:
mov r0, #DIR_N1
mov r1, #DIR_N2
mov B,#CANT_BYTES
COMPAR:
mov A,@R1
; SE TOMA BYTE MS SIG. DE NUM. 2
mov 7FH,@R0
;BYTE MAS SIGNIF. DE NUM. 1 A MEMORIA
cjne A,7FH,NOIGUAL ;SE COMPARA LOS DOS NMEROS
inc R0
;DECREMENTO PUNTER0
inc R1
djnz B,COMPAR
mov A,#02H
;NUM. 1=NUM. 2

265

Fundamentos del lenguaje ensamblador


ret
NOIGUAL:jc MAYOR1
mov A,#01H
ret
MAYOR1:mov A,#00H
ret
END

;NUM. 1<NUM. 2
;NUM. 1>NUM. 2

PROGRAMA DE COMPROBACIN:
NAME PROGRAMA_COMPROBACION
; Comprobacin del algoritmo de comparacin de dos nmeros multibytes.
DIR_N1 EQU 20h;
DIR_N2 EQU 30H;
CANT_BYTES EQU 03H;
EXTRN CODE (COMPARA)
PUBLIC DIR_N1
; Direccin del octeto ms significativo del num. 1
PUBLIC DIR_N2
; Direccin del octeto ms significativo del num. 2
PUBLIC CANT_BYTES ;Nmero de octetos de cada nmero
CALL COMPARA
END

4.4.4.- Incremento y decremento de un nmero binario.


Cuando se decrementa un nmero binario multibytes debe encuestarse cuando en el byte de menor orden
ocurre un underflow (paso de 00 a FFH), lo cual debe provocar un decremento en el byte de mayor orden
consecutivo. De forma similar, en el caso de incremento debe considerarse cuando ocurre un overflow (paso
de FFH a 00) en el byte de menor orden, ello debe provocar un incremento en el byte de mayor orden
consecutivo.
Ejemplo 4.26:
NAME INCREMENTO_HEXADECIMAL
;=============================================================================
;PROPSITO DEL PROGRAMA:Incrementar una unidad un numero de N bytes almacenado
;en memoria.
;=============================================================================
;PARAMETROS DE ENTRADA:
;
;B-Nmero de bytes del numero a incrementar
;R0-Apunta a la direccin ms alta del numero hexadecimal
;=============================================================================
;PARAMETROS DE SALIDA:
;El resultado se da en las mismas localizaciones de memoria, debe considerarse
;el acarreo
;=============================================================================
;FORMA DE LLAMADO:CALL INC_HEX
;=============================================================================
;REGISTROS UTILIZADOS:R0,B
;=============================================================================
;BYTES QUE OCUPA EN MEMORIA: 17

266

Fundamentos del lenguaje ensamblador


;=============================================================================
;EJEMPLO:
; Entrada:
;Si R0=23h B=04h (20h...23h)=(22h,ffh,ffh,ffh)
; Salida:
;
(20h...23h)=(23h,00h,00h,00h)
;=============================================================================
PUBLIC INC_HEX
EXTRN NUMBER (DIR_BYTEBAJO)
EXTRN NUMBER (CANT_BYTES)
INC_H SEGMENT CODE
RSEG INC_H
INC_HEX:
Mov B, #CANT_BYTES;
Mov R0, #DIR_BYTEBAJO;
CLR C
INCHEX: cjne @R0,#0ffh,termino; Se toma octeto
inc @R0
; Se incrementa
dec R0
djnz B,INCHEX ; Control cant. de datos
ret
termino:
inc @r0;
ret
end
PROGRAMA DE COMPROBACIN:
NAME PROGRAMA_COMPROBACION
; Comprobacin del algoritmo de incremento de nmero multibytes.
EXTRN CODE (INC_HEX)
PUBLIC DIR_BYTEBAJO
PUBLIC CANT_BYTES
DIR_BYTEBAJO EQU 23h ;Direccin del byte menos significativo
CANT_BYTES EQU 04H ;Cantidad de bytes del dato
CALL INC_HEX
END

Ejemplo 4.27:
NAME DECREMENTO_HEXADECIMAL
;=============================================================================
;PROPSITO DEL PROGRAMA:Decrementar una unidad un numero de N bytes almacenado
;en memoria.
;=============================================================================
;PARAMETROS DE ENTRADA:
;
;B-Nmero de bytes del nmero a decrementar
;R0-Apunta a la direccin ms alta del nmero hexadecimal
;=============================================================================
;PARAMETROS DE SALIDA:

267

Fundamentos del lenguaje ensamblador


;El resultado se da en las mismas localizaciones de memoria, debe considerarse
;el acarreo
;=============================================================================
;FORMA DE LLAMADO:CALL DEC_HEX
;=============================================================================
;REGISTROS UTILIZADOS:R0,B
;=============================================================================
;BYTES QUE OCUPA EN MEMORIA: 15
;=============================================================================
;EJEMPLO:
; Entrada:
;Si R0=94h B=04h (91h...94h)=(23h,00h,00h,00h)
; Salida:
;
(91h...94h)=(22h,ffh,ffh,ffh)
;=============================================================================
PUBLIC DEC_HEX
EXTRN NUMBER (DIR_BYTEBAJO)
EXTRN NUMBER (CANT_BYTES)
INC_H SEGMENT CODE
RSEG INC_H
DEC_HEX:
Mov B, #CANT_BYTES;
Mov R0, #DIR_BYTEBAJO;
INCHEX: cjne @r0,#00h,termino
dec @r0;
; Se decrementa valor
dec R0
djnz B,INCHEX
;Control de cantidad de datos
ret
termino:
dec @r0;
ret
end
PROGRAMA DE COMPROBACIN:
NAME PROGRAMA_COMPROBACION
; Comprobacin del algoritmo de decremento de nmero multibytes.
EXTRN CODE (DEC_HEX)
PUBLIC DIR_BYTEBAJO
PUBLIC CANT_BYTES
DIR_BYTEBAJO EQU 23h;
CANT_BYTES EQU 04H;

Direccin del byte menos significativo


Cantidad de bytes del dato

CALL DEC_HEX
END

4.4.5.- Incremento y decremento de un nmero en BCD.


Para decrementar un nmero en BCD debe considerarse que un decremento de 00 en el byte de menor orden
debe provocar el paso a 99 del mismo y debe sustraerse uno al prximo byte de mayor orden. En caso de

268

Fundamentos del lenguaje ensamblador


que la cuarteta (nibble) menos significativa al que es necesario sustraer uno valga cero, este debe pasar a 9 y
realizarse un decremento a la cuarteta ms significativa (sustraer 10H al byte).
Cuando se realiza el incremento de un nmero en BCD debe encuestarse el paso de 99H a 00, lo cual debe
provocar un incremento en el byte de mayor orden consecutivo. Cuando la cuarteta menos significativa a
incrementar valga 9, esta debe pasar a cero con el correspondiente incremento en la cuarteta ms
significativa (sumar 10H al byte). El algoritmo puede optimizarse utilizando la instruccin DAA, la cual es
aplicable (si el microprocesador lo posee) generalmente para la adicin.
Ejemplo 4.28:
NAME INCREMENTO_BCD
;=============================================================================
;PROPSITO DEL PROGRAMA:Incrementar en uno un numero de N bytes almacenado en
;memoria, manteniendo formato BCD.
;=============================================================================
;PARAMETROS DE ENTRADA:
;
;B-Nmero de bytes del numero a incrementar
;R0-Puntero a la direccin ms alta del numero BCD
;=============================================================================
;PARAMETROS DE SALIDA:
;
;En las mismas localizaciones donde est definido el nmero
;=============================================================================
;FORMA DE LLAMADO:CALL INC_BCD
;=============================================================================
;REGISTROS UTILIZADOS:A,R0,B
;=============================================================================
;BYTES QUE OCUPA EN MEMORIA:17
;=============================================================================
;EJEMPLO:
; Entrada:
; Si R0=23h B=04h (20...23h)=(22h,99h,99h,99h)
; salida:
;
(20...23h)=(23h,00h,00h,00h)
;=============================================================================
PUBLIC INC_BCD
EXTRN NUMBER (DIR_BYTEBAJO)
EXTRN NUMBER (CANT_BYTES)
INC_B SEGMENT CODE
RSEG INC_B
INC_BCD:
mov R0,#DIR_BYTEBAJO
mov B,#CANT_BYTES
INCBCD:mov A,@R0
; toma dato
add A,#01H
; lo incrementa
da a
; ajusta manteniendo el BCD
mov @r0,a
jnc termino
dec R0
djnz B,INCBCD
; control del nmero de bytes
termino: ret
end

269

Fundamentos del lenguaje ensamblador

PROGRAMA DE COMPROBACIN:
NAME PROGRAMA_COMPROBACION
; Comprobacin del algoritmo de incremeto de nmero BCD.
EXTRN CODE (INC_BCD)
PUBLIC DIR_BYTEBAJO
PUBLIC CANT_BYTES
DIR_BYTEBAJO EQU 23h ; Direccin del byte menos significativo
CANT_BYTES EQU 04H ; Cantidad de bytes del dato
CALL INC_BCD
END

Ejemplo 4.29:
NAME DECREMENTO_BCD
;=============================================================================
;PROPSITO DEL PROGRAMA:Decrementar en uno un numero de N bytes almacenado en
;memoria, manteniendo formato BCD.
;=============================================================================
;PARAMETROS DE ENTRADA:
;B-Nmero de bytes del numero a decrementar
;R0-Apunta a la direccin ms significativa del numero BCD
;=============================================================================
;PARAMETROS DE SALIDA:
;
;En las mismas localizaciones donde el nmero se ha definido
;=============================================================================
;FORMA DE LLAMADO:CALL DEC_BCD
;=============================================================================
;REGISTROS UTILIZADOS:A,R0,B
;=============================================================================
;BYTES QUE OCUPA EN MEMORIA:33
;=============================================================================
;EJEMPLO:
; Entrada:
;Si R0=23h B=04h (20...23h)=(23h,00h,00h,00h)
; Salida:
;
devuelve: (20...23h)=(22h,99h,99h,99h)
;=============================================================================
PUBLIC DEC_BCD
EXTRN NUMBER (DIR_BYTEBAJO)
EXTRN NUMBER (CANT_BYTES)
DEC_B SEGMENT CODE
RSEG DEC_B
DEC_BCD:
Mov B, #CANT_BYTES;
Mov R0, #DIR_BYTEBAJO;
DECBCD: mov a,@r0;
cjne a,#00h,dec_normal
anl a,#0F0h
; cuarteta ms significativa

270

Fundamentos del lenguaje ensamblador


cjne a,#00h, dec_men
mov @r0,#99h ; si cero, 99
dec R0
djnz B,DECBCD ;se decrementa contador
ljmp termino
dec_normal:
dec @r0;
ljmp termino
dec_men: clr c
subb a,10h
; decrementa cuarteta ms sign.
orl a,#09H;
mov @r0,a
termino:
ret
end
PROGRAMA DE COMPROBACIN:
NAME PROGRAMA_COMPROBACION
; Comprobacin del algoritmo de decremeto de nmero BCD.
EXTRN CODE (DEC_BCD)
PUBLIC DIR_BYTEBAJO
PUBLIC CANT_BYTES
DIR_BYTEBAJO EQU 23h; Direccin del byte menos significativo
CANT_BYTES EQU 04H; Cantidad de bytes del dato
CALL DEC_BCD
END

4.4.6.- El redondeo binario.


Cuando se almacena un valor multibyte, el redondeo no es ms que encuestar si el byte que ser truncado es
80H o superior, cuando ello ocurre se incrementa en uno el byte adyacente de orden superior, colocando a
cero los bytes menos significativos restantes.
Ejemplo 4.30:
;TITULO: REDONDEO DE UN NUMERO BINARIO
;=============================================================================
;PROPOSITO DEL PROGRAMA: Redondear un binario de N bytes almacenado a partir
; de una localizacin de memoria dada.
;=============================================================================
;PARAMETROS DE ENTRADA:
;
; R0-Apunta a la direccin menos significativa del numero a redondear
; B-Contiene el nmero de bytes del numero a redondear
;=============================================================================
;PARAMETRO DE SALIDA:
;
; El resultado se devuelve en las mismas localizaciones donde se ha definido el numero.
;=============================================================================
;FORMA DE LLAMADO: CALL RED_BIN
;=============================================================================

271

Fundamentos del lenguaje ensamblador


;REGISTROS UTILIZADOS: A,R0,B
;=============================================================================
;BYTES QUE OCUPA EN MEMORIA:
;=============================================================================
;EJEMPLO:
; Entrada:
; Si R0=20H B=04H (20H...23H)=(23H,80H,00H,00H)
; Salida:
;
(20H...23H)=(24H,00H,00H,00H)
;=============================================================================
PUBLIC RED_BIN
EXTRN NUMBER (DIR_BYTEALTO)
EXTRN NUMBER (CANT_BYTES)
RED_B SEGMENT CODE
RSEG RED_B
RED_BIN:
Mov B, #CANT_BYTES;
Mov R0, #DIR_BYTEALTO;
inc R0
;R0 AL BYTE MAS SIGNIF. -1
mov A,@R0
; SE TOMA DATO
cjne A,#80H,NOIGUAL ;? SI @R0>=80H
NOIGUAL:jc REDBIN1
;APROXIMA AL MENOR
dec R0
;APROXIMA AL MAYOR
inc @R0
;INCREMENTA EL BYTE MAS SIGNIF.
inc R0
REDBIN1:dec B
mov A,#00H
;COLOCA CERO
REDBIN2:mov @R0,A
;RESETEO BYTES MENOS SIGNIF.
inc R0
djnz B,REDBIN2
;DECREMENTA CONTADOR DE BYTES
ret
end
PROGRAMA DE COMPROBACIN:
NAME PROGRAMA_COMPROBACION
; Comprobacin del algoritmo de redondeo binario.
EXTRN CODE (RED_BIN)
PUBLIC DIR_BYTEALTO
PUBLIC CANT_BYTES
DIR_BYTEALTO EQU 20h; Direccin del byte ms significativo
CANT_BYTES EQU 04H; Cantidad de bytes del dato
CALL RED_BIN
END

4.4.7.- El redondeo en BCD.


Redondear en BCD es incrementar el byte de mayor orden cuando el byte que se va a truncar es 50H ( la
mitad de 10D) o superior.

272

Fundamentos del lenguaje ensamblador

Ejemplo 4.31:
NAME REDONDEO_BCD
;=============================================================================
;PROPOSITO DEL PROGRAMA:Redondear un BCD de N bytes almacenado a partir de
;una direccion de memoria
;=============================================================================
;PARAMETROS DE ENTRADA:
;
;B-Contiene el numero de bytes del numero a redondear
;R0-Direccin menos significativa del numero a redondear
;=============================================================================
;PARAMETROS DE SALIDA:
;
;Se devuelve en las mismas localizaciones.
;=============================================================================
;FORMA DE LLAMADO:CALL RED_BCD
;=============================================================================
;REGISTROS UTILIZADOS:A,R0,B
;=============================================================================
;BYTES QUE OCUPA EN MEMORIA: 28
;=============================================================================
;EJEMPLO:
; Entrada:
; Si R0=20H B=04H (20H...23H)=(66H,60H,00H,00H)
; Salida:
;
(20H...23H)=(67H,00H,00H,00H)
;=============================================================================
PUBLIC RED_BCD
EXTRN NUMBER (DIR_BYTEALTO)
EXTRN NUMBER (CANT_BYTES)
RED_BC SEGMENT CODE
RSEG RED_BC
RED_BCD:
Mov B, #CANT_BYTES;
Mov R0, #DIR_BYTEALTO;
inc R0
; Adjunto a byte + sig.
mov A,@R0
cjne A,#50H,NOIGUAL ; mayor a 50h?
NOIGUAL:jc REDBCD1
;aproximo al menor
dec R0
;aproximo al mayor
mov A,@R0
;en a el mas significativo
add a,#01H
da A
mov @R0,A
;en memoria el resultado del redondeo
inc R0
REDBCD1:dec B
mov A,#00H
;colocar a cero bytes restantes
REDBCD2:mov @R0,A
;colocar a cero bytes menos significativos
inc R0
djnz B,REDBCD2
;Control nmero de bytes
ret
end

273

Fundamentos del lenguaje ensamblador

PROGRAMA DE COMPROBACIN:
NAME PROGRAMA_COMPROBACION
; Comprobacin del algoritmo de redondeo en BCD.
EXTRN CODE (RED_BCD)
PUBLIC DIR_BYTEALTO
PUBLIC CANT_BYTES
DIR_BYTEALTO EQU 20h; Direccin del byte ms significativo
CANT_BYTES EQU 04H; Cantidad de bytes del dato
CALL RED_BCD
END

4.4.8.- El complemento a dos de nmeros multibytes.


En las aplicaciones donde haya que negar un nmero (o lo que es lo mismo, obtener el complemento a dos)
es necesario adicionar el acarreo generado por los bytes de orden inferior a los bytes de orden superior. Para
ello, se obtiene el complemento a dos del byte menos significativo y el posible acarreo generado debe
adicionarse al complemento a uno de los bytes de mayor orden.
Ejemplo 4.32:
Determine el nmero negativo de:
MSByte LSByte
00001001 00000000 2304D
Solucin:
En primer lugar se obtiene el complemento a dos del byte de menor orden:
Complemento a dos = 11111111 + 1= 00000000 (C=1)
Posteriormente se suma el acarreo al complemento a uno del byte de mayor orden:
11110110
+
1
------------11110111
El resultado sera:
11110111 00000000
Ejemplo 4.33:
NAME COMPLEMENTO_A_2
;=============================================================================
;PROPSITO DEL PROGRAMA:Complemento a dos de un nmero multibytes.
;=============================================================================

274

Fundamentos del lenguaje ensamblador


;PARAMETROS DE ENTRADA
;
; B-Nmero de bytes
; R0-Direccion ms significativa donde est el dato
;=============================================================================
;PARAMETROS DE SALIDA
;
;El resultado se devuelve en las localizaciones donde el dato est almacenado y
;Cy=1 si esta fuera de rango.
;=============================================================================
;FORMA DE LLAMADO:CALL COMPLEMENTO
;=============================================================================
;REGISTROS UTILIZADOS:A,R0,B
;=============================================================================
;BYTES QUE OCUPA EN MEMORIA: 22
;=============================================================================
;EJEMPLO:
; Entrada:
;Si R0=20H y en memoria 20H=FFH 21H=00H con CY=1 y B=2
; Salida: 20H=01H 21H=00H
;=============================================================================
PUBLIC COMPLEMENTO
EXTRN NUMBER (DIR_BYTEBAJO)
EXTRN NUMBER (CANT_BYTES)
COMP_2 SEGMENT CODE
RSEG COMP_2
COMPLEMENTO:
MOV B,#CANT_BYTES
MOV R0,#DIR_BYTEBAJO
MOV A,@R0
;BYTE A COMPLEMENTAR EN A
CPL A
;COMPLEM. A 2 EL PRIMER BYTE
ADD A,#01H
MOV @R0,A
;SALVO EL RESULTADO EN MISMA DIRECCIN
DEC B
REPCOP:DEC R0
;PROXIMO BYTE
MOV A,@R0
CPL A
ADDC A,#00H
;ADICIONO EL ACARREO
MOV @R0,A
;SALVO EL RESULTADO
DJNZ B,REPCOP
;CONTADOR DE BYTES
RET
END
PROGRAMA DE COMPROBACIN:
NAME PROGRAMA_COMPROBACION
; Comprobacin del algoritmo de complemento a dos multibytes
EXTRN CODE (COMPLEMENTO)
PUBLIC DIR_BYTEBAJO
PUBLIC CANT_BYTES
DIR_BYTEBAJO EQU 21h ; Direccin del byte menos significativo
CANT_BYTES EQU 02H ; Cantidad de bytes del dato

275

Fundamentos del lenguaje ensamblador


CALL COMPLEMENTO
END

4.4.9.- Mover o copiar de una zona de memoria a otra.


A menudo es necesario transferir bloques de informacin, para ello se ejecutan las funciones de mover o
copiar.
Cuando se mueve un bloque de datos, la cadena fuente es transferida a un destino (cadena destino) que se
sita a partir de una nueva direccin en memoria. La cadena fuente se sustituye por ceros. Cuando se copia,
se transfiere la cadena origen al destino y ambas zonas de memoria poseern el mismo contenido.
Ejemplo 4.34:
NAME MUEVE_O_COPIA
;=============================================================================
;PROPSITO DEL PROGRAMA:Mover o copiar el contenido de una zona de memoria
;de datos a otra.
;=============================================================================
;PARAMETROS DE ENTRADA:
;
;A-Bandera que indica mover o copiar
;A=00H-Mover
;A=01H-Copiar
;R0-Direccion fuente ms significativa
;R1-Direccion destino ms significativa
;B-Nmero de bytes de la cadena
;=============================================================================
;FORMA DE LLAMADO:CALL MOV_O_COP
;=============================================================================
;REGISTROS UTILIZADOS:A,R0,R1,B
;=============================================================================
;BYTES QUE OCUPA EN MEMORIA: 29
;=============================================================================
;EJEMPLO:
; Entrada:
; Si R0=24H , R1=34H y B=5 20...24(FF,FF,FF,FF,FF)
; Salida:
; 30...34(FF,FF,FF,FF,FF)
; siendo 20..24(00,00,00,00,00) si mueve
; o 20..24(FF,FF,FF,FF,FF) si copia
;=============================================================================
PUBLIC MOV_O_COP
EXTRN NUMBER (DIR_BYTEALTO_ORIGEN)
EXTRN NUMBER (CANT_BYTES)
EXTRN NUMBER (BANDERA)
EXTRN NUMBER (DIR_BYTEALTO_DESTINO)
MOV_C SEGMENT CODE
RSEG MOV_C
MOV_O_COP:
Mov B, #CANT_BYTES;
Mov R0, #DIR_BYTEALTO_ORIGEN;

276

Fundamentos del lenguaje ensamblador


Mov R1, #DIR_BYTEALTO_DESTINO;
Mov A, #BANDERA
cjne A,#01H,MOVER
; mover?
COPIAR:mov A,@R0
; toma dato
mov @R1,A
; y lo transfiere
dec R0
; DECREMENTO PUNTEROS
dec R1
djnz B,COPIAR
;contador
ret
MOVER:mov A,@R0
; direccin fuente
mov @R0,#00H
; se coloca a cero
mov @R1,A
dec R0
;DECREMENTO PUNTEROS
dec R1
djnz B,MOVER
;contador
ret
END
PROGRAMA DE COMPROBACIN:
NAME PROGRAMA_COMPROBACION
; Comprobacin del algoritmo para mover o copiar datos
EXTRN CODE (MOV_O_COP)
PUBLIC DIR_BYTEALTO_ORIGEN
PUBLIC CANT_BYTES
PUBLIC BANDERA
PUBLIC DIR_BYTEALTO_DESTINO
DIR_BYTEALTO_ORIGEN EQU 34h; Direccin ms significativa del origen
DIR_BYTEALTO_DESTINO EQU 24H; Direccin ms significativa del destino
CANT_BYTES EQU 05H; Cantidad de bytes a transferir
BANDERA EQU 01H; Indica si mueve o copia
CALL MOV_O_COP
END

4.4.10.- El tratamiento de tablas.


Una tabla consiste en un grupo de datos que ocupan posiciones contiguas. Ya sea mediante desplazamientos
aplicados a la tabla o recurriendo a otros datos asociados con la entrada de la tabla, sta sirve para
correlacionar entre s bloques de datos. Cada tabla est formada por un nmero variable de entradas
multiplicado por la longitud de cada una de ellas.
Sometiendo la direccin inicial de una tabla a desplazamientos, se pueden inspeccionar los elementos que la
componen. Como ejemplo puede considerarse una rutina de conversin de BCD a siete segmentos, en la
cual el valor en BCD se suma a un puntero que indica el inicio de la tabla, extrayndose el cdigo BCD
equivalente de la entrada correspondiente (ver secc. 4.2.8).
Otro ejemplo de tabla puede ser aquella en que el elemento o dato contenido en ella define el
desplazamiento que se aplica a otras operaciones, como por ejemplo, en un sistema de clasificacin de cual
rutina debe ser ejecutada. Para atender una entrada por teclado pueden utilizarse dos tablas. La primera tabla
estara formada por todas las seales de mando o control; si hubiera 10 comandos de 1 byte, la tabla tendra

277

Fundamentos del lenguaje ensamblador


10 bytes de largo, y cada entrada de 1 byte sera el caracter asociado a la seal de mando en cuestin. La
segunda tabla estara formada por 10 entradas de 2 bytes, cada una de las cuales definen la direccin
correspondiente a la rutina que debe ejecutarse en respuesta al comando de control.
Como ejemplo, supngase que se atiende un teclado que exporte caracteres ASCII, donde si "A","B" o "C"
son presionados se necesite ejecutar determinada funcin.
La primera tabla puede estar formada por:
TABLA_ENT:
db A,B,C
Si la tecla B es presionada, entonces un apuntador indicara que B ha sido hallada en la tabla (A=00, B=01,
etc). En la segunda tabla estara definido:
TABLA_DIR:
dw DIR_Ah, DIR_Bh, DIR_Ch
El apuntador debe ser multiplicado por dos ( una direccin de 16 bits ocupa dos bytes) y realizarse un
acceso a la direccin de respuesta (DIR_B) despus de hacer un desplazamiento a partir de la direccin de
inicio de la segunda tabla.
Existen tablas donde los valores que la conforman no poseen un orden preestablecido( tabla de entradas
desordenadas), donde se hace necesario buscar si determinado dato existe, para lo que se recurre a un
escrutinio secuencial, inspeccionndose la tabla de principio a fin para comparar el contenido con la clave
buscada. El nmero medio de entradas que se procesa en tal bsqueda secuencial es el nmero total de
entradas de la tabla entre dos.
Si la tabla posee entradas ordenadas, el escrutinio binario puede usarse en la bsqueda de un dato. En este
tipo de escrutinio la zona a inspeccionar se divide en dos partes para cada comparacin. La porcin que se
inspeccionar en la siguiente comparacin depende de la entrada que se tenga y la clave. Como ejemplo,
supngase que la clave es BACH en la siguiente tabla:
Direccin de Entrada
0
1
2
3
4
5
6
7
8

Valor
BACH
BIZET
DVORAK
FRANK
LISZT
RAVEL
ROSSINI
STRAUSS
VERDI

No. de comparacin
Cuarta
Tercera
Segunda
Primera

La primera comparacin se hace en la mitad de la tabla, como la letra de la clave posee un valor inferior a la
L de LISZT se ira en la prxima comparacin a la mitad inferior, si no fuese as se ira a la mitad superior.
Al efectuar cada comparacin, la zona a examinar se reduce a la mitad. Cada nueva comparacin tiene lugar
hacia el centro de la zona restante.
El nmero de comparaciones que habra que hacer en el peor caso sera:

278

Fundamentos del lenguaje ensamblador


N log2 ( Nmerototal de entradasr ) 1

donde r significa redondeadas, en el ejemplo anterior, log2(9)=4, ya que log2(9)=4.xx.


Otra modalidad de estructura de datos es la matriz. Una tabla no es ms que una matriz de una sola
dimensin cuando se hace referencia a la entrada de la misma mediante desplazamientos a partir del
comienzo, o en el ndice. Los datos se pueden colocar en matrices bidimensionales o incluso de n
dimensiones. Una matriz de dos dimensiones est caracterizada por un nmero de fila (m) y un nmero de
columna (n), el nmero total de elementos es mn; la matriz se puede colocar en memoria en este orden:
C0,R0; C0,R1; C0,R2;...;C0,Rm-1; C1,R0,..etc; o en este otro modo: R0,C0; R0,C1; R0,C2; ...;R0, Cn-1;
R1,C0;..etc. En el primer caso, el desplazamiento medido a partir de la zona ocupada por los elementos
integrantes de la matriz viene dado por (Cm)+R, donde C es el nmero de la columna (empezando por
cero), m es el nmero total de filas y R es el nmero de la fila (comenzando por cero). En el segundo caso el
desplazamiento responde a la frmula (Rn)+C, donde n es el nmero de columnas.
Ejemplo 4.35:
Establezca la siguiente matriz en memoria:
Nmero de columnas
Nmero de filas

0
1
2

0
2
4

3
8
3

5
9
1

Utilizando el primer mtodo, sera:


db 0,2,4,3,8,3,5,9,1
Para acceder al dato correspondiente a la fila 1, columna 2 se aplica:
(Cm)+R = 2(3)+1 = 7
Como puede apreciarse, el sptimo valor (contando a partir de cero) es el 9.
4.4.10.1.-Entrar un dato en una tabla.
Un valor puede colocarse en una tabla en el byte ms o menos significativo, lo cual debe seleccionarse en
el algoritmo a travs de un indicador o bandera. Si se coloca el valor en el byte menos significativo el byte
ms significativo se perder y viceversa. El mtodo previamente descrito puede optimizarse si se dispone de
dos punteros, los cuales se incrementarn al entrar un valor en el byte de menor orden o se decrementarn
al entrar el valor en el byte de mayor orden.
Estas rutinas pueden ser tiles para colocar un dato en memoria para un visualizador a 7 segmentos o
incrementar un buffer de entrada por teclado.
Ejemplo 4.36:
NAME ENTRADA_DATO_A_CADENA
;=============================================================================

279

Fundamentos del lenguaje ensamblador


;PROPSITO DEL PROGRAMA:Entrar un dato a una cadena de N bytes,la entrada
;pude ser tanto por la derecha como por la izquierda.
;=============================================================================
;PARAMETROS DE ENTRADA:
;
;B-Nmero de bytes de la cadena
;R0-Direccion mas significativa de la cadena
;R3-Bandera que indica entrada por derecha o izquierda
; R3=0; entra por la derecha (byte menos significativo)
; R3=1; entra por la izquierda (byte mas significativo)
;R2-Dato a entrar
;=============================================================================
;FORMA DE LLAMADO:CALL ENT_DATO
;=============================================================================
;REGISTROS UTILIZADOS:B,R0,R2,R3,A
;=============================================================================
;BYTES QUE OCUPA EN MEMORIA: 40
;=============================================================================
;EJEMPLO:
; Entrada:
; Si R0=22H B=03H R3=0H
R2=45H
;
(20H....22H)=(11H,22H,33H)
; Salida:
;
(20H....22H)=(22H,33H,45H)
;=============================================================================
PUBLIC ENT_DATO
EXTRN NUMBER (DIR_BYTEALTO)
EXTRN NUMBER (CANT_BYTES)
EXTRN NUMBER (BANDERA)
EXTRN NUMBER (DATO)
ENT_C SEGMENT CODE
RSEG ENT_C
ENT_DATO:
Mov B, #CANT_BYTES;
Mov R0, #DIR_BYTEALTO;
Mov R3, #BANDERA
Mov R2, #DATO
dec B
cjne R3,#01H,ENTDER
ENTIZQD:dec R0
;R0 APUNTA A UNA DIREC. MAS BAJA
mov A,@R0
inc R0
;SUBO EL VALOR ANTERIOR
mov @R0,A
;A UNA DIREC. SUPERIOR
dec R0
;DECREMENTO R0 A LA PROXIMA DIREC.
djnz B,ENTIZQD
mov A,R2
mov @R0,A
;ENTRO DATO A LA CADENA
ret
ENTDER:clr C
; SETEO EL ACARREO PARA LA RESTA
mov A,R0
;GARANTIZA QUE R0 APUNTE A DIR. MAS BAJA
subb A,B
mov R0,A
ENTDER1:inc R0
;R0 APUNTA A DIREC. MAS ALTA
mov A,@R0

280

Fundamentos del lenguaje ensamblador


dec R0
mov @R0,A
inc R0
djnz B,ENTDER1
mov A,R2
mov @R0,A
RET
END

;SUBO EL VALOR ANT. A DIREC. INFERIOR


;INC R0 A UNA DIRECCION MAS ALTA

;ENTRO EL DATO A LA CADENA

PROGRAMA DE COMPROBACIN:
NAME PROGRAMA_COMPROBACION
; Comprobacin del algoritmo para entrar dato por derecha
; o izquierda
EXTRN CODE (ENT_DATO)
PUBLIC DIR_BYTEALTO
PUBLIC CANT_BYTES
PUBLIC BANDERA
PUBLIC DATO
DIR_BYTEALTO EQU 22h; Direccin apunta a dato ms significativo
CANT_BYTES EQU 03H; cantidad de datos
BANDERA EQU 00H; Sentido de entrada
DATO EQU 45h; dato a entrar
CALL ENT_DATO
END

4.4.10.2.- El mximo y el mnimo de una tabla.


Para determinar el mximo de una tabla puede inicializarse una variable con el menor valor que puede
tomar un byte (00), tal valor debe compararse con cada uno de los elementos de forma tal que la variable
acumule el mayor valor (FFh). De forma idntica se puede obtener el mnimo, pero ahora la variable debe
inicializarse con el mayor valor. Un mtodo alternativo puede ser realizar la bsqueda por el mtodo de la
burbuja.
Ejemplo 4.37:
NAME MAXIMO_DE_TABLA
;=============================================================================
;PROPSITO DEL PROGRAMA:Buscar el maximo valor de una tabla de N bytes
;=============================================================================
;PARAMETROS DE ENTRADA:
;
;R0-Apunta a la direccion inicial de la tabla
;B-Contiene la cantidad de elementos de la tabla
;=============================================================================
;FORMA DE LLAMADO:CALL MAXIMO
;=============================================================================
;REGISTROS UTILIZADOS:A,R0,DIR_DATO:30H,B
;=============================================================================
;BYTES QUE OCUPA EN MEMORIA: 20
;=============================================================================

281

Fundamentos del lenguaje ensamblador


;EJEMPLO:
; Entrada:
; Si R0=20H B=3 (20..22H)=(22H,44H,77H)
; Salida:
;
30H=77H
;=============================================================================
PUBLIC MAXIMO
EXTRN NUMBER (DIR_BYTEBAJO)
EXTRN NUMBER (CANT_BYTES)
MAX_C SEGMENT CODE
RSEG MAX_C
MAXIMO:
Mov B, #CANT_BYTES;
Mov R0, #DIR_BYTEBAJO;
mov A,@R0
;Toma dato
mov 30H,A
;a memoria
MAX:mov A,@R0
;prximo dato
cjne A, 30H, NOIGUAL ;se compara
NOIGUAL:jc NOMAX
mov 30H,A
;EN 30H EL NUEVO MAXIMO
NOMAX:inc R0
djnz B,MAX
ret
END
PROGRAMA DE COMPROBACIN:
NAME PROGRAMA_COMPROBACION
; Comprobacin del algoritmo para bsqueda del mximo
EXTRN CODE (MAXIMO)
PUBLIC DIR_BYTEBAJO
PUBLIC CANT_BYTES
DIR_BYTEBAJO EQU 20h; Direccin menos significativa de la tabla
CANT_BYTES EQU 03H; Nmero de datos de la tabla
CALL MAXIMO
END

Ejemplo 4.38:
NAME MINIMO_TABLA
;=============================================================================
;PROPSITO DEL PROGRAMA:Buscar el minimo valor de una tabla de N bytes
;=============================================================================
;PARAMETROS DE ENTRADA:
;
;R0-Apunta a la direccion inicial de la tabla
;B-Contiene la cantidad de elementos de la tabla
;=============================================================================
;FORMA DE LLAMADO:CALL MINIMO
;=============================================================================

282

Fundamentos del lenguaje ensamblador


;REGISTROS UTILIZADOS:A,R0,DIR_DATO:30H,B
;=============================================================================
;BYTES QUE OCUPA EN MEMORIA: 20
;=============================================================================
;EJEMPLO:
; Entrada:
; Si R0=20H B=3 (20..22H)=(22H,44H,77H)
; Salida:
;
30H=22H
;=============================================================================
PUBLIC MINIMO
EXTRN NUMBER (DIR_BYTEBAJO)
EXTRN NUMBER (CANT_BYTES)
MIN_C SEGMENT CODE
RSEG MIN_C
MINIMO:
Mov B, #CANT_BYTES;
Mov R0, #DIR_BYTEBAJO;
mov A,@R0
;toma dato
mov 30H,A
;primer dato a memoria
MIN:mov A,@R0
cjne A,30H,NOIGUAL
NOIGUAL:jnc NOMIN
mov 30H,A
;en 30H el mnimo
NOMIN:inc R0
djnz B,MIN
ret
END
PROGRAMA DE COMPROBACIN:
NAME PROGRAMA_COMPROBACION
; Comprobacin del algoritmo para bsqueda del mnimo
EXTRN CODE (MINIMO)
PUBLIC DIR_BYTEBAJO
PUBLIC CANT_BYTES
DIR_BYTEBAJO EQU 20h; Direccin menos significativa de la tabla
CANT_BYTES EQU 03H; Nmero de datos de la tabla
CALL MINIMO
END

La clasificacin por burbujas: Existe una estructura donde un conjunto de elementos est desordenado en
una tabla y puede que sea necesario que estos elementos adopten un orden progresivo. Una tcnica de clasificacin es la denominada clasificacin por burbujas.
En la clasificacin por burbujas cada elemento del dato se compara con el precedente y se intercambia con
l si su valor es inferior. As, el dato de menor valor va "emergiendo" hacia la parte superior de la tabla. La
clasificacin se ha completado cuando no tienen lugar ms intercambios.

283

Fundamentos del lenguaje ensamblador


Ejemplo 4.39:
Ordene en orden ascendente la siguiente tabla:
1
17
101
2
5
45
37
16
3
Para solucionar este problema, se deben ejecutar seis pasos, aparte del final, donde se determina que no
hacen falta ms intercambios para tener clasificada la tabla.
Los pasos a desarrollar para clasificar por burbujas son:
Origen

Despus del
paso 1

Despus del
paso 2

Despus del
paso 3

1
17
101*
2*
5*
45*
37*
16*
3*

1
17*
2*
5*
45*
37*
16*
3*
101

1
2
5
17
37*
16*
3*
45
101

1
2
5
17*
16*
3*
37
45
101

Despus del
paso 4
1
2
5
16*
3*
17
37
45
101

Despus del
paso 5
1
2
5*
3*
16
17
37
45
101

Despus del
paso 6
1
2
3
5
16
17
37
45
101

* - Significa que los valores se intercambian.


Ntese como es conveniente establecer dos punteros para comparar los datos de la lista.
Ejemplo 4.40:

284

Fundamentos del lenguaje ensamblador


NAME BURBUJA
;=============================================================================
;PROPSITO DEL PROGRAMA:Ordenar una tabla de N bytes
;=============================================================================
;PARAMETROS DE ENTRADA:
;
;R0-Apunta a la direccion inicial de la tabla
;B-Contiene la cantidad de elementos de la tabla
;=============================================================================
;FORMA DE LLAMADO:CALL BURBUJA
;=============================================================================
;REGISTROS UTILIZADOS:A,R0,B
;=============================================================================
;BYTES QUE OCUPA EN MEMORIA: 26
;=============================================================================
;EJEMPLO:
; Entrada:
; Si R0=20H B=3 (20..22H)=(22H,77H,66H,11H)
; Salida:
;
(20..22H)=(11H,22H,66H,77H)
;=============================================================================
PUBLIC BURBUJA
EXTRN NUMBER (DIR_BYTEBAJO)
EXTRN NUMBER (CANT_BYTES_M1)
BURB SEGMENT CODE
RSEG BURB
BURBUJA:
Mov B, #CANT_BYTES_M1;
Mov R0, #DIR_BYTEBAJO;
mov r1, #00h;
Prox_comp:
mov A,@R0
; toma dato
inc r0
; proximo dato
subb a,@r0
jnc intercambio
inc r1
; cantidad de acarreos
Sigo:
djnz B,Prox_comp
cjne r1,#CANT_BYTES_M1,BURBUJA
ret
intercambio:
mov a,@r0
dec r0
xch a,@r0
inc r0
mov @r0,a
sjmp Sigo
end

; direccin anterior

PROGRAMA DE COMPROBACIN:
NAME PROGRAMA_COMPROBACION
; Comprobacin del algoritmo para ordenar por burbuja

285

Fundamentos del lenguaje ensamblador

EXTRN CODE (BURBUJA)


PUBLIC DIR_BYTEBAJO
PUBLIC CANT_BYTES_M1
DIR_BYTEBAJO EQU 20h; Direccin menos significativa de la tabla
CANT_BYTES_M1 EQU 03H; Nmero de datos de la tabla menos 1
CALL BURBUJA
END

4.4.11.- Las subrutinas de demora.


La subrutina de demora se utiliza en aquellas aplicaciones que requieren de determinada accin cada
cierto perodo de tiempo bien definido. Ello puede ser en aplicaciones de Entrada/Salida para poder
brindar intervalos de tiempo con longitudes especficas y crear pulsos de determinada frecuencia y
duracin.
Ejemplo 4.41:
Obtenga un pulso en "1" lgico con una duracin de N msegs.
Un programa genrico puede implementarse de la siguiente forma:
OUT (PTO_1), A
--------------- ; Demora de N msegs
-------OUT (PTO_2),A

donde PTO_1 y PTO_2 pueden ser dos terminales de puerto como se muestran en la fig. 4.6.

DEMORA
N mseg

PR

CL

PTO_1

CLK
6

PTO_2

7474

Fig. 4.6.- Mtodo para obtener un pulso de duracin especfica.


El ejemplo anterior puede generalizarse a una seal de determinada frecuencia y ciclo til impuesto por
programa a partir de la aplicacin.

286

Fundamentos del lenguaje ensamblador


Las rutinas de demora pueden tambin facilitar el autochequeo, donde se espera determinado tiempo a
que un perifrico ( como puede ser un impresor) est listo para la transferencia.
La atencin a un teclado necesita la supresin del tiempo de rebote (tiempo de establecimiento de los
contactos metlicos de las teclas), para el cual la generacin de un tiempo de espera por programa puede
ser til.
Para elaborar una rutina de demora puede utilizarse la siguiente frmula:
Treal = Tfijo + Tlazo + Tajuste

(4.1)

donde:
Treal =Tiempo deseado para la rutina de demora.
Tfijo =Tiempo que se demora en la ejecucin de instrucciones no incluidas en el lazo de espera.
Tlazo =Tiempo que se demora en la ejecucin de un lazo.
Tajuste =Tiempo que es necesario adicionar para obtener la duracin total deseada.
Una secuencia ilustrativa de un programa de demora de propsito general para un microprocesador
genrico puede definirse de la siguiente forma:
SALVO REGISTROS (T1)

INICIALIZO CONTADOR (T2)


LAZO:
DECREMENTO CONTADOR(T3);
SALTO SI NO ES CERO A LAZO(T4)

; Salvar a la pila los registros


; utilizados por el programa de
; demora.
; Se inicializa el valor del registro
; de control del lazo

; Permite el control iterativo


; el valor de T4 puede ser
;diferente cuando se transfiere
; a LAZO con respecto
; a la ejecucin de la
; prxima instruccin

RECUPERO REGISTROS (T5)


RETORNO (T6)

Los tiempos de demora del anterior algoritmo pueden determinarse a travs de la siguiente expresin:
Tfijo =T1+T2+T5+T6+Tcall

(4.2)

y
Tlazo =NN(T3+T4)-m

(4.3)

donde:
NN =Valor con que es inicializado el contador.

287

Fundamentos del lenguaje ensamblador


Tcall =Tiempo que demora en ejecutarse la instruccin CALL que llama a la rutina de demora.
m =Valor de diferencia entre el tiempo que se demora la instruccin de salto en ir a LAZO con respecto a
la ejecucin de la prxima instruccin.
Por ejemplo, una rutina de demora implementada para un microcontrolador de la serie MCS51 se
muestra a continuacin:
DEMORA: PUSH DPL
MOV DPL,NN
LAZO: NOP
DJNZ DPL,LAZO

; T1 =24t
; T2 =24t
; T3 =12t
;T4 =24t si salta
;T4 =24t si no salta
;T5 =24t
;T6 =24t

POP DPL
RET

Donde t es el perodo del reloj externo que se ha conectado al microcontrolador.


La anterior demora tendra la siguiente duracin:
Treal =Tfijo+Tlazo
Tfijo =T1+T2+T5+T6+Tcall=120t
Tlazo =NN(T3+T4) =NN(36)t
Treal =(120+NN(36))t
Si el microcontrolador trabaja a una frecuencia de 12MHz y el nmero de iteraciones se fijara en 12,
entonces la demora sera:
Treal =(120+12(36))(1/12MHz)=46segs.
Ntese como el valor de m (ver (4.3)), dentro de tiempo de lazo, no ha sido considerada en el ejemplo
anterior, ello viene dado porque el tiempo que se demora en saltar la instruccin DJNZ (que por cierto
tiene incorporada en s el decremento de la variable contadora junto al salto) a LAZO es el mismo que el
que demora en ir a la prxima instruccin cuando la condicin se cumple, lo cual no ocurre as si tal
programa fuese desarrollado para el microprocesador Z80:
PUSH DE
LD D,NN
LAZO: DEC D
JR NZ,LAZO
POP DE
RET

; T1=11t
; T2=7t
; T3=4t
; T4=12t SI SALTA
; T4=7t SI NO SALTA
; T5=10t
; T6=10t

En tal caso el tiempo de demora sera:


Tfijo =T1+T2+T5+T6 =55t
Tlazo=NN(T3+T4)-m=NN(4t+12t)-5t

288

Fundamentos del lenguaje ensamblador

donde m (definido por T4) es igual a 5t (el equivalente a 12t-7t).


Ejemplo 4.42:
Implemente una rutina de demora de 1mseg. para el microprocesador Z80, suponga que se trabaja a una
frecuencia de 1MHz.
Solucin:
Se utilizar la misma rutina anteriormente comentada. Para obtener 1mseg. puede utilizarse (4.1):
Treal=Tfijo+Tlazo+Tajuste
Tfijo+Tlazo =55t+NN(4t+12t)-5t =1mseg.
Despejando NN, resulta:
NN = (1mseg-50t)/16t
Como t para un reloj de 1MHz es 1seg, resulta:
NN= 59.3 59
Ntese como la aproximacin de NN es por defecto para que no se obtenga un tiempo superior al deseado.
El tiempo resultante sera:
Tfijo + Tlazo =(50+59(16))1seg = 994seg.
El tiempo de ajuste necesario para obtener 1mseg. sera:
Tajuste=Treal-(Tfijo+Tlazo) =1mseg-994seg =6seg.
Es necesario entonces adicionar una instruccin cuya duracin sea de 6 perodos de reloj para obtener los
6seg. El programa final, que genera una demora de 1mseg puede implementarse:
PUSH DE
LD D,59D
LAZO:DEC D
JR NZ,LAZO
INC DE
POP DE
RET

; Incorpora el tiempo de ajuste

Aumentando el tiempo en una subrutina de demora.


La subrutina previamente elaborada posee un tiempo mximo lmite que puede brindar (ello ocurre
cuando se inicializa NN en 00, lo que permite un lazo de 256 iteraciones). Cuando son necesarios
tiempos superiores, basta anidar lazos. Un ejemplo de subrutina desarrollada para el Z80 sera:
PUSH DE

;T1

289

Fundamentos del lenguaje ensamblador


LD D,NN

;T2

LD E,MM

;T3

DEC E
JR NZ,LAZO1
DEC D
JR NZ,LAZO2
POP DE
RET

;T4
;T5
;T6
;T7
;T8
;T9

LAZO2:
LAZO1:

Ahora el tiempo fijo sera:


Tfijo=T1+T2+T8+T9+Tcall=55t
y el tiempo del lazo:
Tlazo=NN(T3+MM*(T4+T5)-5+T6+T7)-5
Ntese como, si la rutina fuese elaborada para un microprocesador donde el tiempo de salto es el mismo
que el tiempo en ir a ejecutar la prxima instruccin ( por ejemplo, la serie MCS51), el trmino -5 no
tendra que considerarse.
Ejemplo 4.43:
NAME Demora_1
;**********************************************************
; Este programa permite: Hacer una demora cuyo rango
; para un reloj de 12 MHz ( serie MCS48) esta entre
; .007 mseg <= Td <= 1.282 mseg
; El tiempo puede ser calculado por la
; siguiente formula:
; Td = (24 + NN*60)t
; Siendo t : Perodo del reloj del sistema
;
NN : Dato a decrementar que debe ser
;
definido por el programador, debe
;
estar en el registro R2.
;**********************************************************
; Bytes que ocupa en memoria: 6 Bytes.
;**********************************************************
; Parametros de entrada:
;
R2 = NN ; Dato a decrementar.
;**********************************************************
; Registros utlilizados: A,R2.
;**********************************************************
; Forma de llamado: Call Demora1
;**********************************************************

Demora1:

Mov A,R2
Dec A
Mov R2,A
JnZ Demora1
Ret
End

; 12 periodos de reloj.
; 12 periodos de reloj.
; 12 periodos de reloj.
; 24 periodos de reloj.
; 24 periodos de reloj.

290

Fundamentos del lenguaje ensamblador

Ejemplo 4.44:
NAME Demora _2.
;**********************************************************
; Este programa permite: Hacer una demora cuyo intervalo
;
para un reloj de 2 MHz es:
;
.05 mseg <= Td <= 526.69 mseg
; El tiempo puede ser calculado por la
; siguiente formula:
; Td = 64/FC + MM[20/FC + 16NN/FC]
; Siendo FC : Frecuencia del reloj del sistema
;
NN : Dato a decrementar que debe ser
;
definido por el programador, debe
;
estar en el registro B.
;
MM : Dato a decrementar que debe ser
;
definido por el programador, debe
;
estar en el registro C.
;**********************************************************
; Bytes que ocupa en memoria: 12 Bytes.
;**********************************************************
; Parametros de entrada:
; B = NN : valor a decrementar.
; C = MM ; valor a decrementar.
;**********************************************************
; Registros utlilizados: AF, BC.
;**********************************************************
; Forma de llamado: Call Demora2
;**********************************************************
.Z80
Aseg
Org 100h
Demora2: Push AF
; 11 estados de reloj
Push BC
; 11 estados de reloj
LazD2: Ld A,B
; 9 estados de reloj
LazD1: Dec A
; 4 estados de reloj
Jr nZ,LazD1
; 12/7 estados de reloj
Dec C
; 4 estados de reloj
Jr nZ,LazD2
; 12/7 estados de reloj
Pop BC
; 10 estados de reloj
Pop AF
; 10 estados de reloj
Ret
; 10 estados de reloj
End

Se puede tener en consideracin que; alternativamente, se pueden implementar demoras utilizando las
siguientes estrategias:
a)A partir de un conjunto de instrucciones que demoren n estados (tiempos pequeos).
b)Lazos independientes unos de otros.
c)Llamar varias veces a una misma rutina.
4.4.12.- La conversin binario-BCD.

291

Fundamentos del lenguaje ensamblador


Para convertir un nmero binario a BCD debe considerarse cuntas veces puede sustituirse determinada
potencia de 10 (dependiente del rango del nmero) a un nmero binario. Para ello supngase que se tiene
el valor 11101101B (237D), un mtodo para determinar los dgitos en BCD puede ser:
11101101
-01100100
-----------------10001001
-01100100
-----------------00100101
-00001010
-----------------00011011
-00001010
-----------------00010001
-00001010
-----------------00000111

237
-100
----137
-100
----37
-10
----27
-10
----17
-10
----7

Dgitos de las centenas


igual a 2

Dgitos de decenas
igual a tres

-------- Dgito de unidades

Ntese como para obtener el dgito de las centenas es necesario determinar cuntas veces cabe 100 en el
nmero binario. Las veces que podr ser sustrado 10 del nmero binario determinar el dgito de las
decenas, el nmero restante sern las unidades. As, 100 puede ser sustrado (del valor 237D) dos veces
(0010B), 10 puede ser sustrado tres veces (0011B) y el resto (dgito de las unidades) ser 7 (0111B). El
nmero BCD equivalente a 237 ser 0010 0011 0111.
4.4.13.- Conversin ASCII-BCD.
Cuando un microprocesador se usa para atender un teclado, los nmeros entran comnmente en cdigo
ASCII. Por ejemplo, el nmero 237D se almacenara en memoria como tres caracteres ASCII:
Nmero
2
3
7

Carcter ASCII
00110010
00110011
00110111

Ntese como los cuatro bits menos significativos del caracter ASCII representa el valor en BCD del
nmero correspondiente. Por tanto, para convertir caracteres ASCII a BCD basta eliminar los cuatro bits
ms significativos ( AND ASCII,#0FH).
4.4.14.- Conversin BCD-binario.
Para convertir un nmero BCD a binario se debe realizar el proceso inverso a la conversin binario-BCD,
adicionar tantas veces la potencia de 10 como indique la cifra correspondiente en BCD. Si el nmero a
convertir es 237D (0010 0011 0111), ntese como 0010 representa dos centenas, 0011 tres decenas y
0111 siete unidades. A partir de cero, se puede adicionar 100d tantas veces como indique el nmero de las
centenas. La cantidad de veces que se sume 10d depender del valor del dgito de las decenas y
finalmente el valor del dgito de las unidades debe adicionarse, como se muestra a continuacin:
01100100B

100D

Se adiciona 100d dos veces

292

Fundamentos del lenguaje ensamblador


+01100100B
-------------11001000B
+00001010B
-------------11010010B
+00001010B
--------------11011100B
+00001010B
--------------11100110B
+00000111B
--------------11101101B

+100D
---------200D
+ 10D
---------210D
+ 10D
---------220D
+ 10D
---------230D
+ 7D
--------237D

Se adiciona 10d tres veces

Se adiciona las unidades

El resultado sera 11101101B, que representa al valor 237D.


El anterior mtodo puede optimizarse si se considera que para obtener un nmero binario a partir de un
nmero decimal es necesario realizar mltiples divisiones por dos donde el primer resto representa el
dgito menos significativo y el ltimo resto de la divisin el dgito ms significativo.
Inicialmente, se coloca en cero la variable donde quedar el resultado binario y se setea el acarreo, el
objetivo de esta operacin ser el de indicar cuando finaliza el nmero de rotaciones necesarias para la
formacin del nmero binario. La operacin de rotacin permite ir introduciendo los restos que devuelve
la operacin de divisin en cdigo BCD de NUMD. Para realizar la divisin entre dos (ver fig. 4.14 )
debe considerarse el peso de cada bit de acuerdo a la base del nmero:
7 6 5 4 3 2 1 0
80 40 20 10 8 4 2 1
128 64 32 16 8 4 2 1

No del bit
Peso en BCD
Peso en binario

Ntese como al rotar el nmero binario a la derecha automticamente ejecuta la divisin por dos, pero
cuando el nmero se interpreta en BCD es necesario considerar la siguiente particularidad: El peso del bit
4 es 10 en BCD, al rotar a la derecha devolvera un peso de 8 puesto que la operacin se ha realizado
sobre el nmero binario, pero al dividir entre dos el nmero 10 el resultado debe ser 5 en BCD. La
diferencia entre 8 y 5 es tres, por lo que para mantener el formato en BCD debe realizarse la sustraccin
del valor 3(011B) al resultado binario. Ntese como algo semejante ocurre con el bit 7, si se introduce un
1 en este ello representa la divisin por dos de 100d, que es 50. Pero el peso del bit 7 es 80, la diferencia
(30d) debe ser sustrada del nmero BCD.
Cuando se implementa este algoritmo en mltiple precisin existirn dificultades en cuanto al tratamiento
del acarreo, para ello se puede implementar un contador en vez de utilizar el acarreo como bandera de fin
de conversin.
4.4.15.- La Suma chequeo.
Una operacin muy til para el diseo de equipos electrnicos es la "suma chequeo", que ha sido muy
utilizada para la verificacin del estado de las memorias as como para verificar posibles errores en la
transmisin de datos. La suma chequeo se puede efectuar definiendo dos punteros, uno de ellos permitir
almacenar las direcciones cuyo contenido se irn sumando y el otro a la direccin donde se guarda el

293

Fundamentos del lenguaje ensamblador


resultado. El contenido de la direccin definida por el primer vector se ira sumando con el acumulador y
guardando en la direccin definida por el segundo puntero hasta que se sumen el numero de direcciones
definidas por los datos trasmitidos.

NUM
BCD

Rotar a la
derecha
NUMBCD

Bit3=1
NUMBCD=
NUMBCD-3

Bit7=1
NUMBCD=
NUMBCD-30

Fin
Figura 4.14.- La divisin por dos de un nmero en BCD.

Ejemplo 4.45:
NAME SUMA_CHEQUEO
;=============================================================================
;PROPSITO DEL PROGRAMA:Determina suma de 16 bytes y almacena el negado
;
de ello en dos bytes consecutivos.
;=============================================================================
;PARAMETROS DE ENTRADA:
;
;R0-Puntero a primer dato de la tabla
;=============================================================================
;PARAMETROS DE SALIDA:
;
;Devuelve en 40h, 41h el complemento a dos de la suma de los 16 bytes
;=============================================================================

294

Fundamentos del lenguaje ensamblador


;FORMA DE LLAMADO:CALL CHECK_SUM
;=============================================================================
;REGISTROS UTILIZADOS:A,R0,R2,B
;=============================================================================
;BYTES QUE OCUPA EN MEMORIA: 26
;=============================================================================
CHECK_S SEGMENT CODE
RSEG CHECK_S
CHECK_SUM:
mov r0,#30h
; puntero a datos
mov r2,#16d
; nmero de datos a sumar
mov a,#00
; inicio destino
vuelvo:
clr c
addc a,@r0
jnc sigo
inc b
; byte ms significativo del resultado
sigo:
inc r0
; busco proximo byte
djnz r2,vuelvo
; determino complemento a dos y se carga en 40h,41h
cpl a
add a,#01
mov @r0,a
; -sig. en 40h
xch a,b
cpl a
addc a,#00h
inc r0
mov @r0,a
; +sig. en 41h
ret
END

295

También podría gustarte