Você está na página 1de 16

[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008

ASM desde 0 (ASM desde cero)


He comenzado a realiza un tutorial de ASM y lo voy a poner aqu tambin. A pesar que mucho le escapan a este lenguaje, hay otros que nos sentimos cmodos con el -------------------------------------------------------------------------Lo primero que hay que saber para este lenguaje, es que cada lnea de cdigo, es una instruccin que realiza el CP o un paso que realiza el CP. A diferencia de otros lenguajes, como por ejemplo el C, una lnea de instruccin, puede llevar uno o mas pasos que el CP debe realizar. Ms adelante entendern el porqu. A esto ltimo dicho, nos explica el porqu de un programa escrito en ASM (assembler) lleva menos lnea de instruccin que el mismo programa realizado en otro lenguaje. Esto se traduce que, cuanto menos lneas de cdigo, menor consumo de la memoria de programa. Nota: Entendemos por el mismo cdigo, al realizar un software para realizar una dicha tarea. Una tarea que debe realizar nuestro microcontrolador, puede ser escrito en diferentes lenguajes, y es el programa que se utiliz quien lo traduce a formato hex (1 y 0). Ahora, Qu es el CP? El CP o PC es el Contador de Programa. Es el encargado de leer cada instruccin y realizar la accin solicitada por el software. Para dar un ejemplo un poco ms claro, digamos que el CP, es una persona. Esta persona se le da un papel que tiene diferentes tareas a realizar. Estas tareas, estn una debajo de la otra y lee lnea por lnea y hace lo que le dice esa lnea. Cada lnea, posee una instruccin que se debe hacer. Cuando termin de hacer esa instruccin, contina con la lnea de abajo. Supongamos que tenemos un papel que dice: Levantar la mano izquierda. Bajar la mano izquierda. Saltar tres veces en el mismo lugar. Levantar la mano derecha. Saltar una vez en el mismo lugar. Bajar la mano derecha. El CP, har esas tareas sin negarse y lo har fielmente a lo que est escrito. Por lo que, si hace una tarea mal, es porque le pusimos una o ms instrucciones mal. Si bien, el CP har lo que nosotros le pidamos, el CP nos pide que respetemos algunas cosas. .

Leon_Elec

Pgina 1

[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008


Estas cosas, dependern de cada microcontrolador y que debemos saber para poder programar en forma correcta al PIC. Cmo es la estructura del lenguaje ASM? Es muy fcil, posee 4 columnas bien diferenciadas y que no es problema acordarse. * La primera columna se llama ETIQUETA y sirve para darle el nombre a una posicin de la memoria del programa al que se necesita apuntar. Los que no se den cuenta, ya lo harn. * La segunda columna, se llama INSTRUCCIN y lo que justamente hace, es una instruccin a realizar por el CP. * La tercera columna, se llama OPERANDO y es el operando de una instruccin, o sea, de la segunda columna. Hay instrucciones que no tienen operando y las veremos ms adelante. * Y la cuarta columna, se llama OBSERVACIONES y sirve solo para el programador, o sea, el usuario que est programando el PIC. En otras palabras, a nosotros. Siempre comienza con ; (punto y coma) Si no sirve para el PIC, Para qu complicarla ms? Todo lo contrario, es para ayudar al programador de que no se olvide que intent hacer. Todos los lenguajes, desde los ms bsicos, hasta los ms avanzados, tienen esta caractersticas ya que en el, pondremos que es lo que queremos hacer o explicar el programa. Si bien, estas observaciones se utilizan en la cuarta columna, no es obligacin colocarla en esta columna, si no que puede ir al margen de la planilla en dnde estamos programando. Y es aqu dnde explicaremos la porcin de una rutina para entenderlo ms adelante. Bien, veremos a continuacin, como se escriben las columnas: ETIQUETAS INSTRUCCIN OPERANDO ;OBSERVACIONES O, podemos verlo as: ;OBSERVACIONES ;OBSERVACIONES ;OBSERVACIONES (y la cantidad que necesitemos) ETIQUETAS INSTRUCCIN OPERANDO ;OBSERVACIONES Antes de empezar a ver las instrucciones, debemos concentrarnos en los registros.

Leon_Elec

Pgina 2

[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008


Qu son los registros? Los registros, son posiciones de memoria el cual se utilizan para ir configurando el pic mientras se corre el programa, cambiar de bancos para acceder a otras partes de memorias, son banderas que nos van diciendo que est pasando con distintas operaciones, son habilitaciones o deshabilitaciones para mdulos que trae el PIC. Por ejemplo, conversor Analgico/Digital, PWM. Estos registros, tienen una ancho de bit de acuerdo al PIC, que hay de 8 bit, 16 bit y 32 bit. Excepto la palabra configuracin y que la veremos mas adelante. Cada registro, posee un nombre, y cada bit o un grupo de bit, se puede utilizar para lo descripto anteriormente (habilitar/deshabilitar, etc). A continuacin, ver el archivo adjunto. Es la posicin de la RAM y sus 4 bancos. Este, es del PIC16F877 Como notarn, en las cuatro columnas, hay nombres. Estos nombres son todos los registros que posee este PIC. Vern que hay registros que se repiten. No quiere decir que estn duplicados, triplicados o cuatriplicados, si no que se puede acceder a ellos no importa en que banco estemos trabajando. (Ya lo entendern, no se preocupen). Cada vez que se programe el PIC y se necesite trabajar con uno de estos registros, se debe acceder al banco que est dicho nombre. Es por eso, que esta tabla es muy importante a la hora de trabajar. Aprovechando que sub esta tabla del pic, cuando de ejemplo de programacin, ser sobre este pic. Microchip provee en forma gratuita estos datasheet. Y hay uno por cada PIC. Por lo que si no tienen este datasheet, descrguenlo de la pgina de Microchip. Cuando empezamos a programar, lo necesitarn.

Leon_Elec

Pgina 3

[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008

Leon_Elec

Pgina 4

[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008


Uno de los registros muy utilizado, es el registro de trabajo W, el cual, se utiliza para mover un dato/valor de un registro a otro, cargar valores en un registro, y con la ayuda de la ALU puede hacer operaciones matemticas. Observen con atencin el diagrama de bloque dnde se encuentra W que est adjuntado. Ahora bien, si W es un registro, dnde est ubicado, ya que en el mapa de memoria no lo encuentro? Est en la posicin 00h y dice indirect addr. Esto es, porque el registro W, no es una posicin de memoria fsica. Hay otros registros que estn igual. Pero no nos desviemos, el registro W, es muy usado y recuerden, se utiliza para mover datos, o cargar datos en distintas posiciones de la RAM y EEPROM. Los microcontroladores PIC, poseen tres tipos de memorias. * Memoria de Programa Es la ubicacin fsica dnde se guarda el firmware que hemos creado, o sea, nuestro programa. Y tiene un ciclo de 1.000 de lectura y/o escrituras antes de estropearse y es del tipo FLASH (pero este es flaco :mrgreen: Es un chiste). * Memoria de datos de uso general Es la memoria RAM del PIC. Recordemos, que los registros estn sobre la memoria RAM y la memoria de uso general, comienza despus de los registros. * Memoria de datos EEPROM Es la memoria EEPROM que puede almacenar datos mas de 40 aos sin energa y 1.000.000 de ciclos de escritura y lectura El PIC 16F877, tiene una memoria de programa de 8Kb por un ancho de 14 Bits, o sea que cada posicin de memoria tiene 14 bit (B'11111111111111', o H'3FFF') Cada lnea de instruccin ocupa una posicin en la memoria de programa, as que, podemos poner hasta 8.000 instrucciones. La RAM de uso general (mas los registros) trae 368 bytes con un ancho de 8 bit (B'11111111', o H'FF'). Esto quiere decir, que tenemos 368 posiciones para nuestro uso. La EEPROM trae 256 bytes con un ancho de 8 bits. Tenemos 256 posiciones para nuestro uso.

Leon_Elec

Pgina 5

[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008

Leon_Elec

Pgina 6

[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008


Ahora, vamos a estudiar el registro STATUS y luego continuaremos con las instrucciones.

Registro STATUS Si entendieron hasta ac, se acordar que los registros poseen un ancho de 8 bit. Cada bit, puede contener un 1 o 0. Vemos ahora en detalle el registro STATUS (est adjuntado) Este registro, tiene 3 Bit dedicado para las operaciones matemticas, 3 bit dedicado al cambio de banco de memoria y 2 bit dedicado para saber que o quin produjo un Power Up (despertar del micro). Y se puede leer y escribir en l (cambiar datos). Los analizamos desde el ms significativo (MSB) hasta el menos significativo (LSB). BIT 7: Se llama IRP y sirve para el direccionamiento indirecto para cambiar el banco de memoria. 1 = Banco 2 y 3 0 = Banco 0 y 1 BIT 6 y BIT 5 Se llaman RP1 y RP0 respectivamente. Sirve para el direccionamiento directo para cambiar de banco de memoria. 00 = Banco 0 01 = Banco 1 10 = Banco 2 11 = banco 3 BIT 4 Se llama TO (neg). Este bit se utiliza para saber quin despert al PIC. 1 = Despus que despierta (power up) o por las instrucciones CLRWDT o SLEEP, se pone a 1 este bit. 0 = Se pone a 0 cuando el wachtdog o en castellano perro guardin (WDT) despierta al PIC. BIT 3 Se llama PD (neg). Este bit se utiliza para saber si el pic estaba durmiendo.

Leon_Elec

Pgina 7

[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008


1 = Despus de que despierta (power up) o por la instruccin CLRWDT, se pone a 1 0 = Se pone a 0 cuando se ejecuta la instruccin SLEEP BIT 2 Se llama Z y al igual que los dos bytes anteriores, es una bandera. Nos indica el resultado de una operacin aritmtica y lgica. 1 = La operacin aritmtica o lgica dio como resultado 0 0 = La operacin aritmtica o lgica no dio como resultado 0 BIT 1 Se llama DC. Digit carry/borrow (dgito llevar/prestar). Es afectado por las instrucciones ADDWF; ADDLW; SUBLW; SUBWF (Para la resta, la polaridad es inversa). 1 = Hubo un acarreo del 4to bit menos significativo al 5to bit. 0 = No hubo un acarreo del 4to bit menos significativo al 5to bit. BIT 0 Se llama C carry/borrow. Es afectado por las mismas instrucciones que afectan al bit DC. 1 = Hubo un acareo del bit ms significativo (Bit 7) o sea cuando se excede de H'FF' 0 = No hubo acareo del bit ms significativo

Leon_Elec

Pgina 8

[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008

Leon_Elec

Pgina 9

[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008 Breve instroduccin de las INSTRUCCIONES Cada instruccin tiene una ancho de 14 Bits, es por eso que la memoria de programa tiene el mismo ancho. Justamente para poder alojar cada instruccin. Las instrucciones, estn divididas en tres grupos. Los cuales son: Byte-Oriented operation (Byte-Orientando a la operacin) Bit-Oriented operation (Bit-Orientando a la operacin) Literal and Control operation (Control y Literal de la operacin)

Primer grupo Byte-Oriented operation Cada instruccin de este grupo est compuesta por: OPCODE (Cdigo) DESTINATION (Destino) FILE REGISTER ADDRESS (Direccin del archivo de registro)

El OPCODE o cdigo, es el cdigo de cada instruccin y que es nica para cada instruccin. Est formada por los bit del 13 al 8. El DESTINATION o el destino, indica en dnde se va a guardar el dato. Por ejemplo, si hacemos una suma, tenemos dos opciones dnde guardarlo, una puede ser el registro W y la otra opcin puede ser otro registro cualquiera o una posicin de la RAM. Est formada por el bit 7. La constante que nos indica esto es la letra d. Si esta letra es 0, la operacin se guardar en el registro W. EN cambio si vale 1, la operacin se guardar en el registro o posicin de memoria que estemos trabajando al momento de usar una instruccin. Hay instrucciones, como veremos ms adelante, que no es necesario indicar dnde queremos guardar la operacin, ya que se hace en forma automtica. Y hay otras instrucciones que si no se indica el destino, nos puede dar un error al compilar o el compilador lo elegir el y por ende, nos puede ejecutar mal el programa. Y por ltimo, tenemos el FILE REGISTER ADDRESS que se carga con la direccin del registro a ser guardado. Est formada por los bit 6 al 0. La constante que nos indica esto, es la letra f Segundo grupo Bit-Oriented operation Cada instruccin de este grupo est compuesta por: OPCODE (Cdigo)

Leon_Elec

Pgina 10

[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008 BIT ADDRESS (Bit de direccin) FILE REGISTER ADDRESS (Direccin del archivo de registro)

OPCODE es igual al primer grupo. Est formado por los bits 13 al 10. El BIT ADDRESS, se utiliza para direccionar la operacin. Est formado por los bits 9 al 7. Como pueden observar, se sacrific bit del opcode para drselo al bit address. La constante que nos indica esto es la letra b Y por ltimo tenemos FILE REGISTER ADDRESS, que es igual al primer grupo. Est formado por los bit 6 al 0. Igual que en el primer grupo. La constante que nos indica esto es la letra f. Tercer grupo Literal and Control Cada instruccin de este grupo, est compuesta por: OPCODE LITERAL

OPCODE es igual que en el primer grupo. Est compuesta por los bits 13 al 8. Excepto para las instrucciones CALL y GOTO que est compuesta por los bit 13 al 11 (prestar mucha atencin a esto, cuando veamos estas dos instrucciones entendern la importancia). Y el LITERAL que puede ser un valor, por ejemplo para sumar, para restar, para cargar al registro W, en fin, un nmero decimal, binario o hexadecimal. O puede ser una valor de direccin a dnde apuntar para las instrucciones CALL y GOTO. Est compuesta por los bits 7 al 0. Excepto para las instrucciones CALL y GOTO que est compuesta por los bit 10 al 0 (prestar mucha atencin a esto, cuando veamos estas dos instrucciones entendern la importancia). Est adjuntado las 35 instrucciones agrupadas por los tres grupos Si alcanzan a ver en la imagen, vern que algunas instrucciones afectan al registro STATUS y otras no.

Leon_Elec

Pgina 11

[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008

Leon_Elec

Pgina 12

[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008


Las instrucciones Les voy a arruinar el momento de alegra. Las instrucciones hay que estudiarlas de memoria. Si, leyeron bien, de memoria. Lo que tienen que saber sobre las instrucciones, es como se escriben, que hace cada instruccin y lo ms importante que bit del REGISTRO afecta. Vamos a ir vindolo por orden alfabtico. Y otra cosita ms, como es de esperarce, estn en INGLES o son abreviaturas pero en INGLES. Recordemos que: .123 o D'123' es en decimal; 0x7B o 7Bh o H'7B' es en Hexadecimal; B'01111011' es en binario. ADDLW Suma un valor designado por el programador al registro W Ejemplo
ADDLW .128

Si W tena cargado un valor = .5, despus de la instruccin W tiene cargado el valor .133 Para recordar, ADD es sumar, L es Literal y W es el registro W Afecta a:

Z Se pone a 1 si la operacin es 0 DC Se pone a 1 si hubo un acarreo del bti 3 al 4 C Se pone a 1 si hubo desbordamiento, o sea, cuando se supera H'FF'

ADDWF Suma el valor del registro W con el valor de un registro cualquiera. El destino de esta suma, lo elige el programador. Ejemplo:
ADDWF TEMP,W

Si W tena guardado .133 y la pocicin de la RAM llamada TEMP tena el valor cargado con .2, W vale .135 y TEMP contina valiendo .2

Leon_Elec

Pgina 13

[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008


Ahora si hubiera puesto as:
ADDWF TEMP,F

TEMP valdra .135 y W valdra .133 Para recordar, F, es File Register Address. NOTA: Para indicar la direccin de dnde se guarda, tambin se puede poner 0 o 1 en vez de W o F. 0, corresponder guardarlo en el registro W y 1 en el registro TEMP (para este caso). Afecta a:

Z Se pone a 1 si la operacin es 0 DC Se pone a 1 si hubo un acarreo del bti 3 al 4 C Se pone a 1 si hubo desbordamiento, o sea, cuando se supera H'FF'

ANDWF Realiza la operacin AND entre W y un registro designado por el programador. El destino de esta operacin lo elije el programador. Ejemplo:
ANDWF TEMP,F

Si antes de la instruccin W vale B'11100011' y TEMP vale B'00111010' Despus de la instruccin TEMP vale B'00100010' y W vale B'11100011' Afecta a:

Z Se pone a 1 si la operacin es 0

Leon_Elec

Pgina 14

[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008

Leon_Elec

Pgina 15

[ENSAMBLADOR DESDE CERO] 7 de noviembre de 2008


Tutorial creado por Leon_Elec. Versin 1.1 Cualquier sugerencia, dudas o cualquier comentario, puedes realizarlas en el foro aqu. http://www.forosdeelectronica.com/about28343.html
Puede haber futuras actualizaciones, mejoras y contenidos.

Leon_Elec

Pgina 16

Você também pode gostar