Система команд MSP430
Ядро MSP430 — 16-битный RISC с 27 основными командами, которые работают с любыми из семи режимов адресации. Ещё 24 удобные команды ассемблер превращает в основные. Ниже — все команды с операциями и флагами, режимы адресации, генератор констант, форматы кодов и время выполнения по руководству TI.
Обновлено Редакция GAW
Ядро MSP430 описано в главе 3 руководства TI SLAU144K: 16 регистров по 16 бит, 16-битные шины адреса и данных и ортогональная система команд — любую команду можно использовать с любым режимом адресации. Регистры, память и режимы работы разобраны в статье «Архитектура MSP430».
Регистры
| Регистр | Назначение |
|---|---|
| R0 (PC) | счётчик команд, всегда чётный |
| R1 (SP) | указатель стека, всегда чётный; стек растёт вниз |
| R2 (SR, CG1) | регистр состояния; в отдельных режимах — генератор констант |
| R3 (CG2) | генератор констант |
| R4–R15 | регистры общего назначения |
Флаги регистра состояния: C (перенос, бит 0), Z (ноль, бит 1), N (знак, бит 2), V (переполнение, бит 8). Биты GIE, CPUOFF, OSCOFF, SCG0 и SCG1 управляют прерываниями и режимами пониженного потребления.
Режимы адресации
Для источника есть семь режимов, для приёмника — четыре (As — биты режима источника, Ad — приёмника):
| As/Ad | Режим | Запись | Операнд |
|---|---|---|---|
| 00/0 | регистровый | Rn | содержимое регистра |
| 01/1 | индексный | X(Rn) | по адресу Rn + X; X — в следующем слове |
| 01/1 | символьный | ADDR | по адресу PC + X — индексный с PC |
| 01/1 | абсолютный | &ADDR | по адресу из следующего слова — индексный с SR, где SR даёт ноль |
| 10/– | косвенный регистровый | @Rn | по адресу из Rn |
| 11/– | косвенный с автоинкрементом | @Rn+ | по адресу из Rn, затем Rn увеличивается на 1 для .B и на 2 для .W |
| 11/– | непосредственный | #N | константа из следующего слова — это @PC+ |
Для приёмника доступны только регистровый, индексный, символьный и абсолютный режимы; косвенные режимы — лишь для источника.
Генератор констант
Шесть частых констант берутся из R2 и R3 без дополнительного слова кода:
| Регистр | As | Константа |
|---|---|---|
| R2 | 10 | +4 |
| R2 | 11 | +8 |
| R3 | 00 | 0 |
| R3 | 01 | +1 |
| R3 | 10 | +2 |
| R3 | 11 | −1 (0FFFFh) |
R2 с As = 00 — обычный регистр SR, с As = 01 даёт абсолютную адресацию. Ассемблер подставляет генератор констант сам, когда видит одно из этих чисел в непосредственном операнде.
Двухоперандные команды (формат I)
Формат: биты 15–12 — код операции, 11–8 — регистр источника, 7 — Ad, 6 — B/W, 5–4 — As, 3–0 — регистр приёмника. Обозначения флагов: * — меняется, 0 — сбрасывается, – — не меняется.
| Код | Команда | Операция | V | N | Z | C |
|---|---|---|---|---|---|---|
| 4xxx | MOV(.B) src,dst | src → dst | – | – | – | – |
| 5xxx | ADD(.B) src,dst | src + dst → dst | * | * | * | * |
| 6xxx | ADDC(.B) src,dst | src + dst + C → dst | * | * | * | * |
| 7xxx | SUBC(.B) src,dst | dst + not.src + C → dst | * | * | * | * |
| 8xxx | SUB(.B) src,dst | dst + not.src + 1 → dst | * | * | * | * |
| 9xxx | CMP(.B) src,dst | dst − src, результат не сохраняется | * | * | * | * |
| Axxx | DADD(.B) src,dst | src + dst + C → dst в двоично-десятичном коде | * | * | * | * |
| Bxxx | BIT(.B) src,dst | src and dst, результат не сохраняется | 0 | * | * | * |
| Cxxx | BIC(.B) src,dst | not.src and dst → dst | – | – | – | – |
| Dxxx | BIS(.B) src,dst | src or dst → dst | – | – | – | – |
| Exxx | XOR(.B) src,dst | src xor dst → dst | * | * | * | * |
| Fxxx | AND(.B) src,dst | src and dst → dst | 0 | * | * | * |
CMP отличается от SUB, а BIT от AND только тем, что результат не записывается. BIS и BIC — основной способ устанавливать и сбрасывать биты в регистрах периферии, они не меняют флаги.
Однооперандные команды (формат II)
| Код | Команда | Операция | V | N | Z | C |
|---|---|---|---|---|---|---|
| 1000h / 1040h | RRC(.B) dst | сдвиг вправо через перенос: C → старший бит … младший бит → C | * | * | * | * |
| 1080h | SWPB dst | обмен байтов слова | – | – | – | – |
| 1100h / 1140h | RRA(.B) dst | арифметический сдвиг вправо, старший бит сохраняется, младший → C | 0 | * | * | * |
| 1180h | SXT dst | расширение знака: бит 7 → биты 8–15 | 0 | * | * | * |
| 1200h / 1240h | PUSH(.B) src | SP − 2 → SP, src → @SP | – | – | – | – |
| 1280h | CALL dst | SP − 2 → SP, PC + 2 → @SP, dst → PC | – | – | – | – |
| 1300h | RETI | SR и PC восстанавливаются из стека | * | * | * | * |
Коды указаны без полей операнда: младшие биты задают режим адресации и регистр. RRA, RRC, SWPB и SXT нельзя использовать с непосредственным операндом — TI предупреждает, что результат непредсказуем.
Переходы
| Код | Команда | Условие перехода |
|---|---|---|
| 2000h | JNE / JNZ | Z = 0 |
| 2400h | JEQ / JZ | Z = 1 |
| 2800h | JNC / JLO | C = 0 |
| 2C00h | JC / JHS | C = 1 |
| 3000h | JN | N = 1 |
| 3400h | JGE | N xor V = 0 |
| 3800h | JL | N xor V = 1 |
| 3C00h | JMP | всегда |
Переход относительный: 10-битное знаковое смещение удваивается и прибавляется к адресу следующей команды, PCnew = PCold + 2 + смещение · 2. Дальность — от −511 до +512 слов. Переходы не меняют флаги. Для перехода дальше используют BR — то есть MOV в PC.
Эмулируемые команды
| Команда | Действие | Заменяется на |
|---|---|---|
| ADC(.B) dst | dst + C → dst | ADDC #0,dst |
| BR dst | переход по адресу | MOV dst,PC |
| CLR(.B) dst | 0 → dst | MOV #0,dst |
| CLRC, CLRN, CLRZ | сбросить C, N, Z | BIC #1,SR; BIC #4,SR; BIC #2,SR |
| DADC(.B) dst | dst + C в двоично-десятичном коде | DADD #0,dst |
| DEC(.B), DECD(.B) dst | dst − 1, dst − 2 | SUB #1,dst; SUB #2,dst |
| DINT, EINT | запретить, разрешить прерывания | BIC #8,SR; BIS #8,SR |
| INC(.B), INCD(.B) dst | dst + 1, dst + 2 | ADD #1,dst; ADD #2,dst |
| INV(.B) dst | инверсия битов | XOR #0FFFFh,dst (XOR.B #0FFh,dst) |
| NOP | ничего | MOV #0,R3 |
| POP(.B) dst | @SP → dst, SP + 2 → SP | MOV @SP+,dst |
| RET | возврат из подпрограммы | MOV @SP+,PC |
| RLA(.B) dst | сдвиг влево | ADD dst,dst |
| RLC(.B) dst | сдвиг влево через перенос | ADDC dst,dst |
| SBC(.B) dst | dst − not(C) | SUBC #0,dst |
| SETC, SETN, SETZ | установить C, N, Z | BIS #1,SR; BIS #4,SR; BIS #2,SR |
| TST(.B) dst | сравнение с нулём | CMP #0,dst |
Всего их 24, если считать байтовые и словные варианты одной командой. Константы 0, 1, 2, 4, 8 и −1 в этих заменах берутся из генератора констант, поэтому, например, INC R5 занимает одно слово.
Время выполнения
Число тактов MCLK определяется форматом и режимами адресации. Переходы — 2 такта независимо от того, выполняется ли переход; вход в прерывание — 6 тактов, RETI — 5.
| Источник → приёмник (формат I) | Тактов | Слов | Пример |
|---|---|---|---|
| Rn → Rm | 1 | 1 | MOV R5,R8 |
| Rn → PC | 2 | 1 | BR R9 |
| Rn → X(Rm), EDE, &EDE | 4 | 2 | ADD R5,4(R6) |
| @Rn или @Rn+ → Rm | 2 | 1 | AND @R4,R5 |
| @Rn или @Rn+ → память | 5 | 2 | MOV @R5,EDE |
| #N → Rm | 2 | 2 | MOV #20,R9 |
| #N → память | 5 | 3 | ADD #33,EDE |
| X(Rn), EDE, &EDE → Rm | 3 | 2 | MOV 2(R5),R7 |
| память → память | 6 | 3 | MOV 4(R7),TONI |
| Формат II, режим | RRA, RRC, SWPB, SXT | PUSH | CALL | Слов |
|---|---|---|---|---|
| Rn | 1 | 3 | 4 | 1 |
| @Rn | 3 | 4 | 4 | 1 |
| @Rn+ | 3 | 5 | 5 | 1 |
| #N | — | 4 | 5 | 2 |
| X(Rn), EDE, &EDE | 4 | 5 | 5 | 2 |
Константы генератора не добавляют слова кода, и процессору не нужно читать их из памяти — TI называет это главным преимуществом генератора. При 16 МГц такт длится 62,5 нс — так в даташите MSP430G2553 указано время цикла команды.
Примеры
MOV.W #WDTPW+WDTHOLD,&WDTCTL ; stop the watchdog (password 05Ah in the high byte)
BIS.B #BIT0,&P1DIR ; P1.0 as output
Loop: XOR.B #BIT0,&P1OUT ; toggle P1.0
MOV.W #50000,R15 ; delay counter
Delay: DEC.W R15 ; emulated: SUB #1,R15
JNZ Delay
JMP Loop
Вход в режим пониженного потребления — установка битов в SR: например, BIS #GIE+CPUOFF+SCG1+SCG0,SR — режим LPM3 с разрешёнными прерываниями. Подробнее о режимах и тактировании — в статье об архитектуре MSP430, обзор семейств — в разделе «MSP430». Сравнить с другими ядрами можно по страницам о системах команд AVR, Thumb-2 и 8051.
Частые вопросы
Сколько команд у MSP430?
27 основных — у них есть собственные коды операций — и 24 эмулируемые. Эмулируемые команды вроде CLR, INC, RET или NOP ассемблер заменяет основными с подходящими операндами, например CLR dst — это MOV #0,dst. TI подчёркивает, что эмулируемые команды не стоят ни лишнего кода, ни времени.
Что такое генератор констант MSP430?
Регистры R2 и R3 в некоторых режимах адресации источника выдают не своё содержимое, а одну из шести констант: 0, 1, 2, 4, 8 и −1. Ассемблер использует их сам, когда в команде стоит такое число, и команда обходится без дополнительного слова с константой — короче и быстрее.
Сколько тактов выполняется команда MSP430?
Зависит от режимов адресации, а не от самой команды. Операция регистр–регистр занимает 1 такт, любой переход — 2 такта, команда с операндами в памяти в обоих местах — до 6 тактов. Вход в прерывание — 6 тактов, возврат RETI — 5.
Чем отличаются MOV и MOV.B?
Суффиксом .B команда работает с байтом, без суффикса или с .W — со словом. Байтовые команды нужны для 8-битных регистров периферии и байтовых данных. Если результат байтовой операции записывается в регистр, его старший байт обнуляется.
Источники
- Texas Instruments. MSP430F2xx, MSP430G2xx Family User's Guide (SLAU144K, revised August 2022) — разд. 3.2 — регистры и генератор констант (табл. 3-2); разд. 3.3 — режимы адресации (табл. 3-3); разд. 3.4 — форматы (рис. 3-9…3-11), табл. 3-11…3-13 — команды, табл. 3-14…3-16 — такты и длина, рис. 3-12 — карта кодов, табл. 3-17 — сводная таблица, разд. 3.4.6 — эмуляция каждой команды
- Texas Instruments. MSP430G2x53, MSP430G2x13 Mixed Signal Microcontroller (SLAS735J, revised May 2013) — цикл команды 62,5 нс при 16 МГц; максимальная тактовая частота от напряжения питания
Нашли ошибку?
Смотрите также
- MSP43016-битное ядро TI со сверхмалым потреблением: семейства, G2553, отладка
- Архитектура MSP430Регистры, память, режимы LPM, тактирование, прерывания, WDT, порты
- Система команд AVRВсе инструкции с флагами и тактами, адресация, примеры кода
- Система команд Thumb-2Команды по группам, Operand2, флаги и условия, IT, переходы, DSP и FPU, M0
- Система команд 8051111 команд с байтами, циклами и флагами, карта кодов, примеры