El lenguaje ensamblador es aquel que generalmente, ofrecen las empresas de manera gratis para programar sus dispositivos y es el que el que se ajusta al control de registros y arquitectura del propio dispositivo.
Es por ello que es importante siempre, tenerlo en cuenta, a veces, para micros adaptados para trabajar con lenguaje de medio-alto nivel, no es necesario un conocimiento extenso sobre el lenguaje ensamblador pero como ya he mencionado, siempre es útil para el diseñador el tenerlo presente para optimizar ciertas partes de código que son críticas en nuestros proyectos.
En este capítulo, se tratará el lenguaje ensamblador para la familia de dispositivos MSP430 de la empresa TI, las características principales son:
- Un total de 27 instrucciones.
- Adicionalmente, existen 24 instrucciones que son emuladas. Esto quiere decir que no son instrucciones en sí, más bien son códigos para ayudar al diseñador a entender mejor el flujo de programa que a la hora de compilar, se generarán las instrucciones correspondientes a las emuladas. Funcionan cómo si fueran Macros.
- Cada instrucción tiene su propio op-code (código de identificación) decodificado por la CPU.
Si no se especifica la extensión a la hora de escribir nuestras instrucciones, el compilador supondrá que son del tipo word. Pasaremos a detallar mediante los grupos anteriormente descritos, las distintas instrucciones de código que tenemos para trabajar con la familia de microcontroladores MSP430.
Instrucciones de Doble-Operando.
El formato es de este tipo de instrucciones, es el que se muestra a continuación:
..15.. | ..14.. | ..13.. | ..12.. | ..11.. | ..10.. | ..9.. | ..8.. | ..7.. | ..6.. | ..5.. | ..4.. | ..3.. | ..2.. | ..1.. | ..0.. |
Op-Code | S-REG | Ad | B/W | As | D-REG |
La lista de instrucciones que corresponden a este grupo es:
Nemotécnico | S-Reg, D-Reg | Operación | STATUS Bits | |||
V | N | Z | C | |||
MOV (.B) | src, dst | src → dst | - | - | - | - |
ADD (.B) | src, dst | src + dst → dst | * | * | * | * |
ADDC (.B) | src, dst | src + dst + C → dst | * | * | * | * |
SUB (.B) | src, dst | dst + .not.src + 1 → dst | * | * | * | * |
SUBC (.B) | src, dst | dst + .not.src + C → dst | * | * | * | * |
CMP (.B) | src,dst | dst − src | * | * | * | * |
DADD (.B) | src, dst | src + dst + C → dst (decimal) | * | * | * | * |
BIT (.B) | src, dst | src .and. dst | 0 | * | * | * |
BIC (.B) | src, dst | .not.src .and. dst → dst | - | - | - | - |
BIS (.B) | src, dst | src .or. dst → dst | - | - | - | - |
XOR (.B) | src, dst | src .xor. dst → dst | * | * | * | * |
AND (.B) | src, dst | src .and. dst → dst | 0 | * | * | * |
TI nos indica que las instrucciones CMP y SUB son idénticas excepto del almacenamiento del resultado, lo mismo ocurre con las instrucciones BIT y AND.
Instrucciones de Simple-Operando.
El formato es de este tipo de instrucciones, es el que se muestra a continuación:
..15.. | ..14.. | ..13.. | ..12.. | ..11.. | ..10.. | ..9.. | ..8.. | ..7.. | ..6.. | ..5.. | ..4.. | ..3.. | ..2.. | ..1.. | ..0.. |
Op-Code | B/W | Ad | D/S-REG |
La lista de instrucciones que corresponden a este grupo es:
Nemotécnico | S-Reg, D-Reg | Operación | STATUS Bits | |||
V | N | Z | C | |||
RRC (.B) | dst | C → MSB →.......LSB → C | * | * | * | * |
RRA (.B) | dst | MSB → MSB →....LSB → C | 0 | * | * | * |
PUSH (.B) | src | SP − 2 → SP, src → @SP | - | - | - | - |
SWPB | dst | Intercambio de bytes | - | - | - | - |
CALL | dst | SP − 2 → SP, PC+2 → @SP dst → PC | - | - | - | - |
RETI | TOS → SR, SP + 2 → SP TOS → PC, SP + 2 → SP | * | * | * | * | |
SXT | dst | Bit 7 → Bit 8........Bit 15 | 0 | * | * | * |
Todos los modos de direccionamiento son posibles con la instrucción CALL. Si es simbólico (dirección), inmediato (#N), absoluto (&EDE) o indexado: x(RN), la palabra siguiente contiene la información de la dirección.
Instrucciones de Salto.
El formato es de este tipo de instrucciones, es el que se muestra a continuación:
..15.. | ..14.. | ..13.. | ..12.. | ..11.. | ..10.. | ..9.. | ..8.. | ..7.. | ..6.. | ..5.. | ..4.. | ..3.. | ..2.. | ..1.. | ..0.. |
Op-Code | C | 10-Bit PC Offset |
La lista de instrucciones que corresponden a este grupo es:
Nemotécnico | S-Reg, D-Reg | Operación | Interpretación |
JEQ/JZ | Label | Salta a la etiqueta si Z = 1 | ¿Es igual ==? |
JNE/JNZ | Label | Salta a la etiqueta si Z = 0 | ¿Es distinto !=? |
JC/JHS | Label | Salta a la etiqueta si C = 1 | ¿Hay acarreo? |
JNC/JLO | Label | Salta a la etiqueta si C = 0 | ¿No hay acarreo? |
JN | Label | Salta a la etiqueta si N = 1 | ¿Negativo? |
JGE | Label | Salta a la etiqueta si (N .XOR. V) = 0 | ¿Es mayor o igual >=? |
JL | Label | Salta a la etiqueta si (N .XOR. V) = 1 | ¿Es menor? |
JMP | Label | Salta a la etiqueta | Salto incondicional |
Los saltos condicionales no afectan a los bits de estado. Es posible saltar desde posiciones de tamaño palabra de -511 hasta 512 en relación al valor del PC.
Como ya hemos mencionado anteriormente, también existen instrucciones emuladas cuyo único propósito es ayudar al diseñador a la hora de entender mejor en flujo de programa, las instrucciones son las que se muestran a continuación:
Instrucción | Explicación | Emula a: | STATUS Bits | |||
V | N | Z | C | |||
ADC (.B) dst | Suma el acarreo a dst | ADDC(.B) #0,dst | * | * | * | * |
BR dst | Salto indirecto a dst | MOV dst,PC | - | - | - | - |
CLR (.B) dst | Poner a '0' dst | MOV(.B) #0,dst | - | - | - | - |
CLRC | Poner a '0' bit C | BIC #1,SR | - | - | - | 0 |
CLRN | Poner a '0' bit N | BIC #4,SR | - | 0 | - | - |
CLRZ | Poner a '0' bit Z | BIC #2,SR | - | - | 0 | - |
DADC (.B) dst | Suma decimal el acarreo a dst | DADD(.B) #0,dst | * | * | * | * |
DEC (.B) dst | Decremento en una unidad dst | SUB(.B) #1,dst | * | * | * | * |
DECD (.B) dst | Decremento en dos unidades dst | SUB(.B) #2,dst | * | * | * | * |
DINT | Desactiva las interrupciones | BIC #8,SR | - | - | - | - |
EINT | Activa las interrupciones | BIS #8,SR | - | - | - | - |
INC (.B) dst | Incremento en una unidad dst | ADD(.B) #1,dst | * | * | * | * |
INCD (.B) dst | Incremento en dos unidades dst | ADD(.B) #2,dst | * | * | * | * |
INV (.B) dst | Invierte dst | XOR(.B) #-1,dst | * | * | * | * |
NOP | Sin operación | MOV R3,R3 | - | - | - | - |
POP dst | Sacar operando de la pila | MOV @SP+,dst | - | - | - | - |
RET | Vuelta desde una subrutina | MOV @SP+,PC | - | - | - | - |
RLA (.B) dst | Desplazamiento artimetico a derechas de dst. | ADD(.B) dst,dst | * | * | * | * |
RLC (.B) dst | Desplazamiento lógico con acarreo a derechas de dst. | ADDC(.B) dst,dst | * | * | * | * |
SBC (.B) dst | Restar acarreo desde dst | SUBC(.B) #0,dst | * | * | * | * |
SETC | Poner a '1' bit C | BIS #1,SR | - | - | - | 1 |
SETN | Poner a '1' bit N | BIS #4,SR | - | 1 | - | - |
SETZ | Poner a '1' bit Z | BIS #2,SR | - | - | 1 | - |
TST(.B) dst | ¿dst == 0? | CMP(.B) #0,dst | 0 | * | * | 1 |
Para desarrollar código en lenguaje ensamblador, lo ideal y más fácil será trabajar con las propias instrucciones combinadas con las emuladas.
Los campos y definiciones que se han utilizado en este capítulo se detallan a continuación su significado:
· src ≡ Fuente.
· dst ≡ Destino.
· As ≡ Bits responsables del modo de direccionamiento utilizado para la fuente (src).
· S-Reg ≡ Registro de trabajo utilizado por la fuente (src).
· Ad ≡ Bits responsables del modo de direccionamiento utilizado para el destino (dst).
· D-Reg ≡ Registro de trabajo utilizado por el destino (dst).
· B/W ≡ Operación Bit o Word. Si es 0 corresponde a una operación Word, 1 a operación Bit.
Para el registro STATUS, los símbolos empleados en este capítulo se detallan a continuación:
* ≡ El bit STATUS sufre cambios.
- ≡ El bit STATUS no sufre cambios.
0 ≡ El bit STATUS se pone a cero.
1 ≡ El bit STATUS se pone a uno.
6 comentarios:
Hola,
Excelente el resumen del ensamblador del MSP430, me alegra encontrar a "fans" de este microcontrolador que publiquen en castellano.
Hace poco escribí yo en mi blog un resumen del funcionamiento de este micro, sin entrar al trapo de su ensamblador como tú. Te dejo el link por si es de tu interés: http://www.javierlongares.com/arte-en-8-bits/msp430-una-guia-de-referencia-en-castellano/
Saludos cordiales
Buenas Javier:
La verdad es que este microcontrolador, ya sea por sus características (especialmente la de bajo consumo) o por su precio o por tener una gran empresa (Texas Instruments) que lo respalda, es bastante útil y fácil de usar para los que trabajamos en estos menesteres.
Un saludo.
Holas, soy estudiante de ingeniería electrónica. Me pidieron estudiar el ISA MSP430, quiero hacer un algoritmo que encuentre el máximo en un vector de 12 elementos, no he sido capaz,¿ me podrían ayudar?
Buenas Davi Merlotte:
Para obtener el máximo de un vector de 12 elementos, simplemente tienes que empezar por el primer elemento del vector y almacenarlo en una variable auxiliar.
Posteriormente, dicha variable auxiliar se irá comparando con el siguiente elemento del vector, en caso de ser mayor la variable auxiliar, pasamos al siguiente elemento del vector, en caso contrario, se almacena el valor en la variable auxiliar y pasamos a la siguiente posición del vector y a seguir comprobando, hasta llegar al final.
Ese es el algoritmo para el propósito que pides.
Un saludo.
Buenas tardes!
Perdón pero necesito hacer una secuencia de leds, la idea es controlar un motor a pasos, pero segun entiendo si logro hacer la secuencia de leds, el control del motor se vuelve algo sumamente sencillo. Lo necesito hacer en ensamblador, ojalá alguien pudiera echarme una mano explicandome como poner entradas y salidas, y el tiempo en el que el led dura encendido.
De antemano,muchas gracias
Buenas Dieb Seelen:
Para encender o apagar leds simplemente tendrás que configurar el puerto que quieres emplear (P0, P1, ect) para tal fin (las patitas que quieras usar de dicho puerto).
Una vez configuradas las patitas del puerto escogido como salida, ya puedes activar cualquier patita en alta o baja.
Respecto al tiempo que deberán estar encendidas, puedes emplear el uso de temporizadores (Timer).
· PD: Perdón por la respuesta tardía.
Un saludo.
Publicar un comentario