sábado, 9 de octubre de 2010

MSP430: Lenguaje Ensamblador

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.
Las instrucciones se dividen en tres grupos: Doble Operando, Simple Operando y de Salto. Todas las instrucciones de único-operando y doble-operando pueden ser usadas cómo instrucciones tipo byte o word mediante las extensiones .b o .w respectivamente.

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-CodeS-REG
Ad
B/W
As
D-REG

La lista de instrucciones que corresponden a este grupo es:

NemotécnicoS-Reg, D-Reg
OperaciónSTATUS Bits
V
N
Z
C
MOV (.B)
src, dst
src → dst
-
-
-
-
ADD (.B)
src, dst
src + dst → dst
*
*
*
*
ADDC (.B)
src, dstsrc + 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-CodeB/WAdD/S-REG

La lista de instrucciones que corresponden a este grupo es:

NemotécnicoS-Reg, D-Reg
OperaciónSTATUS Bits
V
N
Z
C
RRC (.B)
dst
C → MSB →.......LSB → C
*
*
*
*
RRA (.B)
dst
MSB → MSB →....LSB → C
0
*
*
*
PUSH (.B)
srcSP − 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-CodeC10-Bit PC Offset

La lista de instrucciones que corresponden a este grupo es:

NemotécnicoS-Reg, D-Reg
OperaciónInterpretación
JEQ/JZ
Label
Salta a la etiqueta si Z = 1
¿Es igual ==?
JNE/JNZ
LabelSalta a la etiqueta si Z = 0
¿Es distinto !=?
JC/JHS
LabelSalta a la etiqueta si C = 1
¿Hay acarreo?
JNC/JLO
LabelSalta a la etiqueta si C = 0
¿No hay acarreo?
JN
LabelSalta a la etiqueta si N = 1
¿Negativo?
JGE
LabelSalta a la etiqueta si (N .XOR. V) = 0
¿Es mayor o igual >=?
JL
LabelSalta a la etiqueta si (N .XOR. V) = 1¿Es menor?
JMP
LabelSalta 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ónExplicació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 NBIC #4,SR
-
0
-
-
CLRZ
Poner a '0' bit ZBIC #2,SR
-
-
0
-
DADC (.B) dstSuma decimal el acarreo a dstDADD(.B) #0,dst
*
*
*
*
DEC (.B) dst
Decremento en una unidad dst
SUB(.B) #1,dst
*
*
*
*
DECD (.B) dst
Decremento en dos unidades dstSUB(.B) #2,dst
*
*
*
*
DINT
Desactiva las interrupciones
BIC #8,SR
-
-
-
-
EINT
Activa las interrupciones
BIS #8,SR
-
-
-
-
INC (.B) dst
Incremento en una unidad dstADD(.B) #1,dst
*
*
*
*
INCD (.B) dst
Incremento en dos unidades dstADD(.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 CBIS #1,SR
-
-
-
1
SETN
Poner a '1' bit NBIS #4,SR
-
1
-
-
SETZ
Poner a '1' bit ZBIS #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:

Javier Longares dijo...

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

Unknown dijo...

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.

Anónimo dijo...

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?

Unknown dijo...

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.

Dieb Seelen dijo...

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

Unknown dijo...

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.