assembly

61
Fundamentos del lenguaje ensamblador 235 Fundamentos del lenguaje ensamblador 4.1.-El lenguaje ensamblador y el lenguaje de máquina. Al dar una definición, en pocas palabras, de una computadora, se puede decir que se trata de un equipo para interpretar y ejecutar una secuencia de elementos de información almacenados en la memoria y realizar una serie de operaciones que estarán determinadas por la secuencia de pasos ejecutados. Las operaciones efectuadas incluyen la transformación de datos por la unidad aritmética a partir de códigos en memoria, así como la especificación de la dirección de la siguiente instrucción a ser ejecutada. La interpretación de las sucesivas instrucciones en una secuencia y su realización, constituye lo que se llama ejecución de un programa. Aquellos programas que pueden ejecutarse directamente por el microprocesador, se dice que están en lenguaje de máquina. Los programas escritos en lenguaje de máquina son muy difíciles de implementar, ello se debe a que el usuario tiene que convertir el nemotécnico que representa a la instrucción en código binario, especificar la dirección de memoria donde se encuentre la instrucción 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 genérico de los pasos a seguir. Fig. 4.1.- Pasos para la puesta a punto de un programa en ensamblador. PROGRAMACION EDICION ENSAMBLAJE CARGA/ENLACE PUESTA A PUNTO

Upload: wilson-barba

Post on 10-Nov-2015

7 views

Category:

Documents


0 download

DESCRIPTION

Lenguaje Assembler

TRANSCRIPT

  • Fundamentos del lenguaje ensamblador

    235

    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.

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

    PROGRAMACION

    EDICION

    ENSAMBLAJE

    CARGA/ENLACE

    PUESTA A PUNTO

  • Fundamentos del lenguaje ensamblador

    236

    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).

  • Fundamentos del lenguaje ensamblador

    237

    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: MOV DPTR,#3000H ; Se define un puntero

    XRL A,A ; Coloca al acumulador en cero

    MOV R1,10H ; Se define un contador

    LAZO: MOVX @DPTR,A ; Se llena una zona de RAM

    INC DPTR ; con ceros

    DJNZ R1,LAZO

    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 PROGRAMA 0000 INICIO: MOV DPTR,#3000H 0003 XRL A,A

    0005 MOV R1,10H

    0007 LAZO: MOVX @DPTR,A

    0008 INC DPTR

    0009 DJNZ R1,LAZO

    000B 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 Posicin CONTINUA 000B

  • Fundamentos del lenguaje ensamblador

    238

    INICIO 0000

    LAZO 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 Cdigo Programa 1 0000 90 30 00 INICIO: MOV DPTR,#3000H

    2 0003 65 E0 XRL A,A

    3 0005 A9 10 MOV R1,10H

    4 0007 F0 LAZO: MOVX @DPTR,A

    5 0008 A3 INC DPTR

    6 0009 D9 FC DJNZ R1,LAZO

    7 000B CONTINUA:

    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.

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

    Programa en

    lenguaje fuente

    Ensamblador Programa en

    lenguaje de mquina

  • Fundamentos del lenguaje ensamblador

    239

    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

  • Fundamentos del lenguaje ensamblador

    240

    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.

  • Fundamentos del lenguaje ensamblador

    241

    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.

  • Fundamentos del lenguaje ensamblador

    242

    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).

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

    Vision/51

    Compilador

    C51

    Macro

    ensamblador

    A51

    Biblioteca

    C Controlador

    de biblioteca

    LIB51

    Sistema de

    operacin en

    tiempo real

    RTX51

    Linker BL51 para banco de cdigos.

    Depurador (DScope-51)

    Simulador de

    perifrico y CPU Monitor-51

    Emulador y

    programacin de

    EPROM

  • Fundamentos del lenguaje ensamblador

    243

    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 ; se define una constante

    RESET CODE 0000H ; define direccin de cdigo de inicio

    CSEG AT 300H ; en memoria de programa (300H)

    Tabla_1: DB 04h ; Se definen bytes a partir de 300H

    DB 05h

    DB 0ffh

  • Fundamentos del lenguaje ensamblador

    244

    Codigo_tabla2 SEGMENT CODE ; En memoria de programa, relocalizable.

    RSEG Codigo_tabla2

    Tabla_2:

    DW 4025h

    DW 0ff03h

    DW 450Eh ;

    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.

  • Fundamentos del lenguaje ensamblador

    245

    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 LINE SOURCE

    1 NAME EJEMPLO_1

    0010 2 VALOR_CONST EQU 10H

    0000 3 RESET CODE 0000H

    4

    ---- 5 CSEG AT 300H

    0300 04 6 Tabla_1: DB 04h

    0301 05 7 DB 05h

    0302 FF 8 DB 0ffh

    9

    10 Codigo_tabla2 SEGMENT CODE

    ---- 11 RSEG Codigo_tabla2

    0000 12 Tabla_2:

    0000 4025 13 DW 4025h

    0002 FF03 14 DW 0ff03h

    0004 450E 15 DW 450Eh ;

    16

    ---- 17 CSEG AT 500h

    0500 18 Tabla_3:

    0500 43414445 19 DB 'CADENA DE CARACTERES'

    0504 4E412044

    0508 45204341

    050C 52414354

    0510 45524553

    20

    ---- 21 DSEG AT 20H

    0020 22 VAR:

    0020 23 DS 1

    24

    0021 25 CADENA:

    0021 26 DS 10D

    27

    28

    29

    ---- 30 CSEG AT RESET

    0000 D100 31 CALL SUBRUTINA

    32

    33

    ---- 34 CSEG AT 600H

    0600 35 SUBRUTINA:

    0600 E510 36 MOV A,VALOR_CONST;

    0602 F520 37 MOV VAR,A;

    0604 22 38 RET;

    39

    40

    41 END

  • Fundamentos del lenguaje ensamblador

    246

    XREF SYMBOL TABLE LISTING

    ---- ------ ----- -------

    N A M E T Y P E V A L U E ATTRIBUTES / REFERENCES

    CADENA . . . . . . D ADDR 0021H A 25#

    CODIGO_TABLA2. . . C SEG 0006H REL=UNIT 10# 11

    EJEMPLO_1. . . . . N NUMB ----- 1

    RESET. . . . . . . C ADDR 0000H A 3# 30

    SUBRUTINA. . . . . C ADDR 0600H A 31 35#

    TABLA_1. . . . . . C ADDR 0300H A 6#

    TABLA_2. . . . . . C ADDR 0000H R SEG=CODIGO_TABLA2 12#

    TABLA_3. . . . . . C ADDR 0500H A 18#

    VALOR_CONST. . . . N NUMB 0010H A 2# 36

    VAR. . . . . . . . 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 ; En memoria de programa, relocalizable.

    RSEG Codigo_tabla2

    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:

    PUNTERO EQU 4000H 2 4000 90 30 00 INICIO: MOV DPTR,PUNTERO

    3 4003 65 E0 XRL A,A

    4 4005 A9 10 MOV R1,10H

    5 4007 F0 LAZO: MOVX @DPTR,A

    6 4008 A3 INC DPTR

    7 4009 D9 FC DJNZ R1,LAZO

    8 400B CONTINUA:

    Ntese como las direcciones de la tabla de smbolos cambian por la adicin de la direccin de inicio

    4000H:

    Nombre Posicin 8 CONTINUA 400B

    2 INICIO 4000

    5 LAZO 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.

  • Fundamentos del lenguaje ensamblador

    247

    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;

  • Fundamentos del lenguaje ensamblador

    248

    ; Constante

    CANT_DATOS EQU 0AH

    CSEG AT 00H

    RESET:

    MOV R1,#DIR_DATOS_A ; Se inicializa punteros

    MOV R0,#DIR_DATOS_B

    MOV R3,#CANT_DATOS ; Se inicializa contador

    LLENA:

    MOV @R1,#03 ; Se llena zona de datos

    MOV @R0,#05

    INC R0

    INC R1

    DJNZ R3,LLENA

    CALL SUMARA

    END

    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 SOURCE

    1 NAME PRINCIPAL

  • Fundamentos del lenguaje ensamblador

    249

    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

    0040 13 DIR_DATOS_A DATA 40H

    0000 14 DS 10D;

    15

    ---- 16 DSEG AT 50H

    0050 17 DIR_DATOS_B:

    0050 18 DS 10D;

    19

    20 ; Constante

    000A 21 CANT_DATOS EQU 0AH

    22

    ---- 23 CSEG AT 00H

    0000 24 RESET:

    0000 7940 25 MOV R1,#DIR_DATOS_A ; Se inicializa punteros

    0002 7850 26 MOV R0,#DIR_DATOS_B

    0004 7B0A 27 MOV R3,#CANT_DATOS ; Se inicializa contador

    0006 28 LLENA:

    0006 7703 29 MOV @R1,#03 ; Se llena zona de datos

    0008 7605 30 MOV @R0,#05

    000A 08 31 INC R0

    000B 09 32 INC R1

    000C DBF8 33 DJNZ R3,LLENA

    000E 120000 F 34 CALL SUMARA

    35 END

    SYMBOL TABLE LISTING

    ------ ----- -------

    N A M E T Y P E V A L U E ATTRIBUTES

    CANT_DATOS . . . . N NUMB 000AH A

    DIR_DATOS_A. . . . D ADDR 0040H A

    DIR_DATOS_B. . . . D ADDR 0050H A

    LLENA. . . . . . . C ADDR 0006H A

    PRINCIPAL. . . . . N NUMB -----

    RESET. . . . . . . C ADDR 0000H A

    SUMARA . . . . . . C ADDR ----- 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

  • Fundamentos del lenguaje ensamblador

    250

    LOC OBJ LINE SOURCE

    1 NAME SUMA_MULTIPLE

    2 ; Sumara datos en multiple precision

    3

    4 ; Biblioteca de simbolos externos

    5 EXTRN DATA (DIR_DATOS_A)

    6 EXTRN DATA (DIR_DATOS_B)

    7 EXTRN NUMBER (CANT_DATOS)

    8 PUBLIC SUMARA

    9

    10 SUMA_MULTIPLE SEGMENT CODE

    ---- 11 RSEG SUMA_MULTIPLE

    12

    0000 13 SUMARA:

    0000 7800 F 14 MOV R0,#DIR_DATOS_B ; Se definen datos inicializados

    0002 7900 F 15 MOV R1,#DIR_DATOS_A ; en programa externo

    0004 7B00 F 16 MOV R3,#CANT_DATOS

    0006 C2D7 17 CLR CY

    0008 18 CONT:

    0008 E6 19 MOV A,@R0

    0009 37 20 ADDC A,@R1

    000A F7 21 MOV @R1,A

    000B 08 22 INC R0

    000C 09 23 INC R1

    000D DBF9 24 DJNZ R3,CONT

    000F 22 25 RET

    26 END

    SYMBOL TABLE LISTING

    ------ ----- -------

    N A M E 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

    -----------------------------------------------------

    * * * * * * * D A T A M E M O R Y * * * * * * *

    REG 0000H 0008H ABSOLUTE "REG BANK 0"

    0008H 0048H *** GAP ***

  • Fundamentos del lenguaje ensamblador

    251

    DATA 0050H 000AH ABSOLUTE

    * * * * * * * C O D E M E M O R Y * * * * * * *

    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)

  • Fundamentos del lenguaje ensamblador

    252

    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 *

    ;****************************************************************

  • Fundamentos del lenguaje ensamblador

    253

    ;*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:

  • Fundamentos del lenguaje ensamblador

    254

    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:

    1 0 1 0

    XOR 1 1 0 0

    -----------

    0 1 1 0

    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 X X X X X X X X

    XOR 0 0 1 0 0 0 1 0

    -----------------------

    RESULTADO X X XcX X X X

    cX

    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.

  • Fundamentos del lenguaje ensamblador

    255

    (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

  • Fundamentos del lenguaje ensamblador

    256

    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:

  • Fundamentos del lenguaje ensamblador

    257

    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 LSByte

    00101100 10010000

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

    resultado:

  • Fundamentos del lenguaje ensamblador

    258

    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 LSByte

    01001001 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

  • Fundamentos del lenguaje ensamblador

    259

    00000010 11001001 713

    +00001000 10100101 +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

  • Fundamentos del lenguaje ensamblador

    260

    ;==========================================================

    ;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 ;SE OBTIENE SUMANDO

    addc A,@R0 ; SE ADICIONA COSUMANDO CON ACARREO

    mov @R0,A ;RESULTADO EN DIRECCION DE R0

    inc R1

    inc R0 ;PROXIMO DATO DE 8 BITS

    djnz B,PROX_BYTE ;CONTROL DE NMERO DE BYTES DE OPERANDOS

    jnc FIN

    mov A,#01H ; SE GARANTIZA POSIBLE ULTIMO ACARREO

    add A,@R0

    mov @R0,A

    FIN: ret

    End

    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

  • Fundamentos del lenguaje ensamblador

    261

    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.

  • Fundamentos del lenguaje ensamblador

    262

    ; 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

  • Fundamentos del lenguaje ensamblador

    263

    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.

    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

    .....

    C

    ..... ..... .....

    C

    .....

    C

    ..... ..... .....

    C

  • Fundamentos del lenguaje ensamblador

    264

    ;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

  • Fundamentos del lenguaje ensamblador

    265

    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

  • Fundamentos del lenguaje ensamblador

    266

    ret

    NOIGUAL:jc MAYOR1

    mov A,#01H ;NUM. 1NUM. 2

    ret

    END

    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

  • Fundamentos del lenguaje ensamblador

    267

    ;=============================================================================

    ;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:

  • Fundamentos del lenguaje ensamblador

    268

    ;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; Direccin del byte menos significativo

    CANT_BYTES EQU 04H; 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

  • Fundamentos del lenguaje ensamblador

    269

    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

  • Fundamentos del lenguaje ensamblador

    270

    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

  • Fundamentos del lenguaje ensamblador

    271

    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

    ;=============================================================================

  • Fundamentos del lenguaje ensamblador

    272

    ;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.

  • Fundamentos del lenguaje ensamblador

    273

    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

  • Fundamentos del lenguaje ensamblador

    274

    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