Hier gibt es eine Übersicht aller Assembler-Befehle für den MSP430. Insgesmt bietet der MSP430 27 Hauptbefehle und 24 emulierte Befehle. Die emulierten Befehle sollen für eine bessere Code-Übersicht sorgen bzw. das Programmieren leichter und schneller machen.
Die Befehle werden in 3 Gruppen geordnet:
- Dual-operand
- Single-operand
- Jump
Der MSP430 ist ein 16bit-Prozessor, bietet also die Möglichkeit zwischen Byte (8bit) und Word (16bit) Befehlen zu unterscheiden. Dazu wird hinter dem ASM-Befehl “.w” oder “.b” geschrieben. Wird keine Ergänzung hinter einem ASM-Befehl geschrieben, wird standardmäßig von einem “Word”-Befehel ausgegangen (Vorsicht ist hier geboten! Solche Fehler findet man (je nachdem wie lang der Code ist, sehr schwer).
Status-Bits:
- V = Overflow-Flag
- N = Negative-Flag
- Z = Zero-Flag
- C = Carry
1. Dual-Operand-Instructions (Zweifach-Operand-Befehle)
1.1 Übersicht
Status-Bits | ||||||
Mnemonic | Source/Destination | Operation | V | N | Z | C |
MOV | src,dst | src = dst | no | no | no | no |
ADD | src,dst | dst = src + dst | yes | yes | yes | yes |
ADDC | src,dst | dst = src + dst + C | yes | yes | yes | yes |
SUB | src,dst | dst = dst – src | yes | yes | yes | yes |
SUBC | src,dst | dst = dst – src – C | yes | yes | yes | yes |
CMP | src,dst | dst – src | yes | yes | yes | yes |
DADD | src,dst | dst = src + dst + C | yes | yes | yes | yes |
BIT | src,dst | src & dst | cleared | yes | yes | yes |
BIC | src,dst | dst = !src & dst | no | no | no | no |
BIS | src,dst | dst = src | dst | no | no | no | no |
XOR | src,dst | dst = src ^ dst | yes | yes | yes | yes |
AND | src,dst | dst = src & dst | cleared | yes | yes | yes |
Info:
no | = | Status-Bit wird nicht verändert |
yes | = | Status-Bit wird verändert |
set | = | Status-Bit wird gesetzt (1) |
cleared | = | Status-Bit wird geleert (0) |
1.2 Kurzbeschreibung der Befehle
MOV (move) | Kopiere Quelle in das Ziel |
ADD (addition) | Addiere Quelle und Ziel, Ergebnis im Ziel |
ADDC | Addiere Quelle, Ziel und Carry; Ergebnis im Ziel |
SUB (subtract) | Subtrahiere Ziel von Quelle, Ergebnis im Ziel |
SUBC | Subtrahiere Ziel von Quelle und subtrahiere das Carry, Ergebnis im Ziel |
CMP (compare) | Vergleiche Ziel und Quelle, Ergebnis in Status-Bits |
DADD | Addiere Quelle und Ziel (dezimal) |
BIT (bit-test) | Teste ob ein bestimmtes Bit(s) (Quelle) gesetzt ist/sind (Ziel), Ergebnis in Status-Bits |
BIC (bit-clear) | Leere Bit(s) (Quelle) im Ziel |
BIS (bit-set) | Setze Bit(s) (Quelle) im Ziel |
XOR | Eine XOR-Verknüpfung zwischen Quelle und Ziel (Toggle), Ergebnis im Ziel |
AND | UND-Verknüpfung zwischen Quelle und Ziel, Ergebnis im Ziel |
2. Single-Operand-Instructions (Einzel-Operand-Befehle)
2.1 Übersicht
Status-Bits | ||||||
Mnemonic | Source/Destination | Operation | V | N | Z | C |
RRC | dst | rotate through carry (right) | yes | yes | yes | yes |
RRA | dst | dst = dst >> 1 (arithmetically) | cleared | yes | yes | yes |
PUSH | src | SP = SP -2 ; @SP = PC + 2 | no | no | no | no |
SWPB | dst | Bits 15 to 8 <-> Bits 7 to 0 | no | no | no | no |
CALL | dst | SP = SP -2 ; @SP = PC + 2 | no | no | no | no |
RETI | yes | yes | yes | yes | ||
SXT | dst | Bit 8 to Bit 15 = Bit 7 | cleared | yes | yes | yes |
Info:
no | = | Status-Bit wird nicht verändert |
yes | = | Status-Bit wird verändert |
set | = | Status-Bit wird gesetzt (1) |
cleared | = | Status-Bit wird geleert (0) |
2.2 Kurzbeschreibung der Befehle
RRC (rotate right carry) | Rotiere nach rechts durch das Carry, es wird ein Bit nach rechts geschoben (LSB landet im Carry danach in MSB) |
RRA (rotate right arithmetically) | Das selbe wie RRC aber ohne Carry |
PUSH | Es wird ein Byte/Word auf das Stack gelegt |
SWPB (swap bytes) | Bit 15 bis 8 werden mit Bit 7 bis 0 vertauscht/gewechselt |
CALL | Rufe ein Unterprogramm auf |
RETI (return from interrupt) | Falls ein Interrupt ausgelöst wurde, wird wieder in die Hauptroutine zurück gesprungen |
SXT (extend sign) | Bit 7 wird in Bit 8 bis Bit 15 geschrieben |
3. Jump-Instructions (Sprung-Befehle)
3.1 Übersicht
Status-Bits | ||||||
Mnemonic | Source/Destination | Operation | V | N | Z | C |
JEQ/JZ | Label | Jump to label if zero bit is set | / | / | / | / |
JNE/JNZ | Label | Jump to label if zero bit is reset | / | / | / | / |
JC | Label | Jumpf to label if carry bit is set | / | / | / | / |
JNC | Label | Jump to label if carry bit is reset | / | / | / | / |
JN | Label | Jump to label if negative bit is set | / | / | / | / |
JGE | Label | Jump to label if (N ^ V) = 0 | / | / | / | / |
JL | Label | Jump to label if (N ^ V ) = 1 | / | / | / | / |
JMP | Label | Jump to label unconditionally | / | / | / | / |
3.2 Kurzbeschreibung der Befehle
JEQ/JZ (jump euqal / jump zero) | Springe zum Label falls das Zero-Bit = 1 / Springe falls gleich |
JNE/JNZ (jump not equal / jump not zero) | Springe zum Label falls das Zero-Bit = 0 / Springe falls ungleich |
JC (jump carry) | Springe zum Label falls Carry = 1 |
JNC (jump not carry) | Springe zum Label falls Carry = 0 |
JN (jump negative) | Springe zum Label falls Negative-Flag=1 |
JGE (jump greater equal) | Springe zum Label falls größer oder gleich |
JL (jump less) | Springe zum Label falls kleiner |
JMP (jump) | Springe zum Label (IMMER) |
4. Emulated-Instructions (Emulierte-Befehle)
4.1 Übersicht
Status-Bits | |||||||
Mnemonic | Src/Dst | Basic-Instruction | Operation | V | N | Z | C |
ADC | dst | ADDC #0,DST | dst = dst + Carry | yes | yes | yes | yes |
BR | dst | MOV @PC+,PC | PC = dst | no | no | no | no |
CLR | dst | MOV #0,DST | dst = 0 | no | no | no | no |
CLRC | dst | BIC #1,SR | C = 0 | no | no | no | cleared |
CLRN | dst | BIC #4,SR | N = 0 | no | cleared | no | no |
CLRZ | dst | BIC #2,SR | Z = 0 | no | no | cleared | no |
DADC | dst | DADD #0,DST | dst (decimally) = dst + C | yes | yes | yes | yes |
DEC | dst | SUB #1,DSTSUB R3,DST | dst = dst – 1 | yes | yes | yes | yes |
DECD | dst | SUB #2,DST | dst = dst – 2 | yes | yes | yes | yes |
DINT | GIE = 0 | no | no | no | no | ||
EINT | GIE = 1 | no | no | no | no | ||
INC | dst | ADD #1,DSTADD 0(R3),DST | dst = dst + 1 | yes | yes | yes | yes |
INCD | dst | ADD #2,DST | dst = dst + 2 | yes | yes | yes | yes |
INV | dst | XOR 0xFFFF,DST | dst = !dst | yes | yes | yes | yes |
NOP | MOV R5,R5 | no | no | no | no | ||
POP | dst | dst = @SP ; SP = SP + 2no | no | no | no | no | |
RET | PC = @SP ; SP = SP + 2 | no | no | no | no | ||
RLA | dst | ADD DST.DST | dst = dst << 1 | yes | yes | yes | yes |
RLC | dst | ADDC DST,DST | dst = (dst,C) << 1 | yes | yes | yes | yes |
SBC | dst | SUBC #0,DST | dst = dst + 0xFFFF + C | yes | yes | yes | yes |
SETC | BIS #1,SR | C = 1 | no | no | no | set | |
SETN | BIS #4,SR | N = 1 | no | set | no | no | |
SETZ | BIS #2,SR | Z = 1 | no | no | set | no | |
TST | dst | CMP #0,DST | N = (dst < 0) ; Z = (dst == 0) | cleared | yes | yes | set |
Die Befehle in der “Basic-Instructions”-Spalte sind nur Vorschläge wie es mit den Basis-Instruktionen gelöst werden könnte. Der DEC-Befehl wird z.B. über das Konstantenregister R3 nachgebildet (-1,0,1,2). Somit gibt es dort mehrere Möglichkeiten.
Eine Übersicht (mit ausführlicher Beschreibung und kurzen Beispielen) gibt es im User-Guide (MSP430x2xx Family), ab Seite 56.