Anda di halaman 1dari 12

ESCRIBIR CDIGO EN LENGUAJE ENSAMBLADOR

A veces el proceso de escribir un programa en Basic requiere las partes del cdigo escritas en ensamblador. Esto permite ejecutar algunas partes del programa de una forma definida con precisin en un perodo de tiempo exacto. Por ejemplo, cuando se necesita que los pulsos muy cortos (de unos microsegundos) aparezcan peridicamente en un pin del microcontrolador. En tales casos la solucin ms simple sera escribir el cdigo ensamblador en la parte del programa que controla la duracin de pulsos.

El comando asm se utiliza para introducir una o ms instrucciones en ensamblador en el programa escrito en Basic: asm instrucciones en ensamblador ... end asm
Las instrucciones en ensamblador pueden utilizar los objetos (constantes, variables, rutinas etc.) anteriormente declarados en Basic. Por supuesto, como el programa entero est escrito en Basic, sus reglas se aplican al declarar estas constantes y variables. Veamos al siguiente ejemplo:

MATRICES

Una matriz es una lista organizada y limitada de variables del mismo tipo denominadas elementos. Este tipo es denominado tipo bsico. Cada elemento es referenciado por un ndice nico as que los diferentes elementos pueden tener el mismo valor. Para declarar una matriz, es necesario especificar el tipo de sus elementos (denominado tipo de matriz), su nombre y el nmero de sus elementos encerrados entre corchetes:

dim nombre_de_matriz as tipo_de_componente [nmero_de_componentes]


Los elementos de una matriz se identifican por su posicin. Los ndices van desde 0 (el primer elemento de una matriz) a N-1 (N es el nmero de elementos contenidos en la matriz). El compilador tiene que saber cuntas localidades de memoria debe alojar al declarar una matriz. Por eso, el tamao de una matriz no puede ser variable.

Para explicar con ms claridad, una matriz puede ser pensada como una lista ms o menos larga o corta de variables del mismo tipo en la que a cada una se le asigna un nmero ordinal que siempre empieza por cero. A esta matriz se le denomina vector. En la tabla de la derecha se muestra una matriz denominada estante que contiene 100 elementos.
ELEMENTOS DE LA MATR IZ estante[0] estante[1] estante[2] estante[3] estante[4] estante[5] estante[6] ... ... estante[99] CONTENIDO DE ELEMENT OS 7 23 34 0 0 12 9 ... ... 23

En este caso, el contenido de una variable (elemento) representa un nmero de productos que contiene el estante. A los elementos se les puede acceder por medio de la indexacin, o sea, al especificar sus ndices encerrados entre corchetes:

dim shelf as byte [100] elementos shelf [4] = 12 estante [4]

' Declarar la matriz "estante" con 100 ' 12 elementos estn colocados en el

temp = shelf [1] variable temp

' Variable estante [1] se copia a la

En las matrices de constantes, a los elementos se les pueden asignar sus contenidos durante la declaracin de matriz. En el siguiente ejemplo, una constante de matriz denominada CALENDARIO se declara y a cada elemento se le asigna un nmero especfico de das:

const CALENDARIO as byte [12]= (31,28,31,30,31,30,31,31,30,31,30,31)


El nmero de los valores asignados no debe exceder la longitud de la matriz especificada, solo puede ser menor. En este caso, a los elementos de sobra se les asignarn ceros.

SENTENCIA GOTO
La sentencia goto le permite hacer un salto absoluto a otro punto en el programa. Esta caracterstica se debe utilizar con precaucin ya que su ejecucin puede causar un salto incondicional sin hacer caso a todos los tipos de limitaciones de anidacin. El punto destino es identificado por una etiqueta, utilizada como un argumento para la sentencia goto. Una etiqueta consiste en un identificador vlido seguido por dos puntos (:). La sintaxis de la sentencia goto es:

goto: nombre_de_etiqueta
La sentencia ejecuta un salto al especificador nombre_de_etiqueta que representa una etiqueta. La sentencia goto puede preceder o seguir a una etiqueta. Por lo tanto, no es posible hacer un salto hacia o desde un procedimiento o funcin. La sentencia goto se puede utilizar para salir de cualquier nivel de las estructuras anidadas. No es recomendable saltar a bucles u otras sentencias estructuradas, ya que se pueden producir resultados inesperados.

SENTENCIA GOSUB
Una subrutina es una parte del cdigo dentro de un programa largo ejecutado a peticin. Realiza una tarea especfica, es relativamente independiente del resto del cdigo. El intrprete del compilador salta a la subrutina, la ejecuta y vuelve al programa principal. Las palabras clave gosub y return se utilizan en Basic para denotar el inicio y el final de la subrutina:

gosub nombre_de_etiqueta ... ... ... nombre_de_etiqueta: ... return

Las subrutinas se consideran difciles de mantener, leer y manejar, igual que la sentencia goto. Es recomendable utilizarla solo si no hay otra solucin.

ACCESO A LOS BITS INDIVIDUALES


El compilador mikroBasic PRO for PIC instalado en la PC, incluye una lista de los microcontroladores PIC soportados, con todos los registros, sus direcciones exactas y los nombres de bits. El compilador le permite acceder a los bits individuales de estos registros por sus nombres, sin especificar sus posiciones (el compilador ya las conoce). Hay muchas formas de acceder y modificar a un bit individual dentro de un registro. Por ejemplo, vamos a acceder al bit GIE (Global Interrupt Enable - Habilitacin global de interrupciones) por ejemplo. Es el sptimo bit del registro INTCON. A este bit se le puede acceder por su nombre, al escribir lo siguiente:

INTCON.GIE = 0 ' Poner a cero el bit GIE


Para denotar la posicin de bit en un registro en lugar de un nombre de bit se pueden utilizar una variable, una constante, una llamada a funcin o una expresin encerrada entre parntesis. Adems, para acceder a los bits individuales se utilizan las constantes globales predefinidas B0, B1, , B7, o 0, 1, 7, donde 7 se considera el bit ms significante.

INTCON.B0 = 0 ' Poner a cero el bit 0 del registro INTCON ADCON0.5 = 1 ' Poner a uno el bit 5 del registro ADCON0 i = 5 STATUS.(i+1) = 1 ' Poner a uno el bit 6 del registro STATUS
Por fin, a un bit deseado se le puede acceder al utilizar un nombre alias. En este caso, es el GIE_bit:

GIE_bit = 1 ' Poner a uno el bit GIE


TIPO SBIT
El compilador mikroBasic PRO for PIC tiene un tipo de dato sbit. Esto es un tipo de dato ms corto que se refiere a un solo bit. Si al tipo sbit se le asigna una variable, el bit apropiado de un registro ser cambiado al cambiar esta variable sin especificar el nombre y la localidad del registro. La variable sbit se comportar como un puntero. Para declarar la variable sbit, basta con escribir:

dim Nombre_de_bit as sbit at Nombre_de_registro.Posicin_de_bit program MyProgram ' Mdulo principal ... dim Output1 as sbit at PORTB.0 ' Variable Output1 es de tipo sbit ... Output1 = 1 ' Pin del puerto PORTB.0 est a uno (5V)

Si una variable de tipo sbit no est definida en el mismo mdulo donde se utiliza, la palabra clave external debe ser utilizada. Adems, el especificador de memoria apropiado se debe aadir:

dim nombre_de_bit as sbit sfr external module MyModule ' Esto no es el mdulo principal y el bit Output1 ... ' no est definido aqu dim Output1 as sbit sfr external ... Output1 = 1 ' Pin PORTB.0 (definido en el ejemplo anterior como Output1) est a uno (5V)
TIPO BIT
El compilador mikroBasic PRO for PIC proporciona un tipo de dato bit que se puede utilizar para declarar las variables.

dim bf as bit
A diferencia de variables de tipo sbit, solo el nombre de bit est declarado aqu, mientras que el compilador almacena una variable bit en algunos de los registros libres de la RAM. Como se puede ver, no es necesario especificar un bit de algn registro especfico. La localidad exacta de la variable de tipo bit es desconocida al usuario.

Los tipos Bit y sbit se utilizan con los siguientes limitaciones:

No pueden ser utilizados para las listas de argumentos y como valores devueltos de funciones No pueden ser utilizados como un miembro de estructuras No pueden ser utilizados como elementos de matrices No pueden ser inicializados No se puede apuntar a ellos Sus direcciones no se pueden leer, por eso el operador unitario @ no se puede utilizar con variable de este tipo

dim ptr as ^bit ' invlido dim arr as array[5] of bit ' invlido

FUNCIONES Y PROCEDIMIENTOS
Las funciones y los procedimientos, denominados bajo el nombre comn de rutinas, son subprogramas (bloques de sentencias autnomos) que ejecutan ciertas tareas a base de un nmero de los parmetros de entrada. Las funciones devuelven un valor despus de la ejecucin, mientras que los procedimientos no devuelven un valor.

PROCEDIMIENTOS

Un procedimiento es un bloque de cdigo nombrado, o sea, una subrutina con algunas caractersticas adicionales. Por ejemplo, puede aceptar parmetros. Los procedimientos se declaran de la siguiente manera:

sub procedure nombre_de_procedimiento (lista_de_parmetros) [ declaraciones locales ] cuerpo de procedimiento end sub El especificador nombre_de_procedimiento representa un nombre de procedimiento y debe ser un indentificador vlido. La lista_ de_parmetros entre parntesis representa una lista de parmetros formales declarados de manera similar a variables. En mikroBasic PRO for PIC, los parmetros se le pasan a un procedimiento por valor. Para pasar los parmetros por direccin, es necesario aadir la palabra clave byref al principio de la declaracin de los parmetros. Las declaraciones locales son declaraciones opcionales de variables y constantes que se refieren slamente al procedimiento dado. El cuerpo de procedimiento es una secuencia de sentencias que se ejecutarn despus de llamar al procedimiento.

Una llamada a procedimiento se realiza al especificar su nombre seguido por los parmetros actuales colocados en el mismo orden que los parmetros formales correspondientes. Despus de llamar a procedimiento, todos los parmetros formales se crean como los objetos locales inicializados por los valores de los argumentos actuales.

'Aadir dos nmeros sub procedure add (dim byref sum as word, dim x, y as byte) sum = x + y ' aadir los nmeros x e y y almacenar el resultado en la variable sum end sub ' fin del subprocedimiento
Ahora, podemos llamar al procedimiento add para hacer clculo del peso total de una carga, por ejemplo:

add (peso_bruto, peso_neto, peso_tara)

FUNCIONES
Las funciones deben estar declaradas apropiadamente para ser interpretadas correctamente durante el proceso de la compilacin.

sub function nombre_de_funcin (lista_de_parmetros) as valor_devuelto [ declaraciones locales ] cuerpo de funcin end sub
Cada declaracin contiene los siguientes elementos:

Nombre_de_funcin es un identificador utilizado para llamar a funcin (nombre_de_funcin en el ejemplo) Tipo de resultado (valor devuelto) es un tipo de dato de los datos devueltos (tipo_devuelto en el ejemplo) Declaracin de los parmetros:cada parmetro consiste en una variable, constante, puntero o matriz precedidos por su tipo de dato especificado similar a una declaracin de variable regular (lista_de_parmetros en este ejemplo). Se utilizan para pasar la informacin de la funcin al llamarla. Declaraciones locales son declaraciones opcionales de variables y constantes que se refieren solamente a la funcin dada. Cuerpo de funcin es una secuencia de sentencias que sern ejecutadas despus de llamar a la funcin.

Aqu est un ejemplo de cmo definir y utilizar la funcin power:

'funcin que hace clculo de xn basado en los parmetros de entrada x y n (n > 0) sub function power(dim x, n as byte) as longint ' x y n son bytes, resultado es longint dim i as byte ' i es un byte result = 1 ' resultado = 1 si n = 0 if n > 0 then for i = 1 to n result = result*x next i end if end sub
Ahora, podemos llamar a la funcin power para hacer clculo de 3
12

por ejemplo:

tmp = power(3, 12) ' Hacer clculo de 3*12

LIBRERAS DE FUNCIONES Y PROCEDIMIENTOS


Las declaraciones de todas las funciones y procedimientos utilizados en Basic se almacenan normalmente en los ficheros de mdulo especial y se les denominan libreras. Antes de utilizar una librera en el programa, es necesario especificar el mdulo apropiado por medio de la clusula include al principio de programa. Esto es una regla general. Si escribe un programa en el compilador mikroBasic PRO for PIC basta con marcar la librera deseada en la lista y el mdulo apropiado ser automticamente incluido en el proyecto. El compilador ya contiene un gran nmero de estas libreras. Si el compilador encuentra una funcin o procedimiento desconocidos durante la ejecucin de programa, primero va a buscar su declaracin en las libreras anteriormente marcadas.

RUTINAS INTEGRADAS EN EL COMPILADOR MIKROBASIC PRO FOR PIC


Aparte de las libreras de funciones y procedimientos, el compilador mikroBasic PRO for PIC proporciona un conjunto de las funciones integradas y tiles:

Lo Hi Higher Highest Inc Dec Chr Ord SetBit ClearBit TestBit Delay_us Delay_ms Vdelay_Advanded_ms Vdelay_ms Delay_Cyc Clock_KHz Clock_MHz Reset ClrWdt DisableContextSaving SetFuncCall SetOrg GetDateTime GetVersion

Las rutinas Delay_us y Delay_ms se generan en la parte del programa de la que se llaman.

Vdelay_ms, Delay_Cyc y Get_Fosc_kHz son las rutinas actuales en Basic. Sus fuentes se pueden encontrar en el archivo Delays.mbas ubicado en el archivo uses del compilador.

PREPROCESADOR
Un preprocesador es una parte integral de cada compilador. Su funcin es de reconocer y ejecutar las instrucciones del preprocesador. Qu son instrucciones del preprocesador? Son instrucciones especiales que no pertenecen al lenguaje Basic, sino que estn integrados en el compilador. Antes de compilar, el compilador inicia al preprocesador que pasa por el programa en bsqueda de estas instrucciones. Si encuentra una, el preprocesador las sustituir por otro texto que, dependiendo del tipo de comando, puede ser un archivo (comando include) o slo una corta sentencia de caracteres (comando define). Entonces, el proceso de compilar puede empezar. Las instrucciones pueden estar en cualquier parte del programa fuente y se refieren solamente a la parte del programa en la que aparecen hasta el final del programa.

DIRECTIVA DEL PREPROCESADOR INCLUDE


Muchos programas repiten con frecuencia el mismo conjunto de comandos un par de veces. Para escribir un programa ms rpidamente, estos comandos y declaraciones se agrupan normalmente en los mdulos particulares que se pueden incluir en el programa con facilidad por medio de la directiva include. Para decir

con ms precisin, la directiva include importa el texto del otro documento en el programa, sea un conjunto de comandos o bien un conjunto de comentarios etc.

COMPILACIN CONDICIONAL
Las directivas de la compilacin condicional se utilizan generalmente para facilitar la modificacin y compilacin de los programas fuente para los diferentes microcontroladores. El compilador mikroBasic PRO for PIC soporta a la compilacin condicional. Todas las directivas de la compilacin condicional deben terminar dentro del mdulo en el que han empezado.

DIRECTIVAS #IF, #ELIF, #ELSE, Y #ENDIF


Las directivas condicionales #if, #elif, #else y #endif se ejecutan de manera similar a las sentencias condicionales comunes en Basic. Si una expresin escrita despus de #if tiene un valor distinto de cero, las lneas de programa que siguen a la directiva #if sern interpretadas como un cdigo de programa vlido y compiladas en cdigo hex. La sintaxis es la siguiente:

#if constant_expression_1 cero, <section_1> [#elif constant_expression_2 cero,

'Si expresin_de_constante_1 no es 'seccin_1 ser compilada 'Si expresin_de_constante_2 no es

<section_2>] ... [#elif constant_expression_n cero, <section_n>] [#else secciones anteriores <final_section>] #endif

'seccin_2 ser compilada 'Si expresin_de_constante_n no es 'seccin_n ser compilada 'Si no se compila ninguna de las 'seccin_final ser compilada 'Final de la directiva #if

Cada directiva #if en un archivo fuente debe terminar por una directiva #endif de cierre correspondiente. Entre las directivas #if y #endif puede haber cualquier nmero de las directivas #elif, pero slo se permite una directiva #else. Si est presente la directiva #else, debe ser la ltima directiva antes de la directiva #endif. Seccin puede ser cualquier cdigo de programa reconocido por el compilador o preprocesador. El preprocesador selecciona una seccin al evaluar la expresin_de_constante que sigue a cada directiva #if o #elif hasta encontrar una expresin_de_constante verdadera (distinta de cero). Si todas las expresiones-constantes son evaluadas como falsas o no aparecen ninguna directiva #elif, el preprocesador selecciona la seccin_final que sigue a la clusula #else. Si se omite la clusula #else y todas las expresiones_constantes en el bloque #if son evaluadas como falsas, no se seleccionar ninguna seccin para un procesamiento posterior.

Por ltimo, resulta que solamente una seccin del cdigo ser compilada, aunque est vaca.

PUNTEROS
Como ya hemos mencionado, a cada objeto en el programa (variable, procedimiento, subrutina etc.) se le asigna una direccin de memoria particular. Al declarar una variable en el programa el compilador le asigna automticamente una localidad de la memoria RAMlibre. Durante la programacin, estas direcciones no son visibles para los programadores. La posibilidad de acceder a los diferentes objetos por sus nombres (identificadores) en vez de por sus direcciones es una de las ventajas principales de los lenguajes de programacin de alto nivel. En realidad, es ms fcil manejar las palabras (nombres) que los nmeros. Adems, el compilador se encarga de los objetos asociados y de sus direcciones. Direccionar los objetos al especificar sus nombres es denominado direccionamiento directo.

Sin embargo, a veces se necesita utilizar las direcciones de localidades de memoria. En este caso se utilizan los punteros - variables que almacenan la direccin de memoria de un objeto. Entonces, es posible acceder a los objetos que utilizan solamente los punteros. Por eso esta forma de direccionar es denominada direccionamiento indirecto. Antes de utilizar un puntero es necesario declarar su tipo de datos. Solo hay que anteponer el signo de intercalacin (^) al tipo.

dim pointer_p as ^word

' puntero_p apunta al dato de tipo word

Se le recomienda almacenar una varible en una localidad de memoria RAM especfica, luego se debe utilizar la directiva absolute en el programa de la siguiente manera:

dim variable_a as word absolute 12 ' variable_a ocupar una palabra ' (16 bits) en la direccin 12
Para acceder a los datos en la localidad de memoria del puntero, necesita posponer el signo de la intercalacin (^) al nombre del puntero. Veamos el ejemplo de la declaracin del anteriormente mencionado puntero puntero_p , que apunta a la palabra (en este caso, es anteriormente definida variable_a almacenada en la direccin 12 en la RAM). A la variable apuntada variable_a se le asigna el valor 26:

dim pointer_p as ^word 'Puntero_p a punta al dato de tipo word ... ... pointer_p = 12 'Puntero_p apunta a la direccin de memoria 12 ... puntero_p^ = 26 'Variable a en la localidad de memoria 12 tiene valor 2 'Similar a la directiva absolute utilizada para las variables, la 'directiva org especifica la direccin inicial de una rutina en la 'memoria ROM. Se aade a la declaracin de la rutina. Por ejemplo: sub procedure proc(dim par as word) org 0x200 ' El procedimiento empezar ... ' en la direccin 0x200 end sub
En este caso, al puntero puntero_p se le asigna el valor 12 (puntero_p =12), lo que significa que la direccin de memoria 12 est especificada.

Si quiere cambiar el valor de una variable apuntada, basta con cambiar el valor del puntero y posponer el signo de intercalacin (^) al valor. Veamos la figura a la derecha: a la variable variable_a en la direccin 12 se le asigna el valor 26 por medio del puntero puntero_p. Los punteros pueden apuntar a los datos almacenados en cualquier espacio de memoria disponible y pueden residir en cualquier espacio de memoria disponible menos en el espacio de memoria de programa (ROM)

Anda mungkin juga menyukai