Программирование ARM-контроллеров STM32 на ядре Cortex-M3. Приложение 1. Набор инструкций THUMB-2 и особенности их использования

  1. Часть 1. Установка MDK, создание проекта, основы Keil uVision
  2. Часть 2. Команды и директивы ассемблера, структура и синтаксис программы. Первая программа для STM32.
  3. Часть 3. Карта памяти контроллеров STM32, методы работы с памятью.
  4. Часть 4. Регистры, старт и режимы работы контроллеров STM32.
  5. Часть 5. Как залить прошивку в контроллер.
  6. Часть 6. Настройка системы тактирования.
  7. Часть 7. Работа с портами ввода-вывода.
  8. Приложение 1. Набор инструкций THUMB-2 и особенности их использования.

Процессор 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. Часть 1. Установка MDK, создание проекта, основы Keil uVision
  2. Часть 2. Команды и директивы ассемблера, структура и синтаксис программы. Первая программа для STM32.
  3. Часть 3. Карта памяти контроллеров STM32, методы работы с памятью.
  4. Часть 4. Регистры, старт и режимы работы контроллеров STM32.
  5. Часть 5. Как залить прошивку в контроллер.
  6. Часть 6. Настройка системы тактирования.
  7. Часть 7. Работа с портами ввода-вывода.
  8. Приложение 1. Набор инструкций THUMB-2 и особенности их использования.

Добавить комментарий