MPASM, el ensamblador de Microchip
Debido a la flexibilidad del IDE de Microchip, MPLAB, tenemos la posibilidad de programar en lenguajes como "C" o "Basic". Pero lo cierto es que con el ensamblador tenemos un codigo puro y compacto. El ensamblador de Microchip que viene con MPLAB es el MPASM.
El paquete MPASM (Microchip MPASM Toolsuite) de MPLAB IDE v6.60 esta formado por:
- MPASM Assembler (mpasmwin.exe)
- MPLINK Object Linker (mplink.exe)
- MPLIB Librtarian (mplib.exe)
MPASM nos permite escribir el codigo y ensamblarlo para producir como salida un fichero .HEX que luego grabaremos en el PIC o que nos servirá para utilizarlo con el simulador que incorpora MPLAB, en otros programas como PROTEUS o por ejemplo en emuladores de PIC.
Con MPASM podemos producir un fichero .HEX a partir de un único archivo ASM con código simple/absoluto o bien podemos generar un archivo .HEX a partir de la unión de distintos codigos objeto y otros módulos ensamblados y/o compilados. En este caso la herramienta de la que dispone MPLAB para "unir" esos módulos se llama MPLINK. También podemos generar módulos objeto para luego ensamblarlos con otros y asi producir un unico archivo .HEX. Otra posibilidad es crear librerías por medio de MPLIB. Las librerias son una coleccion de códigos objeto listos para ser utilizados y que se almacenan todos juntos en un unico archivo con extension .LIB.
Para mas información ver MPASM, MPLINK, MPLIB User's Guide o información actualizada en Microchip.
Generación de código
Como antes hemos avanzado el ensamblador MPASM puede usarse de dos maneras:
- Para generar código absoluto que puede ser ejecutado directamente por un microcontrolador.
- Para generar código relocalizable que puede unirse separadamente con otros módulos ensamblados o compilados.
Generando código absoluto
La generación de código absoluto es el modo definido por defecto del ensamblador MPASM. Este proceso se muestra a continuación:
Cuando un archivo fuente se ensambla de esta manera, todas las variables y rutinas utilizadas en el el archivo fuente deben definirse dentro de este, o en archivos explícitamente incluidos por el archivo fuente. Si el ensamblado se realiza sin errores, se generará un archivo hexadecimal .HEX que contiene el código máquina ejecutable para el dispositivo designado. Este archivo puede utilizarse con un simulador para probar la ejecución del código o cargarse en el microcontrolador mediante un programador.
Generando código relocalizable
El ensamblador MPASM también puede generar módulos objeto relocalizables que pueden unirse (linkarse) con otros módulos utilizándo MPLINK para conformar código ejecutable final. Este método es muy útil para crear módulos reutilizables.
Pueden agruparse módulos relacionados y pueden guardarse juntos en una librería mediante MPLIB..
Archivos de entrada/salida
Éstas son las extensiones de archivo predefinidas utilizadas por el ensamblador y su función.
- Archivos de entrada:
- Código fuente (.asm): Archivo fuente de entrada al ensamblador.
- Archivo include (.inc): Archivo de inclusión o cabecera.
- Archivos de salida:
- Archivo de listado (.lst): Archivo del listado generado por el ensamblador.
- Archivo de error (.err): Archivo de errores de ensamblado.
- Archivo hexadecimal (.hex, .hxl, .hxh): Archivo hexadecimal con código ejecutable.
- Archivo de referencias cruzadas (.xrf): Archivo para las referencia cruzadas de los archivos ensamblados.
- Archivo de símbolos y depuración (.cod).
- Archivo objeto (.o).
Código fuente (.asm)
El ensamblador es un lenguaje de programación para desarrollar código fuente en una aplicación con PIC. El archivo de código fuente puede crearse y editarse con cualquier editor de texto ASCII. Para mas información ver El lenguaje ensamblador del PIC16F84A
El código fuente debe seguir las siguientes pautas básicas:
Cada línea del archivo fuente puede contener cuatro tipos de información:
- Etiquetas
- Operación, Mnemónicos (intrucciones), Directivas y Macros
- Operandos
- Comentarios
El orden y posición de éstos es importantes. Para facilitar la depuración, se recomienda que la etiqueta se coloque en la primera columna y que los mnemónicos se coloquen una o dos columnas más allá. Los operandos siguen al código mnemotécnico. Los comentarios pueden seguir a los operandos, mnemónicos o etiquetas, y pueden comenzar en cualquier columna. La anchura de columna máxima es de 255 carácteres.
Un espacio en blanco debe separar la etiqueta del código mnemotécnico, y también un espacio en blanco deba separar el código mnemotécnico y los operandos. Los operandos múltiples deben separarse por comas.
Se considera como un espacio en blanco uno o más espacios o tabulaciones. El espacio en blanco se utiliza para separar las partes de una línea del código fuente. El espacio en blanco debe utilizarse para hacer el código más fácil de leer. Cualquier número de espacios en blanco o tabulaciones son exactamente igual que uno.
Etiquetas
Una etiqueta se usa para representar una línea o grupo de código, o un valor constante. Se necesitan para las instrucciones de salto.
Las etiquetas deben empezar en la columna 1. Pueden terminar en "dos puntos" (:), espacio, tabulación o fín de línea. Las etiquetas deben comenzar por un carácter alfabético o por un guión bajo (_) y puede contener carácteres alfanuméricos, guión bajo (_) y el signo de interrogación (?).
Las etiquetas no deben:
- Comenzar por dos guiones bajos, ejem., __config.
- Comenzar por un guión bajo y un número, ejem., _2NDLOOP.
- Ser palabras reservadas del ensamblador (ver Section 3.3 “Reserved Words and Section Names” de MPASM, MPLINK, MPLIB User's Guide).
Las etiquetas pueden tener como mucho 32 carácteres. Por defecto se distinguen mayúsculas y minúsculas, pero esto puede anularse con la opción en línea de comandos (/c). Si se utiliza "dos puntos" (:) al definir una etiqueta, se le trata como un operador de la etiqueta y no como parte de la propia etiqueta.
Mnemónicos, directivas y macros
Los mnemónicos le dicen al ensamblador qué instrucciones de código máquina (códigos de operación) deben utilizarse. Por ejemplo, suma (add), ir a (goto) o movimientos (movwf). A diferencia de las etiquetas que creamos nosotros mismos, los mnemónicos los proporciona el lenguaje ensamblador que se utilice. Los mnemónicos no son en ningún caso sensibles a mayúsculas/minúsculas.
Las directivas son órdenes del ensamblador que aparecen en el código fuente pero que normalmente no son traducidas directamente a códigos de operación. Se utilizan para controlar al ensamblador: sus entradas, salidas y asignación de datos. Las directives no son en ningún caso sensibles a mayúsculas/minúsculas.
Las macros son conjuntos de instrucciones y directivas definidas por el usuario que se insertarán en el código fuente al realizar el ensamblado siempre que la macro se invoque (ver directiva macro).
Los mnemónicos de las instrucciones del ensamblador, las directivas y las llamadas a macros deben colocarse de la segunda columna en adelante. Si hay una etiqueta en la misma línea, las instrucciones deben separarse de esa etiqueta por "dos puntos", o por uno o más espacios o tabulaciones.
Operandos
Los operandos dan información a la instrucción sobre los datos que deben utilizarse y donde se encuentran. Los operandos debe separarse de los mnemónicos por uno o más espacios, o tabulaciones. Los operandos múltiples deben separarse por comas.
Comentarios
Los comentarios son texto que explica el funcionamiento de una línea o líneas de código. El ensamblador MPASM trata lo que esté después de un punto y coma como un comentario. Todos los carácteres que siguen al punto y coma se ignoran hasta el final de la línea. Las constantes del cadena que contienen un punto y coma se permiten y no se confunden con comentarios.
Archivo include (.inc)
Un archivo "include" o cabecera (header) es cualquier archivo que contenga código ensamblador válido. Normalmente, el archivo contiene equivalencias sobre registros específicos del dispositivo a utilizar y asignaciones de bits. Este archivo puede ser “incluido” en el código para que pueda ser reutilizado por muchos programas.
Como ejemplo, para añadir el archivo de cabecera para el dispositivo PIC18F452 en el código ensamblador de nuestro programa, pondremos:
#include p18f452.inc
Este tipo de archivos de cabecera los proporciona Microchip y se encuentran en el directorio de instalación de MPASM o de MPLAB.
Podemos crear nuestros propios archivos de cabecera o utilizar otros desarrollados por terceros.
Archivo de listado (.lst)
El archivo de listado que genera MPASM proporciona la correspondencia entre código fuente y código objeto, como puede verse en este fragmento de archivo .LST:
LOC OBJECT CODE LINE SOURCE TEXT VALUE 001C 3A03 00065 XORLW 0x03 001D 1903 00066 BTFSC STATUS,2
Analicemos la línea:
001C 3A03 00065 XORLW 0x03
La primera columna, 001Ch, 28d, es la dirección de la memoria de programa donde se encuentra el dato 3A03h, 11101000000011b, de la segunda columna. Estas dos columnas conforman el código objeto. La tercera columna indica el número de línea de texto del código fuente , XORLW es el mnemónico de la instrucción y 0x03, 3h, el operando. El dato que se grabará en la memoria de programa, 3A03h, 11101000000011b tiene 14 bits, la longitud de la memoria de programa, el mnemónico XORLW equivale a "111010 kkkkkkkk", donde k es el valor literal sobre el que actuará XORLW, justamente 03h, esto es 00000011b, y nos queda:
111010b (XORLW) + 0x03(00000011b) = 11101000000011b, que es 3A03h.
El archivo de listado también proporciona una lista de símbolos y sus valores, información sobre el uso de la memoria y el número de errores, advertencias y mensajes generados.
Aparece una información del tipo:
Program Memory Words Used: 782 Program Memory Words Free: 242
Que nos indica la cantidad de memoria de programa utilizada y libre, en palabras de 14 bits.
Este archivo puede verse en MPLAB IDE siguiendo estos pasos:
MPASM y MPLINK (y en consecuencia MPLAB) pueden generar archivos de listado. Los archivos de listado generados se encuentran en el mismo directorio que el resto de archivos que se generan (.HEX, .ERR, etc), normalmente donde se encuentre el .ASM. Puede abrirse con cualquier editor de texto ASCII.
Archivo de error (.err)
El ensamblador MPASM, por defecto, genera un archivo del error. Este archivo puede ser útil cuando estamos poniendo a punto el código de nuestro programa. MPLAB mostrará la información del error en la ventana Output. El formato de los mensajes en el archivo de error es:
type[number] línea de descripción de archivo
Por ejemplo:
Error[113] C:\PROG.ASM 7 : Symbol not previously defined (start)El archivo del error puede contener cualquier número de errores, advertencias y mensajes del ensamblador MPASM. Para mas información, ver Chapter 8. “Errors, Warnings, Messages, and Limitations” en MPASM, MPLINK, MPLIB User's Guide
Archivo hexadecimal (.hex, .hxl, .hxh)
El archivo hexadecimal es, por así decirlo, el archivo que contiene el ejecutable para el microcontrolador. La información que contiene se transferirá a PIC cuando se programe. La información que contiene está en formato ASCII, no en binario como podría pensarse, de manera que se representan los valores hexadecimales con carácteres alfanuméricos, 3FFA, 0023, etc.
MPASM y MPLINK son capaces de generar archivos de texto ASCII en hexadecimal en diferentes formatos. Esto es util para transferir el programa a distintos tipos programadores.
Nombre de formato | Tipo de formato | Extensión de archivo | Uso |
Intel Hex Format | INHX8M | .hex | programadores para dispositivos de 8 bit |
Intel Hex 32 Format | INHX32 | .hex | programadores para dispositivos de 16 bit |
Intel Split Hex Format | INHX8S | .hxl, .hxh | otros programadores |
Formato INTEL hexadecimal de 8 bits
Nos centraremos en este formato por ser el mas común.
Este formato produce un archivo hexadecimal de 8 bit con la combinación byte bajo / byte alto. De esta manera cada dirección puede contener sólo 8 bits en este formato por lo que todas las direcciones se doblan.
Cada registro de datos (cada línea) comienza con un prefijo de 9 caracteres y acaba con 2 caracteres de checksum.
Cada registro de datos tiene el formato siguiente:
:BBAAAATTHHHH... .HHHCC
donde:
- BB: dos digitos en hexadecimal que representan el número de bytes de datos que aparecen en la línea.
- AAAA: cuatro digitos en hexadecimal que representan la dirección de arranque de los datos del registro.
- TT: dos digitos que siempre serán '00' salvo al final del archivo de datos que serán '01'.
- HH: dos digitos en hexadecimal, con la información en la forma byte bajo / byte alto.
- CC: checksum de dos digitos en hexadecimal son el complemento a dos de la suma de todos bytes precedentes en el registro.
Ejemplo:
Parte de e001.lst: 0000 3007 movlw 0x07 ;Carga primer sumando en W 0001 3E08 addlw 0x08 ;Suma W con segundo sumando 0002 0090 movwf 0x10 ;Almacena el resultado e001.hex completo: :020000040000FA :060000000730083E9000ED :00000001FF Observemos la 2 línea: :060000000730083E9000ED :06000000 06 6 bytes: 07, 30, 08, 3E, 90, 00. 0000 dirección 0 00 al no ser el registro final 730083E9000ED 07 30 es 3007 08 3E es 3E08 90 00 es 0090 ED es el checksum
Ejecutar MPASM
MPASM permite operar a través de una ventana con el botón Built All de MPLAB (ver MPLAB-IDE v6.60) o a través de línea de comandos, siendo el resultado final el mismo, mediante el programa mpasmwin de Microchip.
La línea de comando se compone de de distintos campos, del tipo:
MPASMWIN [/[,/ ....]] [ ]
A continuación se muestra como se ejecuta MPASM según aparece en la ventana Output de MPLAB cuando pulsamos Built All:
mpasmwin.exe /q /p16F84A "jluzpic.asm" /l"jluzpic.lst" /e"jluzpic.err"
También podemos ejecutar el archivo mpasmwin.exe directamente, aparecerá:
Sistemas de numeración
La convención utilizada por MPASM es la siguiente:
Hexadecimal: es la numeración por defecto. Para mayor claridad para el programador se utiliza una letra H al final del número. Por ejemplo: 0100H, 0A0H, 5H, 66h.
Importante: Como ésta es la numeración por defecto hay que tener mucho cuidado al colocar números en decimal. Por ejemplo la instrucción MOVLW 64 no utilizará el número 64 decimal sino el 100 decimal (64 hex = 100 dec)
Binario: Para escribir números en binario utilizar B'xxxxxxxx' (utilizar comillas simples). Por ejemplo: B'10011001' , b'01110000'.
Decimal: podemos utilizar la forma D'120' (también con comillas simples) o la forma corta anteponiendo un punto al número decimal. Esta es la forma utilizada en todos los programas realizados por Microchip. Por ejemplo: D'112' d'10' .200 .100
Tener en cuenta siempre el tamaño de datos con el que se está trabajando. En la mayoría de los casos, se utilizará un número para almacenarlo en el acumulador y éste es de 8 bits. Por lo tanto el número utilizado no debe exeder de 255 decimal o FF hexadecimal.
Tipo | Sintaxis | Ejemplo | Comentario |
Decimal | D'' | D'100' | D puede ser minúscula |
. | .100 | ||
Hexadecimal | H'' | H'64' | H puede ser minúscula |
0x | 0x64 | ||
64 | Por defecto | ||
Octal | O'' | O'144' | O puede ser minúscula |
Binario | B'' | B'01100100' | B puede ser minúscula |
ASCII | A'' | A'C' | A puede ser minúscula |
'' | 'C' |
Directivas de MPASM
Las directivas son "indicaciones" para el ensamblador que le dicen cómo hacer algunas cosas, y sirven para ayudarnos en la tarea de programar. MPASM ofrece bastantes directivas, las cuales se escriben dentro del código fuente. Por eso no hay que confundir las directivas con las instrucciones del PIC.
Los tipos de directivas son:
- Directivas de control.
- Directivas de datos.
- Directivas de listado.
- Directivas de macros.
- Directivas de ficheros objeto.
Las directivas de control, permiten un ensamblado condicional.
Las directivas de datos, son todas aquellas que permiten la manipulación simbólica y el posicionamiento en memoria.
La directiva de listado permiten todo el control sobre el formato, paginacion y listado del programa.
La directivas de macros, permiten todas las gestiones de las macros.
Las directivas de fichero objeto, solo se utilizan para la creacion de ficheros objeto o reubicables/reusables para luego enlazar con el MPLINK.
Las directivas se vieron en el tema ensamblador.htm explicando algunas. A continuación se muestra un resumen de las directivas mas importantes, ordenadas por tipo. Todas las directivas pueden verse en el tema Directivas de MPASM
Resumen directivas del ensamblador MPASM
Directivas para carga o reserva en la Memoria de Programa | |
DATA | Inicializa una o más palabras de la memoria de programa con datos o cadenas de caracteres DATA 0x012, 0x1345 DATA "Prueba 1,2,3" |
DA | Almacena en paquetes de 14 bits dos caracteres ASCIIrepresentados con 7 bits DA "abcdef" |
DB | Reserva e inicializa bytes en la memoria de programa DB 'T', 0xF0, 'S' |
DW | Reserva e inicializa palabras en la memoria de programa DW 0x39, 0x45B |
DT | Genera una serie de instrucciones RETLW, una por cada expresiónque acompaña a la directiva DT 1, 2, 3, 5, 7 |
DE | Reserva y carga posiciones de la memoria de programa con bytes, en principio estaba pensada para rellenar la EEPROM de datos (empieza en la 0x2100), pero se puede emplear para cualquier posición de memoria de programa ORG 0x2100 DE "Programa version 1.0" |
FILL | Rellena un número de posiciones de memoria de programa con unmismo contenido (dato o instrucción si va entre paréntesis) FILL 0x190F, 5 |
RES | Reserva un determinado número de posiciones de la memoria deprograma (avanza el puntero de cuenta de posición en la memoria de programa) RES 64 |
__CONFIG | Carga la palabra de configuración del microcontrolador,previamente se debe haber declarado el microcontrolador __CONFIG 0x3F43 |
__IDLOCS | Se emplea para cargar las 4 posiciones de identificación delmicrocontrolador. Se debe haber declarado previamente el microcontrolador __IDLOCS 1234 |
Directivas de Control | |
CBLOCK ENDC | Se emplean para declarar inicio y final de un bloque de constantes. Se asignan valores correlativos CBLOCK 0x20 A, B, C, D ;A = 0x20, B=0x21, C=0x22, D=0x23 ENDC |
CONSTANT EQU | Las dos se emplean para asignar expresiones a símbolos esos símbolos no pueden luego cambiar de valor (son constantes). Sintaxis distinta, pero igual efecto CONSTANT longitud=0x10 longitud EQU 0x10 |
VARIABLE SET | Las dos se emplean para asignar expresiones a símbolos esos símbolos pueden cambiar de valor (son variables). Sintaxis distinta, pero igual efecto VARIABLE BUFFER=0x20 BUFFER SET 0x20 |
#DEFINE | Se emplea para definir una etiqueta para una cadena decaracteres siempre que aparezca la etiqueta, se sustituye directamente por la cadena #DEFINE bit_0 STATUS,RP0 |
#UNDEFINE | Anula una asignación previa realizada con #DEFINE #UNDEFINE bit_0 |
ORG | Sitúa el código que se vaya generando después a partir de la posición especificada ORG 0x100 |
END | Final de código fuente END |
INCLUDE | Se incluye el fichero especificado, se inserta en la posición yserá ensamblado INCLUDE "c:\mplab\P16F84A.INC" INCLUDE |
RADIX | Se especifica el RADIX que se está usando RADIX dec ;pueden ser hex ú oct |
PROCESSOR | Define el tipo de microcontrolador PROCESSOR 16F84A |
Para controlar la generación del fichero de listado (.LST): | |
TITLE | Título en la cabecera de las páginas |
SUBTITLE | Subtítulo (segunda línea) en cabecera |
SPACE | Inserta líneas en blanco |
PAGE | Inserta salto de página |
LIST | Habilita listado y opciones del mismo |
NOLIST | Deshabilita generación en fichero .LST |
MESSG | Saca mensajes en el fichero .LST |
ERROR | También para sacar mensajes en .LST |
ERRORLEVEL | Especifica tipos de mensajes que aparecerán en fichero.LST ERRORLEVEL 0 ;Errores, warnings y mensajes ERRORLEVEL 1 ;Warnings y errores ERRORLEVEL 2 ;Errores |
Directivas de Ensamblado condicional | |
IF ELSE ENDIF | Grupo de directivas para ensamblar instrucciones si es cierta o no una expresión IF versión==1 MOVLW 0x0A ;Esto se ensambla si expresión es cierta o distinta de 0 MOVWF PORTB ENDIF IF expresión ;Si la expresión es cierta se ensambla este grupo Grupo 1 de Directivas e Instrucciones ELSE ;y si es falsa, este otro Grupo 2 de Directivas e Instrucciones ENDIF |
IFDEF | Puede sustituir a la IF. Se ensambla si está definida la etiqueta #DEFINE DE_B_a_A 1 IFDEF DE_B_a_A MOVF PORTB,w MOVWF PORTA ELSE MOVF PORTA,W MOVWF PORTB ENDIF |
IFNDEF | Puede sustituir a las dos directivas anteriores IF e IFDEF. Se ensambla si no está definida la etiqueta |
WHILE ENDW | Grupo de instrucciones y directivas que se ensamblan mientras la expresión sea cierta VARIABLE i i=0 WHILE i < CONTADOR RETLW i i+=1 ENDW |
Macros | |
MACRO EXITM ENDM | Una macro es un conjunto de instrucciones que pueden ser insertadas en el código fuente mediante una simple llamada a macro. Una macro debe ser definida primero antes de poder ser llamada en elcódigo fuente siguiente. Una macro puede llamar a otra macro o a sí misma de manera recursiva Definición de una macro: Etiqueta MACRO argumento1, arguento2, argumento3, ... Conjunto de Instrucciones EXITM (salida intermedia opcional) Más instrucciones ENDM Utilización de una macro: Definiciones: Banco_0 MACRO bcf STATUS,RP0 bcf STATUS,RP1 ENDM Banco_1 MACRO bsf STATUS,RP0 bcf STATUS,RP1 ENDM Utilización: movlw 0xF0 Banco_1 movwf TRISB Banco_0 |
No hay comentarios:
Publicar un comentario