Процессор Cortex-M3 использует набор инструкций, который называется THUMB-2. Этот набор представляет собой смесь 16-ти и 32-х битных команд. Ниже приводится таблица со списком и кратким описанием команд, а после неё даны некоторые пояснения относительно таблицы и описанных в ней команд.
Ткнув по команде из таблицы можно перейти к её подробному описанию.
команда 32 бит | краткое описание | версия 16 бит | у/в | флаги | S |
— команды доступа к памяти | |||||
ADR | загрузка относительного адреса в регистр | есть | Да | ||
CLREX | сброс монопольного доступа | Да | |||
LDM | загрузка данных из памяти в группу регистров | есть | Да | ||
LDR | загрузка данных из памяти в один или два регистра | есть | Да | ||
LDR..T | загрузка данных из памяти в регистр в непривилегированном режиме | Да | |||
LDREX | монопольная загрузка данных из памяти в регистр | Да | |||
POP | выгрузка данных из стека | есть | Да | ||
PUSH | загрузка данных в стек | есть | Да | ||
STM | сохранение данных из группы регистров в память | есть | Да | ||
STR | сохранение данных из одного или двух регистров в память | есть | Да | ||
STR..T | сохранение данных из регистра в память в непривилегированном режиме | Да | |||
STREX | монопольное сохранение данных из регистра в память | Да | |||
— команды обработки данных | |||||
ADC | сложение с учётом переноса | есть | Да | N, Z, C, V | Да |
ADD | сложение | есть | Да | N, Z, C, V | Да |
ADDW | сложение регистра с 12-ти битной константой | Да | N, Z, C, V | Да | |
AND | логическое И | есть | Да | N, Z, C | Да |
ASR | арифметический сдвиг вправо | есть | Да | N, Z, C | Да |
BIC | очистка битов по маске | есть | Да | N, Z, C | Да |
CLZ | подсчёт количества ведущих нулевых битов | Да | |||
CMN | сравнение с отрицательным операндом (сложение без сохранения результата) | есть | Да | N, Z, C, V | |
CMP | сравнение (вычитание без сохранения результата) | есть | Да | N, Z, C, V | |
EOR | логическое исключающее ИЛИ | есть | Да | N, Z, C | Да |
LSL | логический сдвиг влево | есть | Да | N, Z, C | Да |
LSR | логический сдвиг вправо | есть | Да | N, Z, C | Да |
MOV | копирование / загрузка | есть | Да | N, Z, C | Да |
MOVT | загрузка 16-ти битной константы в старшее полуслово | Да | |||
MOVW | загрузка 16-ти битной константы | Да | N, Z | Да | |
MVN | копирование с инверсией | есть | Да | N, Z, C | Да |
ORN | логическое ИЛИ с инверсией | Да | N, Z, C | Да | |
ORR | логическое ИЛИ | есть | Да | N, Z, C | Да |
RBIT | перестановка битов в обратном порядке | Да | |||
REV | перестановка байтов в обратном порядке | Да | |||
REV16 | перестановка байтов в обратном порядке для каждого полуслова в отдельности | Да | |||
REVSH | перестановка байтов в обратном порядке для младшего полуслова и расширение знака | Да | |||
ROR | циклический сдвиг вправо | есть | Да | N, Z, C | Да |
RRX | циклический сдвиг на один бит вправо через перенос | Да | N, Z, C | Да | |
RSB | обратное вычитание | Да | N, Z, C, V | Да | |
SBC | вычитание с переносом | есть | Да | N, Z, C, V | Да |
SUB | вычитание с переносом | есть | Да | N, Z, C, V | Да |
SUBW | вычитание 12-ти битной константы из регистра | Да | N, Z, C, V | Да | |
TEQ | проверка равенства (исключающее ИЛИ без сохранения результата) | есть | Да | N, Z, C | |
TST | проверка битов (логическое И без сохранения результата) | есть | Да | N, Z, C | |
— команды умножения и деления | |||||
MLA | умножение со сложением, результат 32 бита | Да | N, Z | Да | |
MLS | умножение с вычитанием, результат 32 бита | Да | N, Z | Да | |
MUL | умножение, результат 32 бита | есть | Да | N, Z | Да |
SDIV | знаковое деление | Да | |||
SMLAL | знаковое умножение со сложением, результат 64 бита | Да | |||
SMULL | знаковое умножение, результат 64 бита | Да | |||
UDIV | беззнаковое деление | Да | |||
UMLAL | беззнаковое умножение со сложением, результат 64 бита | Да | |||
UMULL | беззнаковое умножение, результат 64 бита | Да | |||
— команды насыщения | |||||
SSAT | насыщение со знаком | Да | Q | ||
USAT | насыщение без знака | Да | Q | ||
— команды работы с битовыми полями | |||||
BFC | очистка битового поля | Да | |||
BFI | копирование битового поля | Да | |||
SBFX | извлечение битового поля со знаком | Да | |||
SXTB | расширение знака байта | Да | |||
SXTH | расширение знака полуслова | Да | |||
UBFX | извлечение беззнакового битового поля | Да | |||
UXTB | дополнение байта нулями | Да | |||
UXTH | дополнение полуслова нулями | Да | |||
— команды ветвления и управления | |||||
B | переход (непосредственное смещение) | есть | Да | ||
BL | переход с обратной ссылкой (непосредственное смещение) | есть | Да | ||
BLX | косвенный переход с обратной ссылкой (смещение в регистре) | Да | |||
BX | косвенный переход (смещение в регистре) | есть | Да | ||
CBNZ | сравнение и переход, если не ноль | ||||
CBZ | сравнение и переход, если ноль | ||||
IT | блок IF-THEN | ||||
TBB | табличный переход с однобайтными смещениями | ||||
TBH | табличный переход с двухбайтными смещениями | ||||
— прочие команды | |||||
BKPT | точка останова | ||||
CPS | установка/сброс регистров PRIMASK и/или FAULTMASK (разрешение/запрет прерываний) | ||||
DMB | барьер памяти данных | Да | |||
DSB | барьер синхронизации данных | Да | |||
ISB | барьер синхронизации команд | Да | |||
MRS | пересылка из регистра специального назначения в регистр общего назначения | Да | |||
MSR | пересылка из регистра общего назначения в регистр специального назначения | Да | |||
NOP | нет операции | есть | Да | ||
SEV | генерация события | есть | Да | ||
SVC | вызов супервизора (программное прерывание) | есть | Да | ||
WFE | ожидание события | есть | Да | ||
WFI | ожидание прерывания | есть | Да |
В столбце «у/в» указано, возможно ли для рассматриваемой команды условное выполнение (подробности — в описании команды IT, таблицу суффиксов условного выполнения смотреть здесь).
В столбце «флаги» перечислены флаги, которые могут изменяться при выполнении команды.
Практически все команды, которые могут изменять флаги, существуют в двух вариантах, одному из которых разрешено изменять флаги, а второму запрещено. Для таких команд в столбце «S» написано «Да». В написании эти команды различаются наличием в конце символа S для того варианта, которому разрешено менять флаги. Например, команде mov r1, r2 менять флаги запрещено, а команде movs r1, r2 — разрешено.
В столбце «версия 16 бит» показано, какие команды имеют 16-ти битную версию, помимо 32-х битной. Главное их отличие в том, что 16-ти битные команды не работают со старшими регистрами общего назначения. Кроме того, в 16-ти битных версиях могут быть меньше диапазоны констант, смещений, адресов и тому подобного.
Чтобы явно указать компилятору разрядность команды, нужно в конце команды дописать .N — для 16-битной команды или .W — для 32-битной. Например, для команды mov.w r1,r2 компилятор сгенерирует 32-битный код, а для команды mov.n r1,r2 — 16-битный.
- Часть 1. Установка MDK, создание проекта, основы Keil uVision
- Часть 2. Команды и директивы ассемблера, структура и синтаксис программы. Первая программа для STM32.
- Часть 3. Карта памяти контроллеров STM32, методы работы с памятью.
- Часть 4. Регистры, старт и режимы работы контроллеров STM32.
- Часть 5. Как залить прошивку в контроллер.
- Часть 6. Настройка системы тактирования.
- Часть 7. Работа с портами ввода-вывода.
- Часть 8.Процедуры на ассемблере для STM32.
- Часть 9. Система прерываний.
- Часть 10. CMSIS, использование стандартных библиотек и функций.
- Часть 11. Подключение и использование драйверов из пакета StdPeriph.
- Часть 12. Работа с модулями USART и UART.
- Часть 13. Работа с модулями ADC
- Часть 14. Использование DMA
- Часть 15. Таймеры. Глава 1 — Введение. Простейшие таймеры
- Часть 15. Таймеры. Глава 2 — Таймеры общего назначения TIM9 — TIM14
- Часть 15. Таймеры. Глава 3 — Таймеры общего назначения TIM2 — TIM5
- Часть 15. Таймеры. Глава 4 — Продвинутые таймеры TIM1, TIM8
- Часть 16. Создание устройства USB HID в Keil uVision при помощи библиотечного компонента USB
- Приложение 1. Набор инструкций THUMB-2 и особенности их использования.
- Приложение 2. Таблица векторов прерываний для семейств STM32F101, STM32F102, STM32F103.
- Приложение 3. Драйвера и функции библиотеки StdPeriph
Ребята, кто сайтом рулит. Поправьте команду MOVW в приложении описания команд.
У вас «MOVW R1, #0xFFFF — R1=0xXXXXFFFF, где X — значения, остающиеся без изменений» На самом деле старшие 16 бит затираются.
Спасибо, поправил.