Anexo 2: MPASM, el ensamblador de Microchip

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

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

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