Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
8.1
8.2
1/21
04/04/13
Introduccin
El juego de instrucciones de un microprocesdor o microcontrolador es el conjunto de entradas binarias que producen acciones definidas durante un ciclo de instruccin. Un juego de instrucciones es para el microcontrolador lo mismo que una tabla de verdad es para una puerta lgica, un registro de desplazamiento o un sumador. Por supuesto, las acciones que realiza un microcontrolador con cada instruccin, son ms complejas que las que realizan los dispositivos y puertas antes mencionados. Una instruccin es un patrn de dgitos binarios el cual debe estar a disposicin del microcontrolador en el tiempo y forma que ste lo requiera. Por ejemplo, cuando el procesador de un microcontrolador PIC16F84A recibe el patrn binario de 12 bits '0000 0100 0000' en el momento adecuado, significa: Clear (borrar o poner a cero) el registro W, y corresponde a la instruccin CLRW. En instrucciones del PIC16F84A se muestra el juego de instrucciones completo del PIC16F84A Para los PIC se han creado unas instrucciones y una estructura de programa que los hacen ms sencillos y atractivos todava.. Las instrucciones de los microcontrolador PIC cumplen con las siguientes condiciones: Juego de instrucciones reducido: Por ejemplo, solo existen 35 instrucciones en el PIC16F84A. Sencillas y rpidas: La mayora se ejecuta en un ciclo de instruccin, y solo las de salto precisan 2 ciclos. El ciclo de instruccin consta de 4 ciclos de reloj principal. De esta manera un dispositivo con un cristal de cuarzo de 20 MHz realiza 5 millones de instrucciones por segundo. Ortogonalidad: La ubicacin de los operandos que manejan es muy flexible. Cualquier objeto del procesador puede actuar como origen o como destino. Formato uniforme de las instrucciones: Todas las instrucciones tienen una longitud fija de bits. Esta caracterstica significa un notable ahorro de la memoria de programa y una facilidad en la construccin de compiladores. Formato uniforme de los datos. Un programa es una serie de instrucciones mediante las cuales un sistema basado en CPU realiza una tarea en particular y la forma mas simple de realizar un programa es mediante el lenguaje ensamblador (Ver Sistemas microprogramables, Lenguajes de programacin para sistemas basados en CPU). Podramos decir que el lenguaje ensamblador "es complejo por su sencillez". Esto quiere decir que, a diferencia de los lenguajes de alto nivel, aqu no hay funciones que solucionen y simplifiquen algoritmos, si no que hay que implementar hasta los pasos ms elementales.
Programa en ensamblador
Para introducir un programa en ensamblador en un sistema basado en CPU tenemos que traducirlo a hexadecimal o a binario. Para realizarlo a suvez se utiliza un programa de ordenador, llamado programa ensamblador. ste sera un ejemplo de programacin en ensamblador o mnemnicos:
perso.wanadoo.es/pictob/ensamblador.htm 2/21
04/04/13
s t a r t
o r g m o v l w m o v w f m o v l w a d d w f e n d
0 0 E h R E G 1 1 0 0 R E G 1 , 1
Mnemnicos
La tarea principal del ensamblador es la traduccin de los cdigos de operacin en mnemnico en sus equivalentes binarios. El ensamblador realiza sta tarea usando una tabla como si lo hicisemos "a mano" pero adems debe determinar cuantos operandos requiere la instruccin y de que tipo. Esto es un poco complejo; algunas instrucciones (como CLRW, SLEEP) no tienen operandos, otras (ADDLW 13, GOTO FIN) tienen una, mientras que otras (BSF STATUS,C o BTFSS PORTA,O) requieren dos.
Identificacin de elementos
Flags o Banderas
Los Flags o banderas son marcadores, representados por bits dentro del registro de STATUS, los mas importantes son: Z: Flag de cero, se pone a 1 cuando una operacin que le afecta da como resultado un 0. C: Flag de Carry, se pone a 1 cuando la operacin que le afecta sobrepasa el nivel de representacin del
perso.wanadoo.es/pictob/ensamblador.htm 3/21
04/04/13
procesador, en nuestro caso es 8 bits, de esta manera si sumamos a 1111 1111 b un 0000 0011 b el resultado seria 0000 0010 b y el bit de Carry pasara a 1. DC: Flag de carry del nibbles inferior, este se comporta igual que el bit de Carry, solo que el limite de representacin son los 4 bits inferiores, de esta manera si tenemos 0000 1111 b y sumamos 0000 0111 b, el resultado ser 0001 0110 b y el bit de DC se pone a 1, el bit de Carry estar a 0 al no superarse los 8 bits y el bit Z a 0 al ser el nmero diferente de 0.
Registros
Un registro es un espacio en la memoria de datos del microcontrolador en el que podemos guardar informacin, existen tambin unos registros en los cuales podemos configurar el microcontrolador o saber el estado de este o algunos de sus perifricos. Un registro est compuesto por 8 bits los cuales se representan dndoles un numero segn su posicin, de esta manera el bit menos significativo (LSB) se le da el nmero 0 y el ms significativo (MSB) el 7. BIT 7 6 5 4 3 2 1 0
REGISTRO X X X X X X X X Donde X puede ser 1 0. A los bits del 0 al 3 se les denomina nibbles inferior, y del 4 al 7 se denominan nibbles superior. La forma de representacin de parte de los bits de un registro suele ser: Registro<3:0> lo que indica los bits del 3 al 0 del registro. De esta forma, para identificar el BIT Z de STATUS se pondra: STATUS<2>
CLRF
04/04/13
El OPCODE de CLRF f es en binario "0000011fffffff" donde "fffffff" se sustituira por el registro que se quiera borrar. f es una de las abreviaturas que se utilizan para describir las instrucciones del PIC usados en el lenguaje ensamblador y que son: f Representa un registro cualquiera de la memora de datos. w Registro de trabajo (Working Register). b Direccin de un bit dentro de un registro de 8 bits (0-7). l k Literal o constante de 8 bits. d Bit de destino, 0 1. x Los bits que estn representados por este tipo de dato no tienen ninguna funcin y su valor lo define el compilador.
8.3
f (file register)
Este carcter se usa para definir registros de cualquier tipo. Cualquier instruccin que contenga este campo, contendr la direccin de un registro, no su contenido. Un registro puede variar entre las direcciones 00h y 7Fh. En el caso de los registros especiales en vez de la direccin podemos poner directamente el nombre del registro que el ensamblador se encargar luego de traducir a las direccin real. Ejemplo, instruccin BSF f,b , Pone a 1 el bit b del registro f. En lugar de poner:
B S F 0 3 , 5
podemos poner:
perso.wanadoo.es/pictob/ensamblador.htm 5/21
04/04/13
B S F
S T A T U S , 5
w (working register)
w da nombre al acumulador de los PICs, el cual lo vimos anteriormente cuando tratamos los registros. Este no es un registro situado en un banco de memoria, si no que es independiente. A diferencia que el anterior, cuando nos referimos a l, nos referimos al contenido. Su uso es muy sencillo, pues lo usaremos principalmente para pasar informacin de un registro a otro, o para contener la informacin entre dos o ms instrucciones.
ponemos:
B S F S T A T U S , R P 0
8.4
l o k (literal)
Este valor ser almacenado en la propia instruccin en tiempo de ensamblado, esto significa que son los valores que introducimos en las instrucciones para que trabaje con ellos (independientemente de los datos que podamos almacenar o contener en la EEPROM de datos). El valor que podemos introducir dentro de un literal est comprendido entre 0 y 255, ya que es el mximo que puede representar un byte.
d (destiny bit)
Donde encontremos esta letra, debemos especificar donde se almacenar el resultado de una instruccin, en w o en un registro. Puesto que esto no es un lenguaje de alto nivel, no podemos almacenar el resultado de una operacin sobre una tercera variable o registro, as que este deber ser almacenado en el registro origen (sobrescribindose), o en el acumulador. Esto se define a travs de dos valores: 1: El resultado se almacenar en f.
perso.wanadoo.es/pictob/ensamblador.htm 6/21
04/04/13
0: El resultado se almacenar en w.
perso.wanadoo.es/pictob/ensamblador.htm
7/21
04/04/13
8.9
Hemos visto la estructura general. Ahora veremos la posicin de los elementos del cdigo por 4 columnas:
Columna 1: Etiquetas. Las etiquetas se rigen por las siguientes normas: Debe situarse en la primera columna. Debe contener nicamente caracteres alfanumricos. El mximo de caracteres es de 31. Columna 2: Operacin. En esta columna se situarn las instrucciones. El campo del cdigo de operacin es el nico que nunca puede estar vaco; ste siempre contiene una instruccin o una directiva del ensamblador. Columna 3: Operandos El campo de operandos o de direccin puede contener una direccin o un dato, o puede estar en blanco. Normanmente contendr registros o literales con los que se operar (f, l o k , b y w). Columna 4: Comentario. El campo del comentario o de etiquetas es opcional. Aqu se situar cualquier comentario personalizado que deseemos. Estos son tiles para saber qu hace un programa sin tener que descifrar el cdigo entero. El compilador (ensamblador) ignorar todo texto ms all del carcter punto y coma ";". Los comentarios generalmente se sitan en la cuarta columna para describir la accin de una lnea de cdigo, pero pueden situarse en cualquier parte de programa para describir cualquier otro evento, siempre que estn despus del carcter ";" (semicolon en ingls). Normalmente las columnas son separadas por una tabulacin. El espacio mnimo entre dos columnas es de un carcter, que puede ser un espacio en vez de una tabulacin.
Etiquetas (label)
Las etiquetas se sitan a la izquierda de las instrucciones y sirven para agrupar fragmentos de cdigo. Estos
perso.wanadoo.es/pictob/ensamblador.htm 8/21
04/04/13
fragmentos pueden ser de dos tipos: El primer tipo no es un fragmento tal cual, si no que es un punto del programa al que podremos saltar de manera incondicional a travs de la instruccin adecuada. El segundo tipo es denominado subrutina. Este empieza con una etiqueta y acaba con la instruccin RETURN o RETLW, que veremos ms adelante. Deberemos tener en cuenta: La etiqueta es el primer campo en una lnea en lenguaje ensamblador y puede no existir. Si una etiqueta est presente, el ensamblador la define como el equivalente a la direccin del primer byte correspondiente a esa instruccin. Esta etiqueta puede volver a usarse en otro lugar pero como operando de una instruccin. El ensamblador reemplazar sta etiqueta por el valor de cuando fue creada. Se usan frecuentemente en las instrucciones de salto. No puede existir ms de una etiqueta en la primera columna o primer campo de instruccin. No pueden usarse como nombres de etiquetas a palabras ya reservadas por el ensamblador ( ORG, EQU, etc.) o nombres de instrucciones ( movlw, call, nop, etc.) Ejemplo:
D A T O E Q U 0 5 h
I N I C I O m o v l w D A T O g o t o I N I C I O
La instruccin goto INICIO causa que la direccin de la instruccin con la etiqueta INICIO (movlw) se cargue en el PC (Contador de Programa). Por lo tanto sta instruccin ser luego ejecutada. No se permite el uso de nmeros o caracteres no alfabticos como primera letra de la etiqueta. Como regla prctica: usar siempre letras, y en mayscula, al menos la primera. Ejemplos:
T A B L A 2 X 2 + P E S O = > S A L I D A S A L T O 5 A L F A D a t o 1 D a t o 2 L o o p _ A P e r r m i t i d o N Op e r m i t i d o ! N Op e r m i t i d o ! N Op e r m i t i d o ! N Op e r m i t i d o ! P e r m i t i d o P e r m i t i d o P e r m i t i d o
Operandos y direcciones
Los ensambladores permiten elegir con libertad el tipo de elemento a colocar en el campo de operando o direccin. Sistemas de numeracin
perso.wanadoo.es/pictob/ensamblador.htm 9/21
04/04/13
Los ensambladores aceptan nmeros Hexadecimales, octales, binarios o decimal. Esta es la forma de representarlos:
H e x a d e c i m a l : 0 A 0 0 h $ 0 A 0 0 B i n a r i o : % 0 1 0 0 1 0 1 1 B ' 0 0 1 0 0 1 0 1 ' 0 1 0 1 1 0 1 0 b O c t a l : @ 1 2 3 1 2 3 Q D e c i m a l : D ' 2 5 0 ' . 2 5 0
Ejemplo:
m o v l w. 1 0 0
Significa: "mover el nmero literal 100 en decimal al registro de trabajo W" Ya hemos indicado que MPLAB es el entorno de desarrollo de Microchip e incluye el ensamblador MPASM, para obtener informacin sobre la convencin utilizada por este ver MPASM, el ensamblador de Microchip Nombres Los nombres pueden aparecer en el campo de operando; stos son tratados como el dato que representan (Ver directiva EQU). Cdigos de caracteres Algunos ensambladores permiten el uso de caracteres en ASCII. Por ejemplo:
d a t a " h o l a1 , 2 , 3 " d a t a ' N ' C H A R e q u ' t ' m o v l w' R ' ; c a d e n ad ec a r a c t e r e s ; c a r c t e rs e n c i l l o
Expresiones lgicas y aritmticas Los ensambladores permiten conbinaciones de datos con operandos especiales, aritmticos o lgicos. stos operandos se llaman expresiones. Por ejemplo:
perso.wanadoo.es/pictob/ensamblador.htm 10/21
04/04/13
R E G 1 E Q U V A L O R E Q U
0 5 h 2 0 h
m o v l w V A L O R + 2 a d d w f R E G 1 , 1 a d d w f R E G 1 + 1 , 1
En estos casoo el compilador utilizar el resultado de sumar (VALOR+2) o (REG+1) como operando.
Directiva EQU
El nombre viene de la palabra "equal", (igual)". La directiva EQU permite al programador "igualar" nombres personalizados a datos o direcciones. Los nombres utilizados se refieren generalmente a direcciones de dispositivos, datos numricos, direcciones de comienzo, direcciones fijas, posiciones de bits, etc. Un nombre es ms descriptivo que una simple direccin y la tarea de programar se har mucho ms sencilla. Tambin podemos asignar un nombre a una instruccin que repitamos varias veces a lo largo de un algoritmo, de manera que sea mucho ms sencilla la programacin. A estos nombre que asignamos mediante esta directiva se les denomina constantes, ya que el registro al que apuntan no variar durante el programa Ejemplos:
t e m p e q u 1 2
11/21
perso.wanadoo.es/pictob/ensamblador.htm
04/04/13
D A T O P O R T _ A S T A R T C A R R Y T I E M P O B a n k _ 1
E Q U E Q U E Q U E Q U E Q U E Q U
2 2 5 0 3 5 B S FS T A T U S , R P 0
8.5
Estas lneas tambin pueden estn incluidas en un archivo aparte al ASM (vase directiva INCLUDE). No siempre es necesario que con esta directiva se igualen posiciones de memoria a las etiquetas, ya que podemos poner nombres a datos. Podemos definir una equivalencia con el nombre de otra equivalencia ya definida y rtealizar operaciones matemticas. Por ejemplo, podemos calcular la frecuencia del ciclo mquina a partir de la frecuencia de reloj con la finalidad de emplearla para hacer otros clculos de la manera que se describe a continuacin:
P O R T _ B P O R T _ C F I N F I N 2 c l o c k r a t e f c l k E Q U E Q U E Q U E Q U E Q U E Q U P O R T _ A + 1 P O R T _ A + 2 S T A R T + 1 0 0 S T A R T + 2 0 0 . 4 0 0 0 0 0 0 ; f r e c u e n c i ad e lc r i s t a l c l o c k r a t e / 4 ; f r e c u e n c i ad e lr e l o ji n t e r n o
El valor del operando debe estar ya definido anteriormente, sino el compilador entregar un error. Adems de esto, podemos igualar a las etiquetas cualquier otro tipo de valores que usemos, como, por ejemplo, el cero y el 1 en el bit de destino:
W F E Q U E Q U 0 1
Con esto ltimo, cuando usemos una instruccinen donde debamos especificar donde se almacenar el resultado, en w o en un registro, en lugar de escribir : 1: para que el resultado se almacene en f. 0: para que el resultado se almacene en w. Pondremos: F: para que el resultado se almacene en f. W: para que el resultado se almacene en w. Generalmente esto ltimo no ser necesario realizarlo, siempre que incluyamos el fichero "INC" correspondiente al PIC con el que estemos trabajando (vase directiva INCLUDE).
Directiva ORG
perso.wanadoo.es/pictob/ensamblador.htm 12/21
04/04/13
Esta directiva dice al ensamblador a partir de que posicin de memoria de programa se situarn las siguientes instrucciones. Rutinas de comienzo, subrutinas de interrupcin y otros programas deben comenzar en locaciones de memoria fijados por la estructura del microcontrolador. Recordemos que el 16F84 slo tiene 1024 posiciones de memoria flash para cdigo. La directiva ORG hace al compilador colocar el cdigo que le sigue en una nueva direccin de memoria (la salida del compilador no solo coloca los cdigos de operacin sino tambin las direcciones de cada instruccin del programa). Usualmente se la utiliza para: reset, programas de servicios de interrupcin, programa principal, subrutinas. Ejemplos: 1) Inicia el programa en la posicin cero:
O R G 0 x 0 0
2) Inicia el programa en la posicin 0000h y luego pasa a la 0005h para no utilizar la posicin del vector de interrupcin (0004 h)
O R G 0 x 0 0 ;E lp r o g r a m ac o m i e n z ae nl ad i r e c c i n0y G O T O i n i c i o ;s a l t aal ad i r e c c i n5p a r as o b r e p a s a r O R G 0 x 0 5 ;e lv e c t o rd ei n t e r r u p c i n ,s i t u a d oe nl ap o s i c i n4 I n i c i o x x x . . .
8.6
3) Inicia el programa en la posicin 0000h y luego pasa a la 0005h para no utilizar la posicin del vector de interrupcin (0004 h). Si se produce una interrupcin se pasa a la posicin interr. Las subrutinas comienzan a partir de la direccin 0300h.
O R G 0 0 h ; v e c t o rd er e s e t g o t o i n i c i a l i z a O R G 0 4 h ; v e c t o rd ei n t e r r u p c i n g o t o i n t e r r O R G 0 5 h i n i c i a l i z a m o v l w0 8 h ; a q u c o m i e n z ae lp r o g r a m a . . O R G 3 0 0 h ; s u b r u t i n a s S u b r u t i n a 1 . . r e t u r n S u b r u t i n a 2 . . r e t u r n
Directiva #INCLUDE
perso.wanadoo.es/pictob/ensamblador.htm 13/21
04/04/13
Esta directiva indica que archivos debern tomarse en cuenta a la hora de compilar el cdigo. Normalmente se usa para incluir el archivo de PIC que el ensamblador tiene entre sus archivos, con el cual el compilador ser capaz de reconocer todos los registros especiales y sus bits. Su uso nos recordar al #include del lenguaje C. Esta lnea debe colocarse al principio, y tiene la siguiente sintaxis:
# I N C L U D E ;L i s t ad ee t i q u e t a sd em i c r o c h i p
En ciertas ocasiones gran cantidad errores son debidos a que el nombre del archivo puesto entre comillas no se escribe correctamente. Si utilizamos MPLAB, un entorno de desarrollo que proporciona gratuitamente Microchip, dispondermos de los archivos con extension .INC para cada uno de los PIC desarrollados hasta la aparicin de la versin de MPLAB que utilicemos. En estos archivos se definen todos los registros as como otros elementos de acuerdo al microcontrolador que estemos utilizando. Tambin podemos crear nuestros propios archivos "INC" con funciones, definiciones y subrutinas que utilicemos a menudo en nuestro cdigo para evitar tener que copiarlas cada vez. El archivo P16F84A.INC que viene con MPLAB contiene definiciones de registros, bits y bits de configuracin. Los archivos INC pueden verse con cualquier editor de texto pero no se recomienda modificarlos, para no perder compatibilidad con programas desarrollados por otros. Utilizar el INC del PIC que estamos utilizando en nuestro programa no es obligatorio, y podemos omitirlo, pero a cambio tendremos que definir los nombres de los registros que usemos o bien llamarlos por su posicin de memoria. Esto puede a la larga ser problemtico de manera que se recomienda utilizar los archivos INC correspondientes al PIC que utilicemos porque adems de facilitar la creacin del programa al no tener que recordar las direcciones reales de los registros tambin se facilita el paso de un programa diseado para un microcontrolador hacia otro distinto. Si utilizamos las posiciones de memoria con la direccin real, podemos hacer incompatibles las operaciones entre registros. Por ejemplo, CLRF 0x05, borra el registro ubicado en esa direccion, que no es ni mas ni menos que el PORTA (Puerto A) en el PIC16F84A. Pues bien, si queremos actualizarnos a otro microcontrolador pero resulta que en este el registro 0x05 tiene otra funcin nos ser mucho mas dificil actualizar el programa. Ahora bien, si hubisemos utilizado CLRF PORTA, y el .INC correspondiente al nuevo microcontrolador ya se ocupar el ensamblador de realizar las correspondencias. Y por supuesto siempre ser mas fcil recordar PORTA que no 0x05. Tambin permite incluir otros programas. Por ejemplo:
# I N C L U D E" D I S P L A Y . A S M "
Esto le dice al compilador que incluya el cdigo que se encuentra en el archivo DISPLAYY.ASM como si fuese parte del propio programa. Esto es muy util para reutilizar cdigos realizados con anterioridad.
Directiva LIST
perso.wanadoo.es/pictob/ensamblador.htm 14/21
04/04/13
Este comando sirve para que el compilador tenga en cuenta sobre qu procesador se est trabajando. Este comando debe estar en todo proyecto, situado debajo del "include", con la siguiente sintaxis.
L I S TP = P I C 1 6 F 8 4 A
Directiva END
Al igual que las dos anteriores, esta debe ir incluida una sola vez en todo el programa. En concreto, esta debe situarse al final, para indicar al ensamblador que el programa ha finalizado. Esta siempre debe estar presente, aunque el flujo de nuestro programa acabe en un bucle.
Directiva #DEFINE
#DEFINE es una directiva muy util. Define se usa para crear pequeas macros. Con estas macros podremos poner nombres a pequeos fragmentos de cdigo que nos facilitarn la realizacin y comprensin del algoritmo. Por ejemplo, podremos poner nombres a bits.
# d e f i n eC E R OS T A T U S , 2
As, en vez de tener que llamar al bit por un numero y un registro, podremos usar directamente la palabra CERO.
# d e f i n e C I N C O 5
Cada vez que se utilice la palabra CINCO ser reemplazada en el momento de la compilacin por el nmero 5.
8.7
Otro ejemplo muy prctico es el de poner nombre a un fragmento de cdigo usado frecuentemente. Este fragmento de cdigo, puede ser por ejemplo, el que conmuta entre los dos bancos.
B S F B C F O P T I O N , R P 0 O P T I O N , R P 0
Como cambiamos varias veces de banco a lo largo de un algoritmo, puede resultar ms prctico ponerle un nombre.
# d e f i n eB A N C O 1 B S FO P T I O N , R P 0 # d e f i n eB A N C O 0 B C FO P T I O N , R P 0
De este modo bastar con poner BANCO1 o BANCO0 para conmutar entre los dos bancos de memoria de manera que cada vez que se utilice la palabra BANCO1, en realidad se estar utilizando la instruccin BSF STATUS,RPO En el siguiente ejemplo:
perso.wanadoo.es/pictob/ensamblador.htm 15/21
04/04/13
# d e f i n e
s a l i d a
P O R T A , 3
No tendremos necesidad de recordar cual era la patilla de salida, sino que solo lo mencionaremos como salida. Cada vez que aparezca la palabra salida en el cdigo, sta ser interpretada como PORTA,1 que es una instruccin vlida. Podemos ponerlo a cero con la instruccin.
B C Fs a l i d a
Una cosa a tener en cuenta es que con la directiva INCLUDE, podemos prescindir del carcter almohadilla (#), pero en el caso de la directiva DEFINE, no. Esta directiva es muy util porque hace el cdigo ms fcil de leer y entender.
Directiva TITLE
Esta directiva no sirve de mucho, pero ser til para aquellos que quieran que el compilador tenga en cuenta el ttulo que le ha puesto a su cdigo. Tiene la siguiente sintaxis:
T I T T L E" N o m b r ed e lc d i g o "
Este nombre aparecer en los archivos .lst (listados) que cree el compilador.
Directivas IF...ELSE...ENDIF
Algunos ensambladores permiten incluir o excluir partes del programa dependiendo de condiciones que existan en el tiempo de compilacin. La forma tpica es:
I FC O N D I C I O N . . E L S E . . E N D I F
Ejemplo:
S I N K E Q U 1;( c a m b i a rp o r0e nc a s on e c e s a r i o ) I F S I N K = 1 B C FP O R T A , 0 E L S E B S FP O R T A , 0 E N D I F
En este caso el valor de SINK har que el compilador utilice distintas instrucciones de cdigo.
perso.wanadoo.es/pictob/ensamblador.htm 16/21
04/04/13
Si la condicin es verdadera en el tiempo de compilacin, las instrucciones que estn entre IF y ELSE se incluirn en el programa. Si la condicin es falsa se incluirn en el programa las instrucciones entre ELSE y ENDIF. Los usos tpicos son: Para incluir o excluir variables extras Para incluir cdigo de diagnstico en condiciones de testeo (DEBUG). Para permitir datos de distintos tamaos. Desgraciadamente, el ensamblado condicional, tiende a complicar la lectura del programa, por lo tanto, slo debemos utilizarlo si es necesario.
Directiva MACRO
Esta directiva resulta muy potente y a diferencia de la directiva #define se pueden crear macros ms extensas, lo que nos evitar tener que ejecutar reiteradamente fragmentos de cdigo idnticos. Cuando una macro es invocada, esta es copiada por el ensamblador en el lugar de la invocacin dentro del cdigo fuente. La macro se declara con la directiva MACRO, y termina con la directiva ENDM. Creacin de una macro denominada activar:
a c t i v a rm a c r o C L R FP O R T A B S FP O R T B , 2 e n d m
Hemos creado una macro llamada activar de manera que en nuestro cdigo cada vez que pongamos la palabra activar, el ensamblador la reemplazar por CLRF PORTA... etc. hasta el final de la macro que termina con la directiva ENDM (fin macro). Las macros permiten asignar un nombre a una secuencia de instrucciones de manera que son tiles cuando ocurren secuencias de instrucciones repetitivas. Luego se utiliza el nombre de la macro en el programa como si se usara la secuencia de instrucciones anterior. Las macros no son lo mismo que las subrutinas. El cdigo de las subrutinas aparece una sola vez en un programa y la ejecucin del programa salta a la subrutina. En cambio, el ensamblador reemplaza cada aparicin del nombre de la macro con la secuencia especificada de instrucciones. Por consiguiente la ejecucin del programa no salta a la macro como una subrutina. Ejemplo: Archivo "MULX10.ASM"
M U L X 1 0 M A C R O M O V F t i e m p o , W R L F t i e m p o R L F t i e m p o
perso.wanadoo.es/pictob/ensamblador.htm
; c o m i e n z od el am a c r o ; g u a r d ae lt i e m p oe nW ; m u l t i p l i c ap o r2 ; m u l t i p l i c ap o r2
17/21
04/04/13
R L F t i e m p o A D D W F t i e m p o A D D W F t i e m p o E N D M
; m u l t i p l i c ap o r2 ; l es u m au n av e zm s ; l es u m au n av e zm s ; f i nd el am a c r o
Archivo "EJEMPLO1.ASM":
# I N C L U D E " M U L X 8 . A S M " t i e m p o E Q U 0 C h r e s u l t a d o E Q U 0 D h M O V L W 2 0 M O V W F t i e m p o M U L X 1 0 M O V W F r e s u l t a d o E N D
Si ensamblamos "EJEMPLO1.ASM" notaremos que el listado final (EJEMPLO.LST) queda de la siguiente forma:
t i e m p o E Q U 0 C h r e s u l t a d o E Q U 0 D h M O V L W M O V W F M O V F R L F R L F R L F A D D W F A D D W F M O V W F E N D 2 0 t i e m p o t i e m p o , W ; g u a r d ae lt i e m p oe nW t i e m p o ; m u l t i p l i c ap o r2 t i e m p o ; m u l t i p l i c ap o r2 t i e m p o ; m u l t i p l i c ap o r2 t i e m p o ; l es u m au n av e zm s t i e m p o ; l es u m au n av e zm s r e s u l t a d o
Problemas con las MACROS Con las macros se puede trabajar rpidamente, pero pueden resultaer poco eficientes. Veamos un error muy comn al utilizar macros, en este caso se utiliza una macro denominada MOVFF:
M U L X 1 0 M A C R O M O V F A U X 1 , W M O V W F A U X 2 E N D M ; c o m i e n z od el am a c r o ; M u e v ec o n t e n i d od eu nr e g i s t r oao t r o ; at r a v sd e la c u m u l a d o r ; f i nd el am a c r o
Porcin de cdigo:
M O V L W. 1 ; T E M P = 1 M O V W FT E M P D E C F T E M P , F ; Zs ev aa1 B T F S SS T A T U S , Z ; s a l t as ios i
perso.wanadoo.es/pictob/ensamblador.htm 18/21
04/04/13
M O V F FA U X 1 , A U X 2; M a c r o M O V W FP O R T A ;. . .
En la lnea de la macro est el error porque los saltos (BTFSS) no pueden saltar macros. Las macros estn compuestas por ms de una instruccin, y el salto se producir dentro de la misma. El cdigo anterior con la macro incrustada sera:
M O V L W. 1 M O V W FT E M P D E C F T E M P , F B T F S SS T A T U S , Z M O V F A U X 1 , W M O V W F A U X 2 M O V W F P O R T A ;. . . ; T E M P = 1 ; Zs ev aa1 ; s a l t as ios i ; l n e a sd ea n t e r i o rm a c r o ;
Otro tema importante, que se ilustra en este ejemplo, es que las macros pueden modificar registros (en este caso W) de forma que el programador podra no tener en cuenta. En el ejemplo anterior, PORTA se debera cargar con 1, que aparentemente era el valor de W, pero la macro lo ha modificado, lo que resulta en otro error. Ejemplos de macros
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;m a c r o s . a s m; ;" M A C R O Sp a r a1 6 F 8 4 "; ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * c a l l z m a c r o s u b b r u t i n a b t f s c S T A T U S , Z c a l l s u b r u t i n a e n d m
c a l l n z m a c r o s u b r u t i n a b t f s s S T A T U S , Z c a l l s u b r u t i n a e n d m m o v f f m a c r o f 2 , f 1 ; ( a t e n c i n ,s ed e s t r u y eW ) m o v f f 1 , w m o v w f f 2 e n d m m a c r o f i l e , l i t e r a l ; ( a t e n c i n ,s ed e s t r u y eW ) m o v l w l i t e r a l m o v w f f i l e e n d m
m o v l f
; A t e n c i n ,p a r au s a re s t a sm a c r o sy ad e b ee s t a ra c t i v oe lb a n c o1 C O N F _ P O R T A m a c r o d a t o m o v l w d a t o
perso.wanadoo.es/pictob/ensamblador.htm 19/21
04/04/13
m o v w f T R I S A e n d m C O N F _ P O R T B m a c r o d a t o m o v l w d a t o m o v w f T R I S B e n d m ; c o n f i g u r a rO p t i o nR e g i s t e r : C O N F _ O P T I O Nm a c r o d a t o m o v l w d a t o m o v w f O P T I O N _ R E G e n d m ; c o n f i g u r a re lr e g i s t r od ei n t e r r u p c i o n e s : C O N F _ I N T C O Nm a c r o d a t o m o v l w d a t o m o v w f I N T C O N e n d m S E T _ B A N K _ 0 m a c r o B C F S T A T U S , R P 0 e n d m S E T _ B A N K _ 1 m a c r o B S F S T A T U S , R P 0 e n d m ; e n a b l eyd i s a b l ea l lt h em a s c a r a b l ei n t e r r u p t s( 1 6 F 8 4 ) : E I m a c r o b s f I N T C O N , G I E e n d m D I m a c r o b c f I N T C O N , G I E e n d m
# d e f i n e i E n a b l e E I # d e f i n e i D i s a b l e D I ; a r r a n c a re lt i m e r : R E S E T _ T I M E Rm a c r o b c f I N T C O N , T 0 I F e n d m ;i n i c i a l i z a rt i m e ra n t e sd eh a c e rR E S E T _ T I M E Rp a r aq u ea r r a n q u e . I N I T _ T I M E R m a c r o d a t o m o v l w d a t o m o v w f T M R 0 e n d m j m p m a c r o g o t o e n d m m a c r o r e t u r n
20/21
s a l t o s a l t o
r e t
perso.wanadoo.es/pictob/ensamblador.htm
04/04/13
e n d m ; C o m p l e m e n t oa1d eW : c o m w m a c r o x o r l w 0 x f f e n d m ; I n s t r u c c i o n e sd es a l t ot i p oZ 8 0 j z m a c r o _ s a l t o ; s a l t as iz e r o b t f s c S T A T U S , Z g o t o _ s a l t o e n d m m a c r o _ s a l t o ; s a l t as in oz e r o b t f s s S T A T U S , Z g o t o _ s a l t o e n d m m a c r o _ s a l t o ; s a l t as ic a r r y b t f s c S T A T U S , C g o t o _ s a l t o e n d m m a c r o _ s a l t o ; s a l t as in oc a r r y b t f s s S T A T U S , C g o t o _ s a l t o e n d m
j n z
j c
j n c
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; F I N ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
8.8
perso.wanadoo.es/pictob/ensamblador.htm
21/21