Список команд ядра 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 = 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 адрес метки