Sie sind auf Seite 1von 12

Lenguaje Ensamblador

El lenguaje ensamblador es una herramienta que facilita al programador la


generacin de instrucciones en lenguaje mquina. El trabajo del ensamblador
es generar las secuencias de bytes deseados. Frecuentemente hay muchas
formas de lograr esta tarea. Por ejemplo, dos secuencias de bytes 0x03, 0x95
pueden declararse de las siguientes formas:

Pero no todas representan explcitamente lo que queremos que el cdigo haga.


El programador debe encargarse de que el cdigo sea totalmente legible.
EL programador tambin puede seleccionar en qu tipo de memoria se
almacenar el cdigo. Las instrucciones a ser ejecutadas son almacenadas en
la memoria FLASH. Valores constantes deben ser almacenados en la memoria
EEPROM. El ensamblador genera dos campos con este propsito, cseg y eseg,
para el almacenamiento en la memoria FLASH y EEPROM respectivamente. Las
variables son almacenadas generalmente en la SRAM. La SRAM tambin puede
contener a la memoria STACK. Ningn archivo es generado para el contenido
de la SRAM ya que estos son indefinidos cuando el programa entra en marcha.
La inicializacin de la SRAM se produce en tiempo de ejecucin. La actividad
del ensamblador relacionada con la SRAM es puramente para asignar
direcciones a identificadores. Los resultados son archivados en le map file as
como en el listing file.
El ensamblador hace un seguimiento de donde deben ser ubicados los bytes,
estos pueden ser, en el segmento de cdigo, data y EEPROM. Directivas son
usadas para decirle al ensamblador que segmento debe ser usado. Estos tres
segmentos corresponden fsicamente a tres reas de almacenamiento del
procesador.
Debido a la arquitectura tipo Harvard de estos procesadores, las instrucciones
mquinas deben ser almacenadas en la FLASH. Aunque este segmento est
diseado para almacenar instrucciones, este puede almacenar variables sin
ningn problema. La nica diferencia es que el ensamblador los usar de forma
distinta. Las instrucciones sern direccionadas con el fetched-execute cyclo, y
la data ser cargada dentro de registros. El segmento correcto para el
almacenamiento de data (valores constantes) es el EEPROM. Mientras que las
variables sern almacenadas en la SRAM, esto debido a su naturaleza voltil.
DIRECTIVAS
Las directivas le dicen al ensamblador cmo comportarse. Unas de sus
funciones es indicar en qu tipo de memoria sern almacenados los bytes
generados por el ensamblador, FLASH; EEPROM y SRAM. Las directivas le dan
al ensamblador total control del proceso.
Contadores de localizacin del ensamblador
En cada segmento de memoria un contador mantiene indicada la siguiente
direccin disponible. Estos son llamados cloc, para el segmento de cdigo;
dloc, para el segmento de data; y eloc, para el segmento de data constante. El
programador debe estar al tanto de estos contadores, ya que estos son usados
para signar la direccin a la data e instrucciones.
En la siguiente tabla podemos ver algunas de las directivas ms usados en los
procesadores AVR.
El siguiente ejemplo muestra como las directivas, cseg, eseg y dseg separan y
almacenan los bytes en los diferentes tipos de memoria. El ejemplo asume que
las direcciones de las memorias FLASh, SRAM y EEPROM son 0000, 0060 y
0000, respectivamente. No olvidar que las direcciones en la memoria FLASH
direccionan a un WORD (2 bytes) y son almacenadas de manera invertida,
mientras que las de la SRAM Y EEPROM direccionan slo a un byte.

El siguiente ejemplo no tiene alguna utilidad, pero nos servir para entender
cmo el ensamblador analiza el programa y que acciones toma con cada
sentencia.
Cuando el ensamblador en inicializado sus tres contadores internos son
inicializados tambin. El valor inicial de cloc y eloc es 0, mientras que el valor
de dloc vara dependiendo al microcontrolador que se est usando.
Interpretaremos el cdigo, asumiendo que dloc inicia con 0060.
Por defecto el segmento designado en cseg, as que si queremos iniciar con
cualquier otro segmento, debemos indicarlo.
.dseg selecciona a la SRAM como memoria de almacenamiento. El primer label,
total, indica la posicin actual de dloc, 0060. Dos bytes son separadas en este
segmento 0060 y 0061, dejando a dloc en 0062.
La directiva .cseg nos lleva a la memoria FLASH. RJMP es una instruccin de 16
bites, recordando que la memoria FLASH almacena Words (2 bytes), cloc ahora
yace en la direccin 0001. La siguiente sentencia, .org, cambia la localizacin
de cloc a 0002A, entonces el siguiente label, startup, indica a dicha direccin,
002A. La siguiente instruccin, rjmp PC, es transformada a lenguaje mquina y
almacenada en la direccin 002Ade la memoria FLASH.
.eseg selecciona la memoria EEPROM, en dnde .db separa e inicializa 4 bytes.
Despus, .dseg nos dirige a la memoria SRAM. En donde el label sum toma el
valor del valor actual de dloc, 0062 y el byte que se encuentra en esa misma
direccin es guardado para su futuro uso.
EXPRESIONES
Existen muchas tareas que haciendo en lenguaje mquina seran muy tediosas,
assembly nos ayuda a realizarlas, simplificndonos el trabajo. A continuacin
mostraremos algunas de las expresiones de sintaxis usadas en el campo de
operandos de muchas instrucciones y directivas.
El ensamblador realiza todas las operaciones usando data de 64 bites. El
resultado es luego interpretado como un byte o Word (u otro tamao de data)
como se necesite.
Smbolos y Literales
Los smbolos son definidos cuando aparecen al inicio de una lnea de cdigo
seguidos de dos puntos (:) o, tambin pueden definirse, usando la directiva .set
o .equ. Cuando un smbolo es definido con dos puntos, se le conoce como
label, a cada label se refiere a un espacio de memoria.
Literales son patrones expresados en decimal, hexadecimal, octal, o binario,
string o formato de caracter. Los literales usualmente representan nmeros,
aunque tambin pueden representar slo patrones de bits. Los caracteres
literales representan el valor numrico de cdigos ASII. Literales string
representan un array o una cadena de caracteres. En Assembly un array es
slo un bloque de bytes continuos.
En los procesadores AVR, los nmeros hexadecimales deben ser expresados
son 0x o $. Los literales binarios son indicados con el prefijo 0b, literales
octales inician con un cero. Estos literales representan un entero sin signo.
Nmero que inician con un valor diferente de cero son asumidos como
decimales. El smbolo PC es usado para representar el valor actual de contador
del segmento de cdigo (FLASH) independientemente de que segmento se
encuentre actualmente activo.
Los caracteres literales corresponden a un nico byte y son especificados
dentro de comillas. Hay secuencias de escape usadas para representar valores
de bytes especiales.

Las dos ltimas secuencias de escape, \x(valor hexadecimal) y \(valor octal)


deben ser usadas para representar un byte como un valor hexadecimal u octal.
Si el valor especificado es demasiado grande para el byte, solamente el byte
menos significativo es usado. As \651 representar al byte 0xA9, y \xFDEC
ser simplificado a 0xEC.
Hay muy pocas razones para usar estos dos formatos; siempre puedes usar el
literal numrico ms convencional para especificar valores de bytes que no
corresponden a caracteres no imprimibles o que no tienen una secuencia de
escape estander. Por otro lado, tal vez quieras enfatizar que el valor de un byte
es destinado o representa un carcter en vez de un nmero. En este caso, \0
representa el caracter nulo, mientras 0 representa el nmero cero.
Un lista de caracteres (realmente un array de caracteres) puede ser
representado como una string dentro de comillas dobles. Ninguna secuencia de
escape es reconocida en los strings, y no hay indicador de fin de string incluido
cuando el string es ensamblado. El string abc es la unin de tres secuencias
de bytes, a, b, y c. Aunque los caracteres literales pueden ser usados en
cualquier lugar es necesario un valor numrico, el formato string puede
solamente ser usado con la directiva .db.
Dos strings escritos seguidos uno de otro (sin signos de puntuacin entre ellos)
son simplemente cnectados. Esta convencin, junto conel carcter de lnea
continua (backslash al final de la lnea), permiten que largos strings sean
definidos en varias lneas.

DIRECTIVAS DE DEFINICIN DE DATA


Los valores pueden ser ensamblados a las memorias FLASH o EEPROM usando
las directivas .db, .dw, .dd, y .dq seguidos por una expresin correcta. Cuando
decimos que la data es ensamblada a FLASH o EEPROM, significa que el
ensamblador simplemente escribe estos bytes en los files ( HEX y EEPROM
files).
La directiva de definir bytes necesita un operador (o lista de operadores), cada
uno representando un byte. El valor debe star entre -128 y 255. Valores ms
grande son simplemente truncados al byte menos significativo. Nota que los
valores por encima de 127 son posibles considerando un byte como unsigned.
Puedes especificar el valor en cualquiera de los formatos literales legales,
puedes tambin usar expresiones ms complejas. Valores word, doubleword, y
quadword deben estar tambin en un rango apropiado, o el resultado ser
truncado de acuerdo al tamao especificado del contenedor.

Es comn definir un label en conjunto con las directivas .db, .dw, .dd, .dq, y
.byte. labels definidas de esta forma tendrn una valor igual a una direccin de
byte asociada (o primer byte de una directiva multibyte). No confundir el valor
del label con el contenido de la localizacin de memoria que el label
representa. En lenguaje assembly, los labels siempre representan una
direccin, nunca el valor almacenado en la direccin. As,

El label myAge ser la direccin de la palabra que contiene el nmero 50


(cincuenta), y el label myName ser la direccin del byte con cdigo ASCII para
el caracter J (0x4A), el primer carcter del string.
El ensamblador asignar direcciones secuencialmente cuando este par de
sentencias es procesado. Si los bytes son ensamblados en la FLASH, segmento
de cdigo, entonces las direcciones son direcciones de words, as el valor de
estas dos labels sern diferidos exactamente por uno. El label myName sera
asociado con el Word conteniendo la J (y el o). Si estas sentencias aparecen
en el segmento de la EEPROM, entonces las direcciones sern diferenciadas por
2; myAge ser la direccin del primer byte de la palabra que contiene el valor
50 (y esta ser almacenada en orden inverso), y myName ser la direccin del
byte conteniendo J.
Cuando se ensambla data dentro del segmento de cdigo, cada nueva directiva
.db definir los bytes de inicio en una direccin de palabra. Si es necesario, un
byte nulo (nul) ser agregado a la FLASH para obtener una direccin de
palabra. Esto es llamado padding (relleno). El ensamblador genera un warning
cada vez que un byte padding es agregado. Debido al requerimiento para el
alineamiento de un Word, las siguientes sentencias no son equivalentes:

El listing file contiene un reporte de todos los bytes ensamblados por el


ensamblador. Debes habilitar la generacin del listing file en las opciones de
proyecto o no ser creado cuando el proyecto sea ensamblado. Todos los bytes
generados en el segmento de cdigo son mostrados como palabras en el listing
report. Ya que los words son almacenados en orden inverso, la secuencia de
bytes aparecer invertida. El reporte del ejemplo anterior sera:

Si enlistamos los 6 primeros bytes en direcciones de palabras, veramos 2F 00


3C 2F 3C, si lo enlistaramos como words aparecera 002F 003C 3C2F. el
formato inverso puede ser confuso, pero necesitamos usarlo.
Operadores Usados en Expresiones
Las expresiones son usadas en muchos lugares en los programas de lenguaje
assembly. Ellos liberan al programador de la carga de llevar a cabo muchas
tediosas computaciones a mano. Hay bastantes operadores usados para formar
expresiones. Los operadores ms comunes son mostrados en la siguiente tabla:
Asociado a cada operador es un nivel de prioridad o precedencia. Los
operadores de alta precedencia son evaluadas primero. Los parntesis pueden
ser usados como requerimiento para forzar un orden la evaluacin de una
especfica operacin. Las operaciones son asociadas de izquierda a derecha (en
caso de igual precedencia).
Un malentendido comn respecto al uso de operadores en expresiones de
lenguaje assembly se debe a una diferencia fundamental en el significado de
tales expresiones y las expresiones en lenguajes de alto nivel. Cuando el
compilador encuentra una expresin en una sentencia tal como (3*x + 1), este
no es responsable de evaluar la expresin, pero por otro lado genera las
instrucciones mquina que causan la evaluacin para que esto ocurra en
tiempo de ejecucin.
Los clculos que envuelven a los labels y PC no siempre son significativos, pero
pueden llegar a ser muy tiles. Un ejemplo sera la diferencia entre dos labels,
esto nos puede ayudar a saber el tamao de un bloque de memoria. Las
direcciones deben estar en el mismo segmento (code, data, or eeprom) o la
operacin no tendr sentido. La substraccin de dos labels ambos localizados
en el segmento de cdigo representa el nmero de words intermedio,
substrayendo dos labels ambos localizados en una de las otras dos memorias
da el nmero de bytes entre las direcciones. Considere las siguientes
sentencias, asumiendo que estn en el segmento de cdigo.

La primera sentencia crea un array en cdigo ASCII, iniciando en la direccin


representada por el label letters. Puedes ver que 7 bytes son requeridos para
las letras; sin embargo, un byte extra es agregado para preservar el
alineamiento de Word. Cuando la expresin PC letters es calculada por el
ensamblador, la diferencia es 4. Esto es porque el array ocupa 7 (8 con el
padding) bytes los cuales son exactamente 4 words. Las direcciones de
segmento de cdigo son siempre direcciones de palabras cuando se asignan
por el ensamblador. As, el byte asignado al label numLetters mantendr el
valor de 4. Este valor es computado por el ensamblador. Puedes fijar la
expresin para representar el nmero de bytes en el string escribiendo (PC-
letters)*2. En este caso, el valor de 8 sera ensamblado en la localizacin de
memoria llamada numLetters. Un programa usando esta cadena tendra que
notar que la ltima (letra es en grupo de 8 fue nula (null $00) y no considerarla
como parte del string.
Se cuidadoso con las expresiones que involucran PC, PC siempre representa la
localizacin del contador en el cdigo de segmento. Esto nunca refiere a la
posicin en la SRAM (dseg) o EEPROM (eseg), por ellos es errneo usarlo en
estos segmentos. En el ejemplo anterior, numLetters sera totalmente
inservible si ests sentencias aparecieran en la eeprom. Las siguientes
sentencias seran las correctas:

Funciones usadas en Expresiones


En adicin a los operados ya cubiertos, hay muchas funciones que son tiles
para construir expresiones. Las funciones ms comunes son las funciones high
y low las cuales retornan los bytes de mayor y menor orden de una expresin.
La funcin byte2 es un sinnimo para la funcin high. Hay tambin funciones
llamadas byte3, byte4, lwrd, y hwrd. La funcin abs es otra funcin comn,
esta computa el valor absoluto de una expresin.
El uso de las expresiones sern ilustradas en los programas siguientes. No
necesitas usar todas estas caracteriticas para escribir programas en lenguaje
assembly, pero el uso efectivo de ellas puede hacer que escribir programas sea
ms fcil y ms interesante. Las expresiones tambin documentan como el
valor es determinado, eliminando misterio y asegurando exactitud. Muchos
programas en assembly hacen uso extenso del poder de las facilidades de
evaluacin de las expresiones del ensamblador.
Mantn en mente el hecho de que el uso de las expresiones de sentencias en
assembly no hace ms lento el programa final. Todas las expresiones son
completamente evaluadas en tiempo de ensamblaje. Ni una es evaluada por el
procesador AVR. Las instrucciones generadas por estas dos sentencias sern
exactamente las mismas?
ldi R16, 1
ldi R16, (45 + 92/7)%7 1

INSTRUCCIONES
Los programas en lenguaje assembly se componen de dos partes principales:
data, definida como reservada, e instrucciones mquina que son ejecutadas
por el procesador. Las instrucciones que son ejecutadas son cdigos binarios,
pero en lenguaje assembly con usualmente expresadas con una instruccin
mnemonic. Cada instruccin mquina es representada por al menos un
nmnemonic. En algunos casos, dos diferente mnemocis representan la misma
instruccin mquinam y ambas pueden ser usadas, pero en diferentes
contextos una representada mejor la accin del programador. Mnemonics
pueden requerir operandos que permiten al ensamblador llenar los detalles
requeridos por la instruccin.
El propsito de cada instruccin mquina, cuando es ejecutada, es causar
algn cambio en el estado de uno de los recursos controlados por el
procesador. Nosotros ha hemos discutido el hecho de que los
microcontroladores AVR tienen 32 registros de 8 bits y alguna cantidad de RAM
donde la data puede ser almacenada durante la ejecucin. El procesador AVR
tiene muchas instrucciones que pueden establecer o cambiar la data en estos
registros o la RAM.
Veremos el significado de las siguientes instrucciones en ms detalle en los
siguientes captulos donde ellas son agrupadas por funcionalidad. Aqu
nosotros simplemente vemos un pequeo ejemplo de sentencias comunes en
assembly y sus correspondientes instrucciones mquina. Usando estas
sentencias en un programa causar que el ensamblador ensamble el cdigo
mquina de 16 o 32 bits por cada instruccin y los mostrar a la salida del hex
y object file. Puedes encontrar una completa lista de todas las instrucciones de
AVR en documentacin del fabricante. Esta lista est tambin disponible en el
men help de Atmel Studio.

Cuando lees un programa en lenguaje assembly, puedes notar que hay dos
convenciones por definir labels. Una es poner cada definicin de label en una
misma lnea.

La otra es combinar la definicin de label con otra instruccin en lenguaje


assembly (directiva o instruccin mnemonic).

No hay diferencia alguna en el resultado. Un label en una lnea refiere al


siguiente byte generado por una sentencia subsecuente en el mismo
segmento. En general, labels son usados solamente en instrucciones (o
localizacin de data) que deben ser referidas por direccin desde otro lugar en
el programa. Estas sern usadas para convenientemente implementar bucles,
seleccionar estructuras, y funciones, as como acceder a data almacenada en
varias memorias.
Zero-Operand Instructions
Algunas instrucciones son muy simples en sus requerimientos de sintaxis; ellas
son representadas slo por un nmonic. Tales instrucciones son llamadas zero-
operand instructions. El recurso que ellos afectan es implicado por la
instruccin. Ya que no hay operadores, el ensamblaje de esta instruccin
siempre resultar en el mismo patrn de bits, el cdigo de operacin (opcode)
para estas instrucciones es de 16 bits. A continuacin se muestran algunas de
estas instrucciones.

Das könnte Ihnen auch gefallen