Список команд ядра cortex-m3
Список команд ядра ARM Cortex-m3
Арифметические операции
Операция | Пример | Описание | ||
---|---|---|---|---|
ADD | ADD R0, R1, Operand2 ADD R0, R1, 12bit const. |
Сложение R0 = R1 + R2 |
N, Z, C, V | S |
ADC | ADC R0, R1, R2 ADC R0, R1, 8bit const |
Сложение с учётом переноса R0 = R1 + R2 + C |
N, Z, C, V | S |
ADDW | ADD R0, R1, 12bit const. | Сложение с 12bit константой | N, Z, C, V | |
SUB | SUB R0, R1, R2 SUB R0, R1, 12bit const. |
Вычитание R0 = R1 - R2 |
N, Z, C, V | S |
SBC | SBC R0, R1, R2 SBC R0, R1, 8bit const. |
Вычитание с учётом переноса R0 = R1 - R2 - C |
N, Z, C, V | S |
SUBW | SUB R0, R1, 12bit const. | Вычитание с 12bit константой | N, Z, C, V | |
RSB | RSB R0, R1, R2 RSB R0, R1, 8bit const. RSB R0, R1, R2, ASR#23 |
Вычитание с противоположным порядком аргументов. R0 = R2 - R1 или R0 = 8bit const - R1 |
N, Z, C, V | S |
Умножение. Деление.
Операция | Пример | Описание | ||
---|---|---|---|---|
MUL | R0 = R1 x R2 | Умножение. 32bit результат | N, Z | S |
MLA | R0 = (R1 x R2) + R3 | Умножение и сложение | N, Z | S |
MLS | R0 = R3 - (R1 x R2) | Умножение и вычитание | N, Z | S |
UMULL | RLo, RHi = R2 x R3 | Умножение. 64bit результат | ||
UMLAL | RLo, RHi += R2 x R3 | Умножение и сложение | ||
SMULL | RLo, RHi = R2 x R3 | Умножение со знаком. 64bit результат | ||
SMLAL | RLo, RHi += R2 x R3 | Умножение со знаком и сложение | ||
UDIV | R0 = R1 / R2 | Деление без знака | ||
SDIV | R0 = R1 / R2 | Деление со знаком |
Доступ к памяти
Операция | Описание | |
---|---|---|
ADR | ADR R0, label +/- 12bit ADR.W R0, label +/- 32bit |
Загрузка адреса метки в регистр. |
LDR | LDR R0, [R1, #8bit const.]! - прединк. LDR R0, [R1], #8bit const. - постинк. LDRB R0, [R1] - без инкремента |
Загрузка регистра в режиме адресации со смещением. B=байт SB=байт со знаком (только загрузка) H=полуслово SH=полуслово со знаком (только загрузка) |
STR | STRB R0, [R1], #1 | Сохранение регистра в режиме адресации со смещением. |
LDR | LDR R0, [R1, R2, {LSL#0..3}] | Смещение задаётся третьим регистром |
STR | STR R0, [R1, R2, {LSL#0..3}] | |
LDR | LDR R0, label | Смещение задаётся адресом метки. |
LDRD | LDRD R0, R1, label | |
LDRT | Непривилегированный доступ. | |
STRT | Аналогичны простому LDR/STR. | |
LDRD | LDRD R0, R1, [R2, #10bit]! - прединк. LDRD R0, R1, [R2], #10bit - постинк. LDRD R0, R1, [R2] - без инкремента |
Загрузка/сохранение двух регистров в режиме адресации со смещением. Константа должна быть кратна 4. |
STRD | STRD R0, R1, [R2] | |
LDM STM |
LDM R0, {R1-R3} LDM R0!, {R1-R3} - постинк. R0 IA, DB, FD, EA - см. описание |
Загрузка/сохранение множества регистров. IA - с увеличением адреса DB - с уменьшением адреса. |
PUSH | PUSH {R0, R2-R7, R12} | Загрузка в стек |
POP | POP {R0, R2-R7, R12} | Выгрузка из стека |
LDREX | LDREX R1, [R2, #10bit const.] | Эксклюзивное чтение/запись регистра. B=байт, H=полуслово. |
STREX | STREX R0, R1, [R2, #10bit const.] | |
CLREX | CLREX (без параметров) | Сброс признака эксклюзивного доступа. |
Перемещение и обработка данных
Операция | Пример | Описание | ||
---|---|---|---|---|
MOV | MOV R0, R1 MOV R0, 16bit const. |
Загрузка/перемещение регистров Загрузка 16-бит в мл. полуслово, сброс старшего |
N, Z, C, V | S |
MVN | MVN R0, R1 | Перемещение регистра с инверсией | N, Z, C, V | S |
MOVT | MOVT R0, 16bit const. | Загрузить 16bit в старшее полуслово. | ||
CMP | CMP R0, R1 | Сравнение | N, Z, C, V | S |
CMN | CMN R0, R1 | Сравнение с противоположным знаком | N, Z, C, V | S |
TST | TST R0, Operand2 | Проверить значение битов по маске | N, Z, C | S |
TEQ | TEQ R0, Operand2 | Проверить равенство двух величин | N, Z | S |
REV REV16 REVSH RBIT |
REV R0, R1 | Изменение порядка битов или байтов в слове | ||
CLZ | CLZ R0, R1 | Подсчет количества ведущих нулей |
Логические операции
Операция | Пример | Описание | ||
---|---|---|---|---|
AND | И | 0 в маске сбрасывает биты. Второй Operand2 для всех команд | N, Z, C | S |
ORR | ИЛИ | 1 в маске устанавливает биты | S | |
EOR | Исключающее ИЛИ | 1 в маске инвертирует биты | S | |
BIC | Сброс битов по маске. И-НЕ | 1 в маске сбрасывает биты | S | |
ORN | ИЛИ-НЕ | 0 в маске устанавливает биты | S |
Операции сдвига
Операция | Пример | Описание | ||
---|---|---|---|---|
ASR | Арифметический сдвиг вправо | N, Z, C | S | |
LSL | Логический сдвиг влево | S | ||
LSR | Логический сдвиг вправо | S | ||
ROR | Циклический сдвиг вправо | S | ||
RRX | Сдвиг вправо на 1 позицию через перенос | S |
Ветвление. Подпрограммы.
Операция | Пример | Описание |
---|---|---|
B | B label | Переход к метке |
BX | BX R0 | Переход по адресу в регистре |
BL | BL label | Выполнить подпрограмму label |
BLX | BLX R0 | Выполнить подпрограмму по адресу в регистре |
BX LR | BX LR | Возврат из подпрограммы |
CBZ | CBZ R0, label | Переход, если R0 = 0 |
CBNZ | CBNZ R0, label | Переход, если R0 != 0 |
TBB | TBB [R0, R1] | Табличный переход по индексу. Короткий переход. |
TBH | TBH [R0, R1, LSL #1] | Табличный переход по индексу. Длинный переход |
IT | IT{x{y{z}}} cond | Блок условно исполняемых инструкций |
Работа с битовыми полями
Операция | Пример | Описание |
---|---|---|
BFC | BFC R0, #lsb, #width | Сброс поля в ноль |
BFI | BFI R0, R1, #lsb, #width | Копирует младшие биты R1 в поле R0 |
UBFX | UBFX R0, R1, #lsb, #width | Копирует поле R1 в мл. биты R0 с заполнением нулями |
SBFX | SBFX R0, R1, #lsb, #width | Копирует поле R1 в мл. биты R0 с расширением знака |
UXTB UXTH |
UXTB R0, R1 {, ROR #8,16,24} | Преобразование байта с заполнением нулями Преобразование полуслова |
SXTB SXTH |
SXTB R0, R1 {, ROR #8,16,24} | Преобразование байта с расширением знака Преобразование полуслова |
Преобразование данных с насыщением
Операция | Пример | Описание | |
---|---|---|---|
SSAT | SSAT Rd, #n, Rm {, shift #s} | Число со знаком в число со знаком | Q |
USAT | USAT Rd, #n, Rm {, shift #s} | Число со знаком в число без знака |
Управление системой
Операция | Пример | Описание |
---|---|---|
MRS | MRS R0, PSR | Чтение специальных регистров. |
MSR | MSR PSR, R0 | Запись специальных регистров |
CPSIE | CPSIE | Разрешение прерываний |
CPSID | CPSID | Запрет прерываний |
WFE | WFE | Ожидать событие |
WFI | WFI | Ожидать прерывание |
BKPT | Точка останова | |
DMB | DMB | Барьер синхронизации доступа к ОЗУ |
DSB | ||
ISB | ISB | Сброс конвейера |
SEV | SEV | Дёрнуть ножкой события для внешних камней |
SVC | SVC 8bit const. | Вызов системного сервиса |
NOP | NOP | Ничего не делать |
Суффиксы условного исполнения
Операция | Пример | Описание |
---|---|---|
EQ | Z = 1 | Равенство |
NE | Z = 0 | Неравенство |
CS, HS | C = 1 | Больше или равно, беззнаковое сравнение |
CC, LO | C = 0 | Меньше, беззнаковое сравнение |
MI | N = 1 | Отрицательное значение, меньше нуля |
PL | N = 0 | Положительное значение, больше или равно нулю |
VS | V = 1 | Переполнение |
VС | V = 0 | Нет переполнения |
HI | C = 1 и Z=0 | Больше, беззнаковое сравнение |
LS | C = 0 или Z=1 | Меньше или равно, беззнаковое сравнение |
GE | N = V | Больше или равно, знаковое сравнение |
LT | N != V | Меньше, знаковое сравнение |
GT | Z = 0 и N = V | Больше, знаковое сравнение |
LE | Z = 1 и N != V | Меньше или равно, знаковое сравнение |
AL | 1 | Безусловное исполнение |
Встроенные псевдоинструкции компилятора
Операция | Пример | Описание |
---|---|---|
MOV32 | MOV32 R0, 32bit const. (label) | Загрузить слово в регистр. |
LDR | LDR R0, =label | Загрузить 32bit адрес метки или #число |
ADRL | ADRL R0, label | Загрузить 32bit адрес метки |