ENSAMBLADOR
MC. Juan Gilberto Mateos Suárez 
 

1. INTRODUCCIÓN

Los ensambladores son programas que procesan los enunciados del programa origen en lenguaje ensamblador y los traducen en archivos en lenguaje máquina que son ejecutados por un microprocesador o un microcontrolador.
Los ensambladores permiten que los programas origen se escriban y se editen en una computadora para generar un código ejecutable en otra computadora. El archivo en lenguaje objeto ejecutable resultante se carga y se ejecuta en el sistema destino.


2. LENGUAJE ENSAMBLADOR

El lenguaje simbólico que se utiliza para codificar los programas origen que se procesan por el ensamblador es llamado lenguaje ensamblador.

Este lenguaje es una colección de símbolos mnemónicos que representan: operaciones (mnemónicos de instrucciones para la máquina o de directrices para el ensamblador), nombres simbólicos, operadores y símbolos especiales.

El lenguaje ensamblador proporciona códigos de operación de los mnemónicos para todas las instrucciones de la máquina contenidas en la lista de instrucciones.

Además, el lenguaje ensamblador contiene mnemónicos directrices, los cuales especifican acciones auxiliares que se llevan a cabo por el ensamblador.

Estas directrices no siempre son traducidas a lenguaje maquina.

Un programador escribe el programa origen en lenguaje ensamblador utilizando cualquier editor de textos o procesador de palabras que sea capaz de producir una salida de texto en ASCII.

Una vez que el código origen ha sido escrito, el archivo origen es ensamblado mediante su procesamiento a través de algún ensamblador.


3. PROCESAMIENTO DE ENSAMBLADO

Este ensamblador es de dos pasadas.

Durante la primer pasada, el programa origen se lee para desarrollar la tabla de símbolos.

Durante la segunda pasada el archivo objeto se crea (ensamblado) con referencia a la tabla desarrollada en la primer pasada.

Durante la segunda pasada se crea el listado del programa origen.

Cada enunciado origen se procesa completamente antes de que el enunciado siguiente se lea.

A medida que el enunciado se procesa el ensamblador examina los campos de etiqueta, de código de operación y de operandos.

La tabla de códigos de operación se revisa para encontrar un código operacional similar.

Durante el procesamiento de un mnemónico correspondiente a un código de operación normal, el código máquina normal se inserta en el archivo objetivo.

La acción buscada por una directriz del ensamblador ocurre durante el procesamiento de dicha directriz.

Cualquier error que detecta el ensamblador se muestra justamente antes de la línea que contiene dicho error.

Aún y cuando no se desee producir un listado origen, los errores se despliegan para indicar que el procesamiento de ensamblado no se llevó a cabo de manera normal.


PROGRAMAS EN LENGUAJE ENSAMBLADOR 

1. INTRODUCCIÓN

Los programas escritos en lenguaje ensamblador consisten de una secuencia de enunciados origen.

Cada enunciado origen se compone de una secuencia de caracteres ASCII que terminan con un retorno (ENTER).

El apéndice A contiene un listado de los caracteres disponibles.


2. FORMATO DE LOS ENUNCIADOS ORIGEN

Cada enunciado origen puede contener hasta cuatro campos: una etiqueta o " * " para una línea de comentario, una operación (ya sea el mnemónico de una instrucción o una directriz para el ensamblador), un operando y un comentario.


2.1 Campo de Etiquetas


El campo de etiquetas aparece como el primer campo dentro de un enunciado origen. El campo de etiquetas puede adoptar cualquiera de las siguientes formas:

  1. Un asterisco ( * ) como el primer carácter en el campo de etiquetas indica que el resto del enunciado origen es un comentario. Los comentarios son ignorados por el ensamblador e impresos en el listado origen solamente como información de programación.
  2. Un espacio de carácter en blanco (TAB o espacio) como primer carácter indica que el campo de etiquetas se encuentra vacío. La línea no tiene una etiqueta y no es un comentario.
  3. Un símbolo como primer carácter indica que la línea tiene etiqueta. Estos símbolos son las letras mayúsculas y minúsculas ( a - z ), los dígitos ( 0 - 9 ) y caracteres especiales como punto ( . ), signo de pesos ( $ ) y subrayado ( _ ). Estos símbolos consisten de uno a quince caracteres, el primero de los cuales debe ser alfabético o un carácter especial punto o subrayado. Todos los caracteres son significantes y las mayúsculas y minúsculas son distintas.
 Un símbolo puede aparecer solamente una vez en el campo de etiquetas.

Si un símbolo aparece más de una vez en el campo de etiquetas, toda referencia a dicho símbolo será marcada como error.

Con la excepción de algunas directrices a la etiqueta se le asigna el valor del contador de programa ( PC ) del primer byte de la instrucción o dato que se esté ensamblando.

El valor asignado a la etiqueta es absoluto.

De manera opcional, las etiquetas pueden ser terminadas con el símbolo de dos puntos ( : ).

Si dicho símbolo es utilizado, no formará parte de la etiqueta, simplemente servirá como separación entre la etiqueta y el resto del enunciado origen.

De esta forma, los siguientes fragmentos son equivalentes:

salta: deca salta deca                             bne salta bne salta

Una etiqueta puede aparecer por si sola en una línea. El ensamblador interpreta esto como "establece el valor de la etiqueta igual al valor actual del contador de programa ( PC )".



2.2 Campo de Operaciones

El campo de operaciones aparece después del campo de etiquetas y debe de estar precedido por al menos un espacio en blanco.

El campo de operaciones debe de contener el mnemónico de un código de operación legal o una directriz del ensamblador.

En este campo, los caracteres en mayúsculas son convertidos en minúsculas antes de ser revisados como un mnemónico legal.

Debido a esto " nop ", " NOP " y " NoP " son reconocidos como el mismo mnemónico.

Los símbolos que aparecen en este campo pueden ser de uno de dos tipos.



I. Código de Operación.

Estos símbolos corresponden directamente a instrucciones de máquina.

El código de operación incluye a cualquier nombre e registro asociado con la instrucción.

Estos nombres de registros no deben de estar separados del código de operación por ningún espacio en blanco.

De esta forma, " clra " significa " limpia (poner en ceros) el acumulador ( A ) ", pero " lr a " significa " limpia la localidad de memoria identificada por la etiqueta a ".
 



II. Directriz.

Estos son códigos de operación especiales conocidos por el ensamblador, los cuales más bien controlan el proceso de ensamblado en vez de ser traducidos a instrucciones máquina.
 


2.3 Campo de Operandos

La interpretación del campo de operandos depende del contenido del campo de operaciones.

El campo de operandos, si se requiere, debe de seguir al campo de operaciones y debe de estar precedido por al menos un espacio en blanco.

El campo de operandos puede contener un símbolo, una expresión o una combinación de símbolos y expresiones separados por comas.

El campo de operandos de una instrucción máquina es utilizada para especificar el modo de direccionamiento de la instrucción, así como el operando de la instrucción.

La siguiente tabla resume los diferentes formatos del campo de operandos para la familia HC11.
 



2.3.1 Sintaxis de Operandos para M68HC11

Para la familia de dispositivos mC´s de la familia M68HC11 se utilizan los siguientes formatos de operandos:
 
Formatos de Operandos Modo de Direccionamiento
sin operando Acumulador e Inherente
< expresión  Directo, Extendido o Relativo
# < expresión  Inmediato
< expresión , X Indexado con el registro X
< expresión , Y Indexado con el registro Y
< expresión < expresión  Set o Clear Bit
< expresión < expresión < expresión  Prueba Bit y Bifurca
 
En este caso, los operandos de las instrucciones de manipulación de bits están separados por espacios ya que el HC11 permite las instrucciones de manipulación de bits en direcciones indexadas.

Debido a esto, ‘ X ’ o ‘ Y ‘ pueden ser agregados a la primer expresión en los últimos dos formatos arriba mostrados para formar el cálculo de la dirección indexada efectiva.
 



2.3.2 Expresiones

Una expresión es una combinación de símbolos constantes, operadores algebraicos y paréntesis. La expresión especifica un valor, el cual será utilizado como operando.

Las expresiones pueden consistir de símbolos, constantes o del caracter ‘ * ‘ (denotando el valor actual del contador de programa PC) unidos entre sí por alguno de los operadores: +, -, *, /, %, &, I, ^.

 



2.3.3 Operadores

Los operadores son iguales a los utilizados en el lenguaje de programación C:

Las expresiones son evaluadas de izquierda a derecha y las expresiones con paréntesis no están previstas. La aritmética es realizada con precisión de enteros en complemento a dos con signo.

 



2.3.4 Símbolos

Cada símbolo se encuentra asociado con un valor entero de 16 bits, el cual es utilizado en lugar del símbolo durante la evaluación de la expresión.

El asterisco (*) utilizado en una expresión como símbolo representa el valor actual del contador de localidades (el primer byte de una instrucción de varios bytes ).

 



2.3.5 Constantes

Las constantes representan cantidades de información que no varían en su valor durante la ejecución del programa.

Las constantes pueden ser presentadas al ensamblador en uno de cinco posibles formatos: decimal, hexadecimal, binario, octal o ASCII.

El programador le indica al ensamblador el formato del número con los siguientes prefijos:
 

Las constantes sin prefijo son interpretadas como decimal.

El ensamblador convierte todas las constantes a código máquina binario y son desplegadas en el listado del ensamblado como valores hexadecimales.

 



2.4 Campo de Comentarios

El último campo de un enunciado origen del ensamblador es el campo de comentarios.

Este campo es opcional y solamente es impreso en el listado origen con propósitos de documentación.

El campo de comentarios es separado del campo de los operandos (o del campo de operaciones sino se requiere operando) por al menos un espacio en blanco.

El campo de comentarios puede contener cualquier carácter imprimible ASCII.

 



3. SALIDA DEL ENSAMBLADOR

La salida del ensamblador incluye un listado opcional del programa origen y un archivo objeto, el cual se encuentra en el formato de Archivo S de Motorola.

El ensamblador normalmente suprime la impresión del listado origen, pero esta condición y otras pueden ser alteradas a través de diferentes opciones proporcionadas en la línea de comando que invoca al ensamblador.

Cada línea del listado contiene un número de línea de referencia, la dirección y los bytes ensamblados y el enunciado origen.

Opcionalmente, el listado del ensamblado puede contener una tabla de símbolos y otra de la aparición de estas en el programa.

Estas tablas siempre son impresas al final del listado de ensamblado.

 


FUNCIONAMIENTO DEL ENSAMBLADOR
1. INTRODUCCIÓN
Los programas ensambladores de Motorola, del dominio público se nombran "as*.exe", donde * se refiere al tipo de familia.
Por lo tanto para correr el ensamblador de la familia M68HC11 se utiliza el comando "as11.exe".
 


2. INVOCACIÓN DEL ENSAMBLADOR

Para correr el ensamblador del HC11 introdúzcase la siguiente línea de comando:

as11 archivo1 (archivo2 . . . ) ( - opción1 opción2 . . . )

Donde archivo1, archivo2, etc, son los nombres de los archivos origen que se desean ensamblar. Los archivos origen pueden tener extensiones en su nombre, pero el ensamblador no verifica si existe alguna extensión en particular (sin embargo, no se utilice la extensión .s19, ya que ésta es la extensión del archivo objeto producido por el ensamblador. Al crearse dicho archivo objeto se perdería el archivo origen, ya que sería sobre escrito en el disco).

Las opciones son uno o más de las siguientes:

Utilice un espacio en blanco antes del signo menos (-) que precede a la opción, esto con el objetivo de separar la opción del último nombre de archivo.

Estas opciones también pueden ser indicadas al ensamblador mediante el uso de la directriz OPT en el archivo origen.

El archivo objeto creado es escrito en el disco y se le da el nombre " nombre archivo.s19 ", donde ‘ nombre archivo ’ es el primer archivo origen indicado en la línea de comando.

Cualquier error y el listado opcional (si se especificó) son desplegados en la pantalla.

El listado y/o los mensajes de error pueden ser salvados en un archivo para su posterior examinación o impresión, esto se logra mediante un comando de redireccionamiento de E/S en la línea de comando.

En la PC, la redirección de E/S se indica con el símbolo mayor que ( ), seguido de un nombre de archivo nuevo o existente.

 



3. MENSAJES DE ERROR

Los mensajes de diagnóstico de error son colocados en el archivo de listado justo antes de la línea que contenga el error. El formato de la línea de error es:

Línea_número: Descripción del error o
Línea_número: Peligro - - - Descripción del error

Los errores en la primer pasada ocasionan la cancelación de la segunda pasada.

Un mensaje de error del tipo ‘peligro’ no ocasiona la cancelación de la segunda pasada, pero indica un posible problema.

Los mensajes de error están diseñados para ser explicados por sí mismos.

 


DIRECTRICES DEL ENSAMBLADOR
1. INTRODUCCIÓN
Las directrices del ensamblador son instrucciones para el ensamblador mismo en vez de ser instrucciones a ser traducidas directamente en el código objeto.

A continuación se muestran las directrices reconocidas por los ensambladores como válidas, se explican con más detalle las más usuales.

La notación utilizada para describirlas es la siguiente:
 

Todos los elementos fuera de estos símbolos deberán de ser especificados tal como se indica.
 


BSZ ( BLOCK STORAGE OF ZEROS )

( < etiqueta ) BSZ < expresión ( < comentario )
La directriz BSZ ( y ZMB ) ocasionan que el ensamblador asigne un bloque de bytes y a cada byte se le asigna el valor inicial de cero.

 



EQU ( EQUATE SYMBOL TO A VALUE )

< etiqueta EQU < expresión ( < comentario )
La directriz EQU asigna el valor (otro que no sea el valor del contador de programa) de la expresión en el campo de operandos a la etiqueta. La etiqueta no puede ser redefinida en ninguna otra parte del programa. La expresión no puede contener referencias posteriores o símbolos no definidos. Las igualdades (EQU) con referencias posteriores son señalados como errores de fase ( Phasing Errors ).

 



FCB ( FORM CONSTANT BYTE )

( < etiqueta ) FCB < exp ( , < exp , . . . , < exp ) ( < comentario )
Esta directriz ocasiona que el valor del operando sea almacenado en un solo byte del programa objeto.

 



FCC ( FORM CONSTANT CHARACTER STRING )

( < etiqueta ) FCC < delimitador < cadena < delimitador ( < coment )
Esta directriz se utiliza para almacenar una cadena de caracteres ASCII en bytes consecutivos de memoria.

 



FDB ( FORM DOUBLE BYTE CONSTANT )

Misma sintaxis que FCB
El valor del operando es almacenado en dos bytes consecutivos del programa objeto.

 



FILL ( FILL MEMORY )

( < etiqueta ) FILL < expresión , < expresión
Ocasiona que el ensamblador inicialice un área de memoria con un valor constante. La primera expresión indica el valor constante y la segunda es el número de bytes a ser inicializados.

 



OPT ( ASSEMBLER OUTPUT OPTIONS )

OPT < opción ( , < opción , . . . , < opción ) ( < comentario )
La directriz OPT es utilizada para controlar el formato de la salida producida por el ensamblador. Las opciones especificadas por medio de esta directriz tienen jerarquía sobre aquellas invocadas en la línea de comando del ensamblador. Todas las opciones deberán introducirse en letras minúsculas.

 



ORG ( SET PROGRAM COUNTER TO ORIGIN )

ORG < expresión ( < comentario )
Esta directriz cambia el valor del contador de programa al valor especificado por la expresión. Todos los enunciados siguientes son ensamblados en localidades de memoria posteriores, empezando en el nuevo valor del PC. Si esta directriz no aparece, el PC es inicializado a un valor de cero.

 



PAGE ( TOP OF PAGE )

PAGE
Ocasiona que el ensamblador avance el papel al principio de la siguiente hoja. Si el listado no se está produciendo, esta directriz no tendrá efecto.

 



RMB ( RESERVE MEMORY BYTES )

( < etiqueta ) RMB < etiqueta ( < comentario )
Ocasiona que el valor del PC sea avanzado en la cantidad especificada por la expresión.

 



ZMB ( ZERO MEMORY BYTES )

Igual a BSZ.

 


APÉNDICE      A 

FORMATO DEL LISTADO DEL ENSAMBLADOR

El listado del ensamblador tiene el siguiente formato:

LÍNEA# DIR BYTES CÓDIGO OBJETO [ # CICLOS ] LÍNEA ORIGEN

LÍNEA# es un número decimal de 4 dígitos impreso como una referencia para la tabla de aparición de símbolos.

DIR es el valor hexadecimal de la dirección del primer byte del código objeto para esta dirección.

BYTES CÓDIGO OBJETO es el código objeto resultante del ensamblado de la línea origen dado en hexadecimal.

#CÍCLOS solamente aparecerá en el listado si la opción ‘ c ‘ está habilitada. Aparece dentro de corchetes para ayudar a distinguir este valor del resto de la línea origen. La LÍNEA ORIGEN es reimpresa exactamente igual que en el programa fuente, incluyendo las etiquetas.

La tabla de símbolos será impresa cuando la opción ‘ s ‘ sea habilitada. La tabla de símbolos tiene el siguiente formato:

 



SÍMBOLO DIRECCIÓN

El SÍMBOLO es tomado directamente del campo de etiquetas del programa fuente u origen. DIRECCIÓN es la dirección hexadecimal de la localidad a la cual se hace referencia con el símbolo.

La tabla de aparición de símbolos será impresa cuando la opción ‘ cre ‘ sea seleccionada. La tabla de aparición de símbolos tiene el siguiente formato:

 



SÍMBOLO DIRECCIÓN * LOC1 LOC2 LOC3 . . .

SÍMBOLO y DIRECCIÓN son lo mismo antes mencionado. La primera localidad en la lista está marcada con un asterisco ‘ * ‘ para indicar la línea donde el símbolo fue definido. Las LOC’s subsecuentes son el número decimal de línea del listado del ensamblador donde aparecen las etiquetas.