ARM Cortex-M3 (ARMV7-M) Суффиксы: .W - задаёт 32-бит инструкцию (если возможно) .N - задаёт 16-бит инструкцию (если возможно) S - разрешает модификацию флагов N,Z,C,V в PSR c - (cond) условное выполнение инструкции (табл.) суффикс с = Флаги PSR Выполняемое условие EQ Z=1 0 – равно NE Z=0 1 – не равно CS или HS C=1 2 – больше или равно, без знака CC или LO C=0 3 – меньше, без знака MI N=1 4 – меньше 0 PL N=0 5 – больше или равно 0 VS V=1 6 – переполнение VC V=0 7 – нет переполнения HI C=1 и Z=0 8 – больше, без знака LS C = 0 или Z = 1 9 – меньше или равно, без знака GE N=V 10 – больше или равно, со знаком LT N#V 11 – меньше, со знаком GT Z = 0 и N = V 12 – больше, со знаком LE Z = 1 или N # V 13 – меньше или равно, со знаком AL или нет 1 14 – безусловное выполнение Флаги PSR: N – отрицательно (старший бит) Z – результат = 0 С – перенос/заём V – переполнение Q – накопление после SSAT/USAT Регистры: R0…R12 – общего назначения SP (R13) – два указателя стека LR (R14) – адрес возврата PC (R15) – программный счётчик Спец. назначения – см. ниже Начальные значения по сбросу: SP – c адреса 0000 0000h LR – FFFF FFFFh PC – c адреса 0000 0004h PSR – 0100 0000h Остальные – 0000 0000h Инструкции обработки данных поддерживает гибкий формат задания второго операнда (Op2). При этом в качестве операнда может выступать константа или регистр с необязательным параметром сдвига. Op2 = #const где const = 00XY 00XY (X, Y – 16-ричные цифры) XY00 XY00 XYXY XYXY 8-бит число с произвольным сдвигом влево. Op2 = Rm {, shift} где shift = ASR #n – арифметический вправо на 1…32 бит LSL #n – логический влево на 1…31 бит LSR #n – логический вправо на 1…32 бит ROR #n – циклический вправо на 1…31 бит RRX – циклический вправо на 1 бит через перенос (С) Инструкции передачи управления Мнемоника B{c}{.W} label BL{c}{.W} label BLX{c} Rm BX{c} Rm Описание Переход Переход со связью (PC -> LR) Косвенный переход со связью (PC -> LR) Косвенный переход CBNZ Rn, label CBZ Rn, label Переход, если не равно 0 Переход, если равно 0 IT{x{y{z}}} c Блок до 4-х условных инструкций. TBB [Rn, Rm] TBH [Rn, Rm, LSL #1] Табличный (байт) переход по индексу То же 16-бит Альтернативные команды перехода Косвенный переход относительно PC Чтение множества регистров (reglist соодержит PC) Чтение из памяти (Rt = PC) Косвенный переход (не рекомендуется) Чтение из стека (reglist соодержит PC) ADD{c} PC,PC,Rm LDMxxx LDRxxx MOV{c} PC, Rm POP{c} reglist только R0..R7 ± 4...130 байт x,y,z = T(да) или E(нет) Прим. € € • € • € Такт 1+P 1+P 1+P 1+P O O 1+P 1+P O 0, 1 2+P 2+P • • • 1+P 1+N+P 2,3 + P 1+P 1+N+P • - при записи в PC, младший бит загружаемого значения должен быть равен 1 (инструкции BX, BLX, LDR, LDM, POP) O - инструкцию нельзя использовать внутри IT-блока € - возможно условное выполнение инструкции вне IT-блока +P - дополнительные 1..3 такта, если происходит модификация PC +N - дополнительные такты == количество регистров в инструкции argus98@mail.ru Инструкции обработки данных Мнемоника ADC{S}{c} {Rd,}Rn,Op2 ADD{S}{c} {Rd,}Rn,Op2 ADDW{c} {Rd,}Rn,#imm12 ADD{c} PC,PC,Rm RCB{S}{c} {Rd,}Rn,Op2 SBC{S}{c} {Rd,}Rn,Op2 SUB{S}{c} {Rd,}Rn,Op2 SUBW{c} {Rd,}Rn,#imm12 Сложение с переносом Сложение 0…4095 (косвенный переход) Реверс-вычитание Вычитание с переносом Вычитание 0…4095 Описание Флаги N,Z,C,V N,Z,C,V N,Z,C,V N,Z,C,V N,Z,C,V - Такт 1 1 1 1+P 1 1 1 1 AND{S}{c} {Rd,}Rn,Op2 BIC{S}{c} {Rd,}Rn,Op2 EOR{S}{c} {Rd,}Rn,Op2 ORN{S}{c} {Rd,}Rn,Op2 ORR{S}{c} {Rd,}Rn,Op2 Логическое И Сброс по маске (И-НЕ) Исключающее ИЛИ Логическое ИЛИ-НЕ Логическое ИЛИ N,Z,C N,Z,C N,Z,C N,Z,C N,Z,C 1 1 1 1 1 ASR{S}{c} Rd,Rm,Rs ASR{S}{c} Rd,Rm,#n LSL{S}{c} Rd,Rm,Rs LSL{S}{c} Rd,Rm,#n LSR{S}{c} Rd,Rm,Rs LSR{S}{c} Rd,Rm,#n ROR{S}{c} Rd,Rm,Rs ROR{S}{c} Rd,Rm,#n RRX{S}{c} Rd,Rm Арифметический сдвиг вправо #n = 1…32 Логический сдвиг влево #n = 0…31 Логический сдвиг вправо #n = 1…32 Циклический сдвиг вправо #n = 1…31 Циклический сдвиг вправо на 1 бит с переносом N,Z,C N,Z,C N,Z,C N,Z,C N,Z,C N,Z,C N,Z,C N,Z,C N,Z,C 1 1 1 1 1 1 1 1 1 CLZ{c} Rd,Rm Количество старших нулей в Rm - 1 CMN{c} Rn,Op2 CMP{c} Rn,Op2 TEQ{c} Rn,Op2 TST{c} Rn,Op2 Сравнение (сложение) Сравнение (вычитание) Сравнение (Искл. ИЛИ) Сравнение (лог. И) N,Z,C,V N,Z,C,V N,Z,C N,Z,C 1 1 1 1 RBIT{c} Rd,Rn REV{c} Rd,Rn REV16{c} Rd,Rn REVSH{c} Rd,Rn Реверс бит в слове Реверс байтов в слове Реверс байтов в полусловах Реверс байтов в младшем полуслове, знак в старшее - 1 1 1 1 MLA{c} Rd,Rn,Rm,Ra MLS{c} Rd,Rn,Rm,Ra MUL{S}{c} {Rd,}Rn,Rm SMLAL{c} RdLo,RdHi,Rn,Rm SMULL{c} RdLo,RdHi,Rn,Rm UMLAL{c} RdLo,RdHi,Rn,Rm UMULL{c} RdLo,RdHi,Rn,Rm Умножение 32 = 32 + 32 •32 Умножение 32 = 32 – 32 •32 Умножение 32 = 32 •32 Умножение 64 = 64 + 32 •32 со знаком Умножение 64 = 32 •32 со знаком Умножение 64 = 64 + 32 •32 Умножение 64 = 32 •32 N,Z - 2 2 1 4...7 3..5 4..7 3..5 SDIV{c} {Rd,}Rn,Rm UDIV{c} {Rd,}Rn,Rm Деление со знаком Деление (округление к 0) - 2..12 2..12 BFC{c} Rd,#lsb,#width BFI{c} Rd,Rn,#lsb,#width SBFX{c} Rd,Rn,#lsb,#width UBFX{c} Rd,Rn,#lsb,#width Сброс битового поля Копирование битового поля Копирование битового поля как числа со знаком Копирование битового поля как числа без знака - 1 1 1 1 SSAT{c} Rd,#n,Rm{,shift#s} USAT{c} Rd,#n,Rm{,shift#s} SXTB{c} {Rd,}Rm{,ROR #n} SXTH{c} {Rd,}Rm{,ROR #n} UXTB{c} {Rd,}Rm{,ROR #n} UXTH{c} {Rd,}Rm{,ROR #n} Преобразование 32 -> n бит со знаком Преобразование 32 -> n бит без знака Преобразование 8->32 бит со знаком. #n = 8,16,24 Преобразование 16->32 бит со знаком. #n = 8,16,24 Преобразование 8->32 бит без знака. #n = 8,16,24 Преобразование 16->32 бит без знака. #n = 8,16,24 Q Q - 1 1 1 1 1 1 +P - дополнительные 1..3 такта, если происходит модификация PC argus98@mail.ru Инструкции пересылки данных Мнемоника MOV{S}{c} Rd, Op2 MOV{c} PC, Rm MOVT{c} Rd, #imm16 MOVW{c} Rd, #imm16 MVN{S}{c} Rd,Op2 Описание Пересылка Косвенный переход (не рекомендуется) Старшее полуслово Младшее полуслово Пересылка с инверсией Флаги N,Z,C N,Z,C Такт 1 1+P 1 1 1 ADR{c}{.W} Rd,label Загрузка адреса относительно PC (± 4095) 1 LDR{type}{c} Rt,[Rn {,#offset}] LDR{type}T{c} Rt,[Rn {,#offset}] LDR{type}{c} Rt,[Rn, #offset]! LDR{type}{c} Rt,[Rn] , #offset LDRD{c} Rt,Rt2, [Rn {,#offset}] LDRD{c} Rt, Rt2, [Rn, #offset]! LDRD{c} Rt, Rt2, [Rn] , #offset LDR{type}{c} Rt,[Rn,Rm {,LSL#n}] LDR{type}{c}{.W} Rt, label LDRD{c}{.W} Rt, Rt2, label STR{type}{c} Rt,[Rn {,#offset}] STR{type}T{c} Rt,[Rn {,#offset}] STR{type}{c} Rt,[Rn, #offset]! STR{type}{c} Rt,[Rn] , #offset STRD{c} Rt,Rt2, [Rn {,#offset}] STRD{c} Rt, Rt2, [Rn, #offset]! STRD{c} Rt, Rt2, [Rn] , #offset STR{type}{c} Rt,[Rn,Rm {,LSL#n}] Чтение памяти со смещением type = Непривилегированный доступ нет 32-бит слово Чтение памяти пре-индекс B байт без знака Чтение памяти пост-индекс SB байт со знаком Двойное слово со смещением H 16-бит без знака Двойное слово пре-индекс SH 16-бит со знаком Двойное слово пост-индекс Чтение памяти с регистровой индексацией. #n = 0..3 Чтение памяти относительно PC Двойное слово относительно PC Запись в память со смещением type = Непривилегированный доступ нет 32-бит слово Запись в память пре-индекс B байт без знака Запись в память пост-индекс H 16-бит без знака Двойное слово со смещением Двойное слово пре-индекс Двойное слово пост-индекс Запись в память с регистровой индексацией. #n = 0..3 Прим. • R R • R • R • • • • • • R R R R LDM{c} Rn{!}, reglist LDMFD{c} Rn{!}, reglist LDMIA{c} Rn{!}, reglist LDMDB{c} Rn{!}, reglist LDMEA{c} Rn{!}, reglist STM{c} Rn{!}, reglist STMEA{c} Rn{!}, reglist STMIA{c} Rn{!}, reglist STMDB{c} Rn{!}, reglist STMFD{c} Rn{!}, reglist POP{c} reglist PUSH{c} reglist Чтение из памяти множества регистров, пост-инкремент То же ! – суффикс записи То же последнего адреса То же, пре-декремент reglist - пример То же, пре-декремент {R1-R4, R6, R9} Запись в память множества регистров, пост-инкремент То же ! – суффикс записи То же последнего адреса То же, пре-декремент reglist – пример То же, пре-декремент {R1-R4, R6, R9} Чтение из стека (эквивалентно LDM{c} SP!, reglist) Запись в стек (эквивалентно STMDB{c} SP!, reglist) LDREX{c} Rt, [Rn {,#offset}] LDREXB{c} Rt, [Rn] LDREXH{c} Rt, [Rn] STREX{c} Rd, Rt, [Rn {,#offset}] STREXB{c} Rd, Rt, [Rn] STREXH{c} Rd, Rt, [Rn] СLREX{c} Эксклюзивное чтение слова из памяти То же для байта То же для 16-бит Эксклюзивная запись слова в память То же для байта Rd – признак успешности То же для 16-бит см. Примитивы синхронизации Сброс эксклюзивного доступа • • • • • • 2+P 2 2+P 2+P 3+P 3+P 3+P 2+P 2+P 3+P 2 2 2 2 3 3 3 2 1+N+P 1+N+P 1+N+P 1+N+P 1+N+P 1+N 1+N 1+N 1+N 1+N 1+N+P 1+N 2 2 2 2 2 2 1 • - при записи в PC, младший бит загружаемого значения должен быть равен 1 (инструкции BLX, BX, LDM, LDR, POP) R - поддержка доступа к невыровненным адресам. Для других инструкций генерируется “Usage fault” +P - дополнительные 1..3 такта, если происходит модификация PC +N - дополнительные такты == количество регистров в инструкции Битовая адресация. Область bit-band RAM (1MB, адреса 2000 0000 – 200F FFFF) позволяет осуществлять битовую адресацию из bit-alias RAM (32MB, адреса 2200 0000 – 23FF FFFF), в которой используется только bit[0] из 32-бит слова. Аналогично для периферии – bit-band IO (1MB, адреса 4000 0000 – 400F FFFF) и bit-alias IO (32MB, адреса 4200 0000 – 43FF FFF argus98@mail.ru Служебные инструкции Мнемоника BKPT #imm8 CPCID {i}{f} CPCIE {i}{f} DMB{c} DSB{c} ISB{c} NOP{c} SEV{c} SVC{c} #imm8 WFE{c} WFI{c} Описание Точка останова Изменить состояние процессора, запрет прерываний Изменить состояние процессора, разрешение прерываний Барьер синхронизации доступа к памяти данных Барьер синхронизации доступа к памяти данных Барьер синхронизации доступа к инструкциям Нет операции Установить признак события (многопроцессорность) Вызов супервизора (программное прерывание SVCall) Ожидать событие Ожидать прерывание Прим. MRS{c} Rd, spec_reg MSR{c} spec_reg, Rn Чтение из специального регистра Запись в специальный регистр (непривилегированный доступ – только APSR) i - PRIMASK f - FAULTMASK O O P 1, 2 1, 2 O - инструкцию нельзя использовать внутри IT-блока P - вызов/возврат прерываний/исключений 12 тактов. В стеке сохраняются R0-R3, R12, PC, PSR, LR (8 слов) spec_reg = APSR [N, Z, C, V, Q] - регистр состояния приложения [флаги АЛУ] EPSR [ICI / IT] - регистр состояния выполнения [IT-инструкции, множественное чт/зп] IPSR [ISR_NUMBER] - регистр состояния прерывания [номер текущего исключения 0…511] IEPSR - EPSR + IPSR IAPSR - APSR + IPSR EAPSR - APSR + EPSR PSR - APSR + EPSR + IPSR MSP - указатель стека main (младшие 16 бит SP) (начальный по сбросу) PSP - указатель стека process (старшие 16 бит SP) CONTROL [бит1, бит0] - регистр управления [текущий стек (0 - MSP), уровень привилегий] PRIMASK [PRIMASK] - регистр маски приоритетов [запрет конфигурируемых исключений] BASEPRI [BASEPRI] - регистр базового приоритета маски [(0…15)•16] BASEPRI_MAX - синоним BASEPRI для инструкции MRS. FAULTMASK [FAULTMASK] - регистр маски сбоев [запрет всех исключений] Исключения/прерывания. № исключ. 1 2 3 4 5 6 7 - 10 11 12, 13 14 15 16 и выше № прер. -14 -13 -12 -11 -10 -5 -2 -1 0 и выше Тип Приоритет Адрес RESET NMI Hard Fault Memory Fault Bus Fault Usage Fault SVCall PendSV SysTick IRQ --- -3 -2 -1 конфиг. конфиг. конфиг. конфиг. конфиг. конфиг. конфиг. ---- +0004 +0008 +000С +0010 +0014 +0018 резерв +002С резерв +0038 +003С +0040 и выше Такт 1, 2 1, 2 1+B 1+B 1+B 0, 1 1 12 1+W 1+W Источник вызова Включение питания или сброс Немаскируемое прерывание Ошибка обработки исключения Срабатывание защиты памяти Ошибка доступа к памяти Сбой выполнения инструкции Инструкция SVC (вызов супервизора) Запрос сервисов системного уровня Обнуление системного таймера Прерывания периферийных устройств По адресу +0000 должно находится начальное значение указателя стека SP (PSP+MSP). По сбросу таблица начинается с адреса 0000 0000. Изменить начальный адрес можно регистром VTOR. argus98@mail.ru