Список команд ядра cortex-m3

Список команд ядра ARM Cortex-m3

Денис Заикин

Арифметические операции

ADDADD R0, R1, Operand2
ADD R0, R1, 12bit const.
Сложение
R0 = R1 + R2
N, Z, C, V S
ADCADC R0, R1, R2
ADC R0, R1, 8bit const
Сложение с учётом переноса
R0 = R1 + R2 + C
N, Z, C, VS
ADDWADD R0, R1, 12bit const.Сложение с 12bit константойN, Z, C, V 
SUBSUB R0, R1, R2
SUB R0, R1, 12bit const.
Вычитание
R0 = R1 - R2
N, Z, C, VS
SBCSBC R0, R1, R2
SBC R0, R1, 8bit const.
Вычитание с учётом переноса
R0 = R1 - R2 - C
N, Z, C, VS
SUBWSUB R0, R1, 12bit const.Вычитание с 12bit константойN, Z, C, V 
RSBRSB R0, R1, R2
RSB R0, R1, 8bit const. 
RSB R0, R1, R2, ASR#23
Вычитание с противоположным порядком аргументов. 
R0 = R2 - R1 или R0 = 8bit const - R1
N, Z, C, VS

Умножение. Деление.

MULR0 = R1 x R2 Умножение. 32bit результат N, ZS
MLAR0 = (R1 x R2) + R3 Умножение и сложение 
MLSR0 = R3 - (R1 x R2)Умножение и вычитание
UMULLRLo, RHi = R2 x R3 Умножение. 64bit результат   
UMLALRLo, RHi += R2 x R3 Умножение и сложение   
SMULLRLo, RHi = R2 x R3 Умножение со знаком. 64bit результат   
SMLALRLo, RHi += R2 x R3Умножение со знаком и сложение  
UDIVR0 = R1 / R2 Деление без знака   
SDIVR0 = R1 / R2Деление со знаком  

Доступ к памяти

ADRADR R0, label +/- 12bit
ADR.W R0, label +/- 32bit
Загрузка адреса метки в регистр.
LDRLDR R0, [R1, #8bit const.]! - прединк. 
LDR R0, [R1], #8bit const. - постинк. 
LDRB R0, [R1] - без инкремента 
Загрузка/сохранение регистра в режиме адресации со смещением. B=байт, SB=байт со знаком (только загрузка) H=полуслово, SH=полуслово со знаком (только загрузка)
STRSTRB R0, [R1], #1
LDRLDR R0, [R1, R2, {LSL#0..3}] Смещение задаётся третьим регистром. B, SB, H, SH работают аналогично
STRSTR R0, [R1, R2, {LSL#0..3}]
LDRLDR R0, label Смещение задаётся адресом метки. B, SB, H, SH работают аналогично Невозможно применить к STR/STRD.
LDRDLDRD R0, R1, label
LDRT Непривилегированный доступ. 
STRT Аналогичны простому LDR/STR.
LDRDLDRD R0, R1, [R2, #10bit]! - прединк.
LDRD R0, R1, [R2], #10bit - постинк.
LDRD R0, R1, [R2] - без инкремента 
Загрузка/сохранение двух регистров в режиме адресации со смещением. Константа должна быть кратна 4.
STRDSTRD R0, R1, [R2]
LDM
STM
LDM R0, {R1-R3} 
LDM R0!, {R1-R3} - постинк. R0 
IA, DB, FD, EA - см. описание
Загрузка/сохранение множества регистров. 
IA - с увеличением адреса 
DB - с уменьшением адреса.
PUSHPUSH {R0, R2-R7, R12} Загрузка в стек
POPPOP {R0, R2-R7, R12}Выгрузка из стека
LDREXLDREX R1, [R2, #10bit const.] Эксклюзивное чтение/запись регистра. 
B=байт, H=полуслово.
STREXSTREX R0, R1, [R2, #10bit const.]
CLREXCLREX (без параметров)Сброс признака эксклюзивного доступа.

Перемещение и обработка данных

MOVMOV R0, R1 
MOV R0, 16bit const. 
Загрузка/перемещение регистров 
Загрузка 16-бит в мл. полуслово, сброс старшего 
N, Z, C, VS
MVNMVN R0, R1Перемещение регистра с инверсией
MOVTMOVT R0, 16bit const.Загрузить 16bit в старшее полуслово.   
CMPCMP R0, R1 Сравнение N, Z, C, VS
CMNCMN R0, R1Сравнение с противоположным знаком
TSTTST R0, Operand2Проверить значение битов по маскеN, Z, CS
TEQTEQ R0, Operand2Проверить равенство двух величинN, ZS
REV
REV16
REVSH
RBIT
REV R0, R1Изменение порядка битов или байтов в слове  
CLZCLZ R0, R1Подсчет количества ведущих нулей  

Логические операции

ANDИ0 в маске сбрасывает биты. Второй Operand2 для всех команд N, Z, CS
ORRИЛИ1 в маске устанавливает биты  
EORИсключающее ИЛИ1 в маске инвертирует биты  
BICСброс битов по маске. И-НЕ1 в маске сбрасывает биты  
ORNИЛИ-НЕ0 в маске устанавливает биты 

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

ASR Арифметический сдвиг вправоN, Z, CS
LSL Логический сдвиг влево S
LSR Логический сдвиг вправо S
ROR Циклический сдвиг вправо S
RRX Сдвиг вправо на 1 позицию через перенос S

Ветвление. Подпрограммы.

BB labelПереход к метке
BXBX R0Переход по адресу в регистре
BLBL labelВыполнить подпрограмму label
BLXBLX R0Выполнить подпрограмму по адресу в регистре
BX LRBX LRВозврат из подпрограммы
CBZCBZ R0, labelПереход, если R0 = 0
CBNZCBNZ R0, labelПереход, если R0 != 0
TBBTBB [R0, R1]Табличный переход по индексу. Короткий переход.
TBHTBH [R0, R1, LSL #1]Табличный переход по индексу. Длинный переход
ITIT{x{y{z}}} condБлок условно исполняемых инструкций

Работа с битовыми полями

BFCBFC R0, #lsb, #widthСброс поля в ноль
BFIBFI R0, R1, #lsb, #widthКопирует младшие биты R1 в поле R0
UBFXUBFX R0, R1, #lsb, #widthКопирует поле R1 в мл. биты R0 с заполнением нулями
SBFXSBFX R0, R1, #lsb, #widthКопирует поле R1 в мл. биты R0 с расширением знака
UXTB
UXTH
UXTB R0, R1 {, ROR #8,16,24}Преобразование байта с заполнением нулями 
Преобразование полуслова
SXTB
SXTH
SXTB R0, R1 {, ROR #8,16,24}Преобразование байта с расширением знака 
Преобразование полуслова

Преобразование данных с насыщением

SSATSSAT Rd, #n, Rm {, shift #s} Число со знаком в число со знакомQ 
USATUSAT Rd, #n, Rm {, shift #s}Число со знаком в число без знака  

Управление системой

MRSMRS R0, PSRЧтение специальных регистров.
MSRMSR PSR, R0Запись специальных регистров
CPSIECPSIEРазрешение прерываний
CPSIDCPSIDЗапрет прерываний
WFEWFEОжидать событие
WFIWFIОжидать прерывание
BKPT Точка останова
DMBDMBБарьер синхронизации доступа к ОЗУ
DSB  
ISBISBСброс конвейера
SEVSEVДёрнуть ножкой события для внешних камней
SVCSVC 8bit const.Вызов системного сервиса
NOPNOP 

Суффиксы условного исполнения

EQZ = 1Равенство
NEZ = 0Неравенство
CS, HSC = 1Больше или равно, беззнаковое сравнение
CC, LOC = 0Меньше, беззнаковое сравнение
MIN = 1Отрицательное значение, меньше нуля
PLN = 0Положительное значение, больше или равно нулю
VSV = 1Переполнение
V = 0Нет переполнения
HIC = 1 и Z=0Больше, беззнаковое сравнение
LSC = 0 или Z=1Меньше или равно, беззнаковое сравнение
GEN = VБольше или равно, знаковое сравнение
LTN != VМеньше, знаковое сравнение
GTZ = 0 и N = VБольше, знаковое сравнение
LEZ = 1 и N != VМеньше или равно, знаковое сравнение
AL1Безусловное исполнение

Встроенные псевдоинструкции компилятора

MOV32MOV32 R0, 32bit const. (label)Загрузить слово в регистр.
LDRLDR R0, =labelЗагрузить 32bit адрес метки или #число
ADRLADRL R0, labelЗагрузить 32bit адрес метки