ANEXO 2 MPASM, el ensamblador de Microchip 1 MPASM, el ensamblador de Microchip http://perso.wanadoo.es/pictob/mpasm
Views 254 Downloads 3 File size 279KB
ANEXO 2
MPASM, el ensamblador de Microchip
1
MPASM, el ensamblador de Microchip http://perso.wanadoo.es/pictob/mpasm.htm 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 código 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 código 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 códigos objeto y otros módulos ensamblados y/o compilados. En este caso la herramienta que dispone el MPLAB para "unir" esos módulos se llama MPLINK. También podemos generar módulos objeto para luego ser ensamblados con otros y así producir un único archivo .HEX. Otra posibilidad es crear librerías por medio de MPLIB. Las librerías son una colección de códigos objeto listos para ser utilizados y que se almacenan todos juntos en un único archivo con extensión .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:
2
Cuando un archivo fuente se ensambla de esta manera, todas las variables y rutinas utilizadas en 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 utilizando 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.
3
Archivos de entrada/salida Éstas son las extensiones de archivo predefinidas utilizadas por el ensamblador y su función. a. Archivos de entrada: 1. 2.
Código fuente (.asm): Archivo fuente de entrada al ensamblador. Archivo include (.inc): Archivo de inclusión o cabecera.
b. Archivos de salida: 1. Archivo de listado (.lst): Archivo del listado generado por el ensamblador. 2. Archivo de error (.err): Archivo de errores de ensamblado. 3. Archivo hexadecimal (.hex, .hxl, .hxh): Archivo hexadecimal con código ejecutable. 4. Archivo de referencias cruzadas (.xrf): Archivo para la referencia cruzadas de los archivos ensamblados. 5. Archivo de símbolos y depuración (.cod). 6. Archivo objeto (.o).
a. Archivos de entrada 1. 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 más 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: 4
• • • •
Etiquetas Operación, Mnemónicos (instrucciones), 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 caracteres. Un espacio en blanco debe separar la etiqueta del código mnemotécnico, y también un espacio en blanco debe 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.
5
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 fin de línea. Las etiquetas deben comenzar por un carácter alfabético o por un guión bajo (_) y puede contener caracteres 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 caracteres. 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 directivas 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 deben separarse de los mnemónicos por uno o más espacios, o tabulaciones. Los operandos múltiples deben separarse por comas.
6
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 caracteres que siguen al punto y coma se ignoran hasta el final de la línea. Las constantes de la cadena que contienen un punto y coma se permiten y no se confunden con comentarios.
2. 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 PIC18F877 en el código ensamblador de nuestro programa, pondremos: #include p18f877.inc
Los archivos de cabecera se encuentran en el directorio de instalación de MPASM o de MPLAB.
b. Archivos de salida 1. 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 VALUE 001C 001D
3A03 1903
LINE SOURCE TEXT
00065 00066
XORLW BTFSC
0x03 STATUS,2
00065
XORLW
0x03
Analicemos la línea: 001C
3A03
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.
7
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: Program Memory Words Free:
782 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.
2. 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
3. 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 caracteres alfanuméricos, 3FFA, 0023, etc. MPASM y MPLINK son capaces de generar archivos de texto ASCII en hexadecimal en diferentes formatos. Esto es útil para transferir el programa a distintos tipos programadores. Nombre de formato
Tipo de formato
Intel Hex Format
INHX8M
Extensión Uso de rchivo .hex
programadores para dispositivos de 8 bits
8
Intel Hex 32 Format
INHX32
.hex
Intel Split Hex Format
INHX8S
.hxl, .hxh
programadores para dispositivos de 16 bits otros programadores
Formato INTEL hexadecimal de 8 bits Nos centraremos en este formato por ser el más común. Este formato produce un archivo hexadecimal de 8 bits 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 dígitos en hexadecimal que representan el número de bytes de datos que aparecen en la línea. AAAA: cuatro dígitos en hexadecimal que representan la dirección de arranque de los datos del registro. TT: dos dígitos que siempre serán '00' salvo al final del archivo de datos que serán '01'. HH: dos dígitos en hexadecimal, con la información en la forma byte bajo / byte alto. CC: checksum de dos dígitos en hexadecimal son el complemento a dos de la suma de todos bytes precedentes en el registro.
Ejemplo: Parte de e001.lst: 0000 0001 0002
3007 3E08 0090
movlw addlw movwf
0x07 0x08 0x10
;Carga primer sumando en W ;Suma W con segundo sumando ;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
9
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 [/[,/....]] []
indica a MPASM el archivo a ensamblar, y las opciones pueden indicar el tipo de prosesador, si queremos que nos muestre todos los mensajes o solo los de error, el formato de salida del archivo .HEX etc. Estos campos se incluyen automáticamente cuando trabajamos con Built All. 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á:
10
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 exceder de 255 decimal o FF hexadecimal.
Tipo Decimal
Hexadecimal
Sintaxis Ejemplo
Comentario
D''
D'100'
D puede ser minúscula
.
.100
H''
H'64'
0x
0x64
H puede ser minúscula
64
Por defecto O puede ser minúscula
Octal
O''
O'144'
Binario
B''
B'01100100' B puede ser minúscula
A''
A'C'
''
'C'
ASCII
A puede ser minúscula
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: 11
• • • • •
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. Las directivas de listado permiten todo el control sobre el formato, paginación y listado del programa. Las directivas de macros, permiten todas las gestiones de las macros. Las directivas de fichero objeto, solo se utilizan para la creación 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 más 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 ASCII representados 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ón que 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"
12
FILL
Rellena un número de posiciones de memoria de programa con un mismo contenido (dato o instrucción si va entre paréntesis) FILL 0x190F, 5
RES
Reserva un determinado número de posiciones de la memoria de programa (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 del microcontrolador. 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 de caracteres 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
RADIX
Se incluye el fichero especificado, se inserta en la posición y será ensamblado INCLUDE "c:\mplab\P16F84A.INC" INCLUDE Se especifica el RADIX que se está usando RADIX dec ;pueden ser hex ú oct
13
Define el tipo de microcontrolador PROCESSOR 16F877A
PROCESSOR
Para controlar la generación del fichero de listado (.LST): TITLE SUBTITLE
Título en la cabecera de las páginas 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
IFDEF
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 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
Grupo de instrucciones y directivas que se ensamblan mientras la expresión
14
ENDW
sea cierta VARIABLE i i=0 WHILE i < CONTADOR RETLW i i+=1 ENDW Macros 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
MACRO EXITM 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
15