Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Архитектура и структурная организация микроконтроллеров семейства CORTEX-M. Учебное пособие
.pdf
- 11 -
LSR #n - логический сдвиг вправо на n бит, 1 ≤ n ≤ 32;
ROR #n - циклический сдвиг вправо на n бит, 1 ≤ n ≤ 31;
RRX - циклический сдвиг вправо на один бит, с учетом переноса.
Случай, когда сдвиг не указан, эквивалентен заданию сдвига LSL #0. При
этом в качестве операнда используется непосредственно значение регистра Rm
без каких-либо дополнительных преобразований.
Операции сдвига переносят значение бит содержимого регистра влево или
вправо на заданное количество позиций - длину сдвига. Сдвиг может выполняться:
непосредственно с помощью инструкций ASR, LSR, LSL, ROR и RRX, при
этом результат сдвига заносится в регистр-получатель;
во время вычисления значения второго операнда Operand2 команд, при этом
результат сдвига используется как один из операндов инструкции.
Операции сдвига регистра влияют на значение флага переноса, за исклю-
чением случая, когда длина сдвига равна 0.
Выравнивание адресов. Под доступом по выровненным адресам пони-
маются операции, в которых чтение и запись слов, двойных слов и более длин-
ных последовательностей слов осуществляется по адресам, выровненным по
границе слова, а доступ к полусловам осуществляется по адресам, выровнен-
ным по границе полуслова. Чтение и запись байтов гарантированно являются
выровненными.
Процессор Cortex-M3 поддерживает доступ по невыровненным адресам
только для следующих инструкций:
LDR, LDRT;
LDRH, LDRHT;
LDRSH, LDRSHT;
STR, STRT;
STRH, STRHT.

- 12 -
Rm
Операнд 2
Rm
Операнд 2
Rm
Rm
Операнд 2
C
i разрядов
i разрядов
0 0
0 … 0 0 0
C
i разрядов
i разрядов
0 0 0 … 0 0 0
C
i разрядов
i разрядов
C
C
i разрядов
зн
зн
зн
зн … зн
зн
зн
i разрядов
Операнд 2
Rm
Операнд 2
Логический
сдвиг влево
LSL #i
Логический
сдвиг вправо
LSR #i
Арифметический
сдвиг вправо
ASR #i
Циклический
сдвиг вправо
ROR #i
Циклический
сдвиг вправо
через бит при-
знака C
RRX #1
Рис. 2.2. Типы сдвигов
Все остальные инструкции при попытке доступа по невыровненному ад-
ресу генерируют исключение (usage fault).

13
Таблица 2.4
16-разрядные команды THUMB-2
Обмены с памятью
Описание
Мнемокод
Операции
При-
знаки
15
14
13
12
11
10 9 8 7 6 5 4 3 2 1 0
Загрузка множества регистров из ОП,
инкремент Rn после доступа
LDMIA Rn{!},
{reglist}
registers := M [Rn]
-
1 1 0 0 1
Rn4
registers
Сохранение множества регистров в
ОП, инкремент Rn после доступа
STMIA Rn{!},
{reglist}
M [Rn] := registers
-
1 1 0 0 0
Rn
registers
Загрузка в регистр слова из ОП относительно программного счетчика
LDR Rt, Imm8
Rt:= M[PC+4xImm8]
-
0 1 0 0 1
Rt
Imm8
Загрузка в регистр слова из ОП относительно указателя стека
LDR Rt, Imm8
Rt:= M[SP+4xImm8]
-
1 0 0 1 1
Rt
Imm8
Сохранение слова из регистра в ОП
относительно указателя стека
STR Rt, Imm8
M[SP+4xImm8]:= Rt
-
1 0 0 1 0
Rt
Imm8
Загрузка в регистр слова из ОП
LDR Rt, [Rn, Rm]
Rt:= M[Rn+Rm]
- 0 1 0 1 1 0 0
Rm
Rn Rt
Сохранение слова из регистра в ОП
STR Rt, [Rn, Rm]
M[Rn+Rm] :=Rt
- 0 1 0 1 0 0 0
Rm
Rn Rt
Загрузка в регистр полуслова из ОП
LDRH Rt, [Rn, Rm]
Rt:= M[Rn+Rm]
- 0 1 0 1 1 0 1
Rm
Rn Rt
Сохранение полуслова из регистра в ОП
STRH Rt, [Rn, Rm]
M[Rn+Rm] :=Rt
- 0 1 0 1 0 0 1
Rm
Rn Rt
Загрузка в регистр байта из ОП
LDRB Rt, [Rn, Rm]
Rt:= M[Rn+Rm]
- 0 1 0 1 1 1 0
Rm
Rn Rt
Сохранение байта из регистра в ОП
STRB Rt, [Rn, Rm]
M[Rn+Rm] :=Rt
- 0 1 0 1 0 1 0
Rm
Rn Rt
Загрузка в регистр полуслова со знаком из ОП
LDSH Rt, [Rn, Rm]
Rt:= M[Rn+Rm]
- 0 1 0 1 1 1 1
Rm
Rn Rt
Загрузка байта знаком в регистр из ОП
LDSB Rt, [Rn, Rm]
Rt:= M[Rn+Rm]
- 0 1 0 1 0 1 1
Rm
Rn Rt
Загрузка в регистр слова из ОП
LDR Rt, [Rn, Imm5]
Rt:= M[Rn+4xImm8]
- 0 1 1 0 1 Imm5
Rn Rt
Загрузка в регистр полуслова из ОП
LDRH Rt, [Rn, Imm5]
Rt:= M[Rn+2xImm8]
- 1 0 0 0 1 Imm5
Rn Rt
Загрузка в регистр байта из ОП
LDRB Rt, [Rn, Imm5]
Rt:= M[Rn+Imm8]
- 0 1 1 1 1 Imm5
Rn Rt
Сохранение слова в ОП из регистра
STR Rt, [Rn, Imm5]
M[Rn+4xImm8]:=Rt
- 0 1 1 0 0 Imm5
Rn Rt
Сохранение полуслова из регистра в ОП
STRH Rt, [Rn, Imm5]
M[Rn+2xImm8]:=Rt
- 1 0 0 0 0 Imm5
Rn Rt
Сохранение байта из регистра в ОП
STRB Rt, [Rn, Imm5]
M[Rn+Imm8]:=Rt
- 0 1 1 1 0 Imm5
Rn Rt
Загрузка множества регистров из стека
POP {reglist}
registers := M [SP]
-
1 0 1 1 1 1 0
0
registers
Загрузка множества регистров и PC из
стека
POP {reglist, PC}
registers, PC := M [SP]
- 1 0 1 1 1 1 0 1
registers
Сохранение множества регистров в стеке
PUSH {reglist}
M [SP] := registers
- 1 0 1 1 0 1 0 0
registers
Сохранение множества регистров и регитстра
LR в стеке
PUSH {reglist, LR}
M [SP] := registers, LR
- 1 0 1 1 0 1 0 1
registers

14
Арифметические команды
Описание
Мнемокод
Операции
Признаки
15
14
13
12
11
10 9 8 7 6 5 4
3 2 1
0
Сложение регистров
ADDS Rd, Rn, Rm
Rd:=Rn+Rm
N,Z,C,V
0 0 0 1 1 0 0
Rm
Rn Rd
Вычитание регистров
SUBS Rd, Rn, Rm
Rd:=Rn-Rm
N,Z,C,V
0 0 0 1 1 0 1
Rm
Rn Rd
Сложение регистра с константой
ADDS Rd, Rn, Imm3
Rd:=Rn+Imm3
N,Z,C,V
0 0 0 1 1 1 0 Imm3
Rn Rd
Вычитание константы из регистра
SUBS Rd, Rn, Imm3
Rd:=Rn-Imm3
N,Z,C,V
0 0 0 1 1 1 1 Imm3
Rn Rd
Сложение регистра с константой
ADDS Rdn, Imm8
Rdn:=Rdn+Imm8
N,Z,C,V
0 0 1 1 0
Rdn
Imm8
Вычитание константы из регистра
SUBS Rdn, Imm8
Rdn:=Rdn-Imm8
N,Z,C,V
0 0 1 1 1
Rdn
Imm8
Сложение регистров с переносом
ADCS Rdn, Rm
Rdn=Rdn+Rm+C
N,Z,C,V
0 1 0 0 0 0 0
1 0 1
Rm Rdn
Вычитание регистров с переносом
SBCS Rdn, Rm
Rdn:=Rdn-Rm-C
N,Z,C,V
0 1 0 0 0 0 0
1 1 0
Rm Rdn
Обратное вычитание регистров
RSBS Rd, Rn, #0
Rd:= #0-Rn
N,Z,C,V
0 1 0 0 0 0 1 0 0 1 Rn Rd
Сложение программного счетчика с константой
ADR Rd, PC, Imm8
Rd:=PC+4xImm8
-
1 0 1 0 0
Rd
Imm8
Сложение указателя стека с константой
ADD Rd, SP, Imm8
Rd:=SP+4xImm8
N,Z,C,V
1 0 1 0 1
Rd
Imm8
Сложение указателя стека с константой
ADD SP, SP, Imm7
SP:=SP+4xImm7
N,Z,C,V
1 0 1 1 0 0 0 0 0 Imm7
Вычитание константы из указателя стека
ADD SP, SP, - Imm7
SP:=SP-4xImm7
N,Z,C,V
1 0 1 1 0 0 0 0 1 Imm7
Сложение регистров
ADD Rdn, Rm
Rdn:=Rdn+Rm
N,Z,C,V
0 1 0 0 0 1 0
0
Rdn
[3]
Rm
Rdn
[0-2]
Умножение регистров
MULS Rdm, Rn, Rdm
Rdm:=Rdm x Rn
N,Z,C,V
0 1 0 0 0 0 1
1 0 0
Rn Rdm
Сравнение регистра с константой
CMP Rn, #imm8
Rd - Imm8
N,Z,C,V
0 0 1 0 1
Rd
Imm8
Сравнение регистров
CMP Rn, Rm
Rn - Rm
N,Z,C,V
0 1 0 0 0 0 1
0 1 0
Rm Rn
Сравнение регистров с противоположным
знаком
CMN Rn, Rm
Rn + Rm
N,Z,C,V
0 1 0 0 0 0 1
0 1 1
Rm Rn
Сравнение регистров
CMP Rn, Rm
Rn - Rm
N,Z,C,V
0 1 0 0 0 1 0
1
Rn
[3]
Rm
Rn
[0-2]

15
Обмены с регистрами
Описание
Мнемокод
Операции
Признаки
15
14
13
12
11
10 9 8 7 6 5 4 3 2 1 0
Загрузка константы 8 бит в регистр
MOVS Rd:, Imm8
Rd:=Imm8
N,Z,C
0 0 1 0 0
Rd
Imm8
Пересылка регистров
MOV Rd, Rm
Rd:=Rm
N,Z,C,V
0 1 0 0 0 1 1 0 Rd3
Rm
Rd
0-2
Пересылка регистров
MOV Rm, Rd
Rd:=Rm
N,Z,C
0 0 0 0 0 0 0 0 0 0 Rm Rd
Преобразовать полуслово со знаком в слово
SXTH Rd, Rm
Rd
0-31
:=Rm
0-16
- 1 0 1 1 0 0 1 0 0 0 Rm Rd
Преобразовать байт со знаком в слово
SXTB Rd, Rm
Rd
0-31
:=Rm
0-7
-
1 0 1 1 0 0 1 0 0 1 Rm Rd
Преобразовать полуслово без знака в слово
UXTH Rd, Rm
Rd
0-31
:=Rm
0-16
- 1 0 1 1 0 0 1 0 1 0 Rm Rd
Преобразовать байт без знака в слово
UXTB Rd, Rm
Rd
0-31
:=Rm
0-7
-
1 0 1 1 0 0 1 0 1 1 Rm Rd
REV Rd, Rm
Rd:=Rm с обратным порядком
байт в слове
-
1 0 1 1 1 0 1 0 0 0 Rm Rd
Изменить на обратный порядок байтов в
полусловах
REV16
Rd:=Rm с обратным порядком
байт в полусловах
-
1 0 1 1 1 0 1 0 0 1 Rm Rd
Изменить на обратный порядок байт в младшем полуслове, произвести распространение
знакового бита в старшее полуслово
REVSH Rd, Rm
Rd:=Rm с обратным порядком
байт в младшем
полуслове
-
1 0 1 1 1 0 1 0 1 1 Rm Rd
Логические операции
Описание
Мнемокод
Операции
Признаки
15
14
13
12
11
10 9 8 7 6 5 4 3 2 1 0
Логическое И
ANDS Rdn, Rm
Rdn := Rdn & Rm
N,Z,C 0 1 0 0 0 0 0 0 0 0
Rm Rdn
Логическое ИЛИ
ORRS Rdn, Rm
Rdn := Rdn ˅ Rm
N,Z,C 0 1 0 0 0 0 1 1 0 0
Rm Rdn
Исключающее ИЛИ (сумма по mod2)
EORS Rdn, Rm
Rdn := Rdn mod2 Rm
N,Z,C 0 1 0 0 0 0 0 0 0 1
Rm Rdn
Сброс бит по маске
BICS Rdn, Rm
Rdn := Rdn & not(Rm)
N,Z,C 0 1 0 0 0 0 1 1 1 0
Rm Rdn
Проверка значения бит по маске
TST Rn, Rm
Rm & Rn
N,Z,C 0 1 0 0 0 0 1 0 0 0
Rm Rn
Побитовая инверсия регистра
MVNS Rd, Rm
Rd := not Rm
N,Z,C 0 1 0 0 0 0 1 1 1 1
Rm Rd

16
Операции сдвига
Описание
Мнемокод
Операции
Призна-
ки
15
14
13
12
11
10 9 8 7 6 5 4 3 2 1 0
Логический сдвиг влево
LSLS Rd, Rm>, #<imm5>
Rd:= лог. сдвиг Rm
на Imm5 разрядов
влево
N,Z,C
0 0 0 0 0
Imm5
Rm Rd
Логический сдвиг вправо
LSRS Rd, Rm, #<imm5>
Rd:= лог. сдвиг Rm
на Imm5 разрядов
вправо
N,Z,C
0 0 0 0 1
Imm5
Rm Rd
Арифметический сдвиг вправо
ASRS Rd, Rm, #<imm5>
Rd:= ариф. сдвиг Rm
на Imm5 разрядов
вправо
N,Z,C
0 0 0 1 0
Imm5
Rm Rd
Логический сдвиг влево
LSLS Rdn, Rm
Rdn:= лог. сдвиг Rdn
на Rm{0-7} разрядов
влево
N,Z,C
0 1 0 0 0 0 0 0 1 0 Rm Rdn
Логический сдвиг вправо
LSRS Rdn, Rm
Rdn:= лог. сдвиг Rdn
на Rm{0-7} разрядов
вправо
N,Z,C
0 1 0 0 0 0 0 0 1 1 Rm Rdn
Арифметический сдвиг вправо
ASRS Rdn, Rm
Rdn:= ариф. сдвиг
Rdn на Rm{0-7} раз-
рядов вправо
N,Z,C
0 1 0 0 0 0 0 1 0 0 Rm Rdn
Циклический сдвиг вправо
RORS Rdn, Rm
Rdn:= цикл. сдвиг
Rdn на Rm{0-7} раз-
рядов вправо
N,Z,C
0 1 0 0 0 0 0 1 1 1 Rm Rdn

17
Условные и безусловные переходы
Описание
Мнемокод
Операции
Призна-
ки
15
14
13
12
11
10 9 8 7 6 5 4 3 2 1 0
Безусловный или условный {c}переход по
косвенному адресу
BX{C} Rm
PC:=Rm
-
0 1 0 0 0 1 1 1 0
Rm
0 0
0
Безусловный или условный {c}переход к
подпрограмме по косвенному адресу
BLX {C} Rm
LR:= PC, PC:=Rm
-
0 1 0 0 0 1 1 1 1
Rm
0 0
0
Проверка регистра на 0 и условный переход относительно программного счётчика
CBZ Rn, label
При Rn=0
PC:=PC+4+2Imm
-
1 0 1 1 0
0
Im
m5
1
Imm
0-4
Rn
Проверка регистра на 0 и условный переход относительно программного счётчика
CBNZ Rn, label
При Rn=0
PC:=PC+4+2Imm
-
1 0 1 1 1
0
Im
m5
1
Imm
0-4
Rn
Условный переход
B cond label
При выполнении
условия cond PC:=
PC:=PC+4+2Imm
-
1 1 0 1 cond
Imm8
Безусловный переход
B label
PC:=PC+4+2Imm
- 1 1 1 0
0 Imm11
Системные команды
Описание
Мнемокод
Операции
При-
знаки
15
14
13
12
11
10 9 8 7 6 5 4 3 2 1 0
Вызов супервизора
SVC Imm8
- 1 1 0 1 1 1 1
1
Imm8
Точка останова
BKPT #imm8
Перевод процессора в
режим отладки
-
1 0 1 1 1 1 1
0
Imm8
Изменить состояние процессора,
запрет/разрешение прерываний
CPS {i}{f}
Изменение состояния
регистров PRIMASK,
FAULTMASK
-
1 0 1 1 0 1 1 0 0 1 1
im 0 0 I F
Нет операции
NOP
- 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 Ожидать событие
WFE
- 1 0 1 1 1 1 1 1 0 0 1 0 0 0 0 0 ООжидать прерывание
WFI
- 1 0 1 1 1 1 1 1 0 0 1 1 0 0 0 0 Установить признак события
SEV
- 1 0 1 1 1 1 1 1 0 1 0 0 0 0 0
0

18
Адресация относительно счетчика команд PC. В системе команд
Cortex-M3 предусмотрена адресация команды или области данных в виде сум-
мы значения счетчика команд PC плюс/минус численное смещение. Смещение
вычисляется ассемблером автоматически, исходя из адреса метки и текущего
адреса. В случае если смещение слишком велико, диагностируется ошибка. Для
инструкций B, BL, CBNZ и CBZ текущий адрес определяется как адрес этой
инструкции плюс 4 байта. Для всех остальных инструкций текущий адрес
определяется как адрес инструкции плюс 4 байта, при этом бит [1] результата
должен быть установлен в 0 для обеспечения выравнивания адреса по границе
слова.
Условное исполнение. Большая часть команд обработки данных способ-
на изменять значения флагов в регистре состояния прикладной программы
(APSR) в зависимости от результата выполнения. Регистр состояния приклад-
ной программы APSR содержит следующие флаги:
N=1 в случае, если результат операции меньше нуля, 0 в противном слу-
чае.
Z=1 в случае, если результат равен нулю, 0 в противном случае.
C=1 в случае, если при выполнении операции возник перенос, 0 в против-
ном случае.
V=1 в случае, если при выполнении операции возникло переполнение, 0 в
противном случае.
Некоторые команды влияют на все флаги, некоторые только на часть. В слу-
чае если инструкция не меняет значение данного флага, сохраняется его старое
значение. Более подробно влияние на флаги рассмотрено в описании конкрет-
ных инструкций.
Возможность исполнения или неисполнения инструкции в зависимости от
значения флагов, сформированных ранее, может быть достигнута либо за счет
использования условных переходов, либо путем добавления суффикса условия
исполнения к инструкции. В таблице 2.5 представлен список суффиксов, которые можно добавить к инструкции для того, чтобы сделать ее условной.

19
Таблица 2.5
Код
условия
«cond»
Значения
признаков
Суффикс
Пояснения
0000
Z == 1
EQ
Equal
Равенство
0001
Z == 0
NE
Not equal, or unordered
Неравенство
0010
C == 1
CS a
Greater than, equal, or
unordered
Больше или равно, беззнаковое сравнение
0011
C == 0
CC b
Less than
Меньше, беззнаковое сравнение
0100
N == 1
MI
Less than
Меньше нуля
0101
N == 0
PL
Greater than, equal, or
unordered
Больше или равно нулю
0110
V == 1
VS
Unordered
Переполнение
0111
V == 0
VC
Not unordered
Нет переполнения
1000
C == 1 и
Z == 0
HI
Greater than, or
unordered
Больше, беззнаковое сравнение
1001
C == 0 или
Z == 1
LS
Less than or equal
Меньше или равно, беззнаковое сравнение
1010
N == V
GE
Greater than or equal
Больше или равно, знаковое
сравнение
1011
N != V
LT
Less than, or unordered
Меньше, знаковое сравнение
1100
Z == 0 и
N == V
GT
Greater than
Больше, знаковое сравнение
1101
Z == 1 или
N != V
LE
Less than, equal, or unordered
Меньше или равно, знаковое
сравнение
1110
любое
None
(AL) c
Always (unconditional)
Безусловное исполнение
a) HS (unsigned higher or same) is a synonym for CS.
b) LO (unsigned lower) is a synonym for CC.
c) AL is an optional mnemonic extension for always, except in IT instructions
При наличии одного из указанных суффиксов процессор проверяет зна-
чение флагов на соответствие заданному условию. Если условие не выполняет-
ся, то инструкция:
не исполняется;
не записывает значение операции в регистр-получатель;
не влияет на флаги;
не генерирует исключений.
Условные инструкции, за исключением условных переходов, должны
располагаться внутри блока условно исполняемых инструкций (IT-блока).
2.4. Оценка времени исполнения команд
Процессор CORTEX-M3 реализован по схеме трехуровнего конвейера,
обеспечивающего исполнение большинства команд за один такт синхрониза-

20
Таблица 2.6
Оценка времени исполнения 16-разрядных команд Thumb-2
Тип ко-
манд
Команды
Количе-
ство так-
тов
Пояснения
Арифметические и логические
команды,
сдвиги, обмен реги-
стров
ADC, ADD, AND, ASR,
BIC, CMN, CMP, CPY,
EOR, LSL, LSR, MOV,
MUL, MVN, NEG, ORR,
ROR, SBC, SUB, TST,
REV, REVH, REVSH,
SXTB, SXTH, UXTB, and
UXTH.
1
( PC не яв-
ляется при-
емником)
Если PC – приёмник, время испол-
нения определяется как для ко-
манд перехода (1+P)
Переходы
B<cond>, B, BX, and BLX,
CBZ, CBNZ. No BLX with
immediate.
1+P
При невыполнении условия перехода команда исполняется за 1
такт. В противном случае при
непосредственном адресе перехода
требуется 1 дополнительный такт,
а при задании адреса в регистре –
2 дополнительных такта.
Обмен с па-
мятью
LDR, LDRB, LDRH,
LDRSB, LDRSH, STR,
STRB, STRH, T, LDMIA,
POP, PUSH, STMIA.
2+N
(N - число
дополнительных
обраще-
ний)
Обычно команды обращения в па-
мять load-store требуют 2 такта для
первого обращения и1 такт на
каждое дополнительное обращение. Запись с непосредственно заданным смещением выполняется
за 1 такт.
Если PC – приемник, добавляется
P тактов
Cистемные
команды
BKPT, SVC
-
CPS
1-2
IT, NOP, WFE, WFI
0-1
ции. Увеличение времени исполнения связано со сбоями в работе конвейера
(команды условного перехода), либо при использовании многоэлементных опе-
рандов. В таблице 2.6 приведены оценки времени исполнения 16-разрядных
команд Thumb-2, где:
P - число тактов на сброс конвейера при исполнении команды условного
перехода,
N – число элементов.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
