Fundamentos del
lenguaje ensamblador
PROGRAMACION
EDICION
ENSAMBLAJE
PUESTA A PUNTO
CARGA/ENLACE
235
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
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:
PROGRAMA
INICIO:
LAZO:
MOV DPTR,#3000H
XRL A,A
MOV R1,10H
MOVX @DPTR,A
INC DPTR
DJNZ R1,LAZO
CONTINUA:
Posicin
000B
237
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
Programa en
lenguaje fuente
Ensamblador
238
Programa en
lenguaje de mquina
239
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
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
Vision/51
Compilador
C51
Biblioteca
C
Macro
ensamblador
A51
Sistema de
operacin en
tiempo real
RTX51
Controlador
de biblioteca
LIB51
Emulador y
programacin de
EPROM
Depurador (DScope-51)
Simulador
de
perifrico y CPU
Monitor-51
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
243
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
244
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
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
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
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
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
; 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
LINE
1
SOURCE
NAME PRINCIPAL
248
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
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
249
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
T Y P E V A L U E ATTRIBUTES
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
000AH
ABSOLUTE
251
252
253
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
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
256
LSByte
10010000
Como el bit MSB del byte menos significativo es 1, se incrementa en 1 el byte ms significativo, siendo el
resultado:
257
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
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
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
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
262
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
263
264
265
;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
266
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
CALL DEC_HEX
END
268
269
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
271
272
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
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
274
275
276
277
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
0
1
2
0
2
4
3
8
3
5
9
1
279
280
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
281
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
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
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
284
; direccin anterior
PROGRAMA DE COMPROBACIN:
NAME PROGRAMA_COMPROBACION
; Comprobacin del algoritmo para ordenar por burbuja
285
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
286
(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)
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
; T1 =24t
; T2 =24t
; T3 =12t
;T4 =24t si salta
;T4 =24t si no salta
;T5 =24t
;T6 =24t
POP DPL
RET
; T1=11t
; T2=7t
; T3=4t
; T4=12t SI SALTA
; T4=7t SI NO SALTA
; T5=10t
; T6=10t
288
;T1
289
;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:
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
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
237
-100
----137
-100
----37
-10
----27
-10
----17
-10
----7
Dgitos de decenas
igual a tres
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
292
+100D
---------200D
+ 10D
---------210D
+ 10D
---------220D
+ 10D
---------230D
+ 7D
--------237D
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
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
295