Список команд ядра 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  Умножение и сложение 
**MLS** R0 = R3 - (R1 x R2) Умножение и вычитание
**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}]  Смещение задаётся третьим регистром. B, SB, H, SH работают аналогично
**STR** STR R0, [R1, R2, {LSL#0..3}]
**LDR** LDR R0, label  Смещение задаётся адресом метки. B, SB, H, SH работают аналогично Невозможно применить к STR/STRD.
**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 Перемещение регистра с инверсией
**MOVT** MOVT R0, 16bit const. Загрузить 16bit в старшее полуслово.     
**CMP** CMP R0, R1  Сравнение  N, Z, C, V S
**CMN** CMN R0, R1 Сравнение с противоположным знаком
**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 в маске устанавливает биты   
**EOR** Исключающее ИЛИ 1 в маске инвертирует биты   
**BIC** Сброс битов по маске. И-НЕ 1 в маске сбрасывает биты   
**ORN** ИЛИ-НЕ 0 в маске устанавливает биты  

Операции сдвига

**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 адрес метки