ADC{S}{c} {Rd},Rn,Op2

advertisement
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
Download