Arm руководство пользователя

Подробное объяснение набора инструкций ARM

1. Сборка

1.1 Общие регистры

Общий регистр

37 регистров, 31 регистр общего назначения, 6 регистров состояния, указатель стека R13 sp, указатель возврата R14, R15 — указатель ПК,cpsr_c представляет младшие 8 из этих 32 битов, которые являются управляющим битом

CPSR имеет 4 8-битных области: поле флага (F), поле состояния (S), расширенное поле (X), поле управления (C)
MSR — Load specified fields of the CPSR or SPSR with an immediate constant, orfrom the contents of a general-purpose register. Syntax: MSR{cond} _, #immed_8rMSR{cond} _, Rm where: cond is an optional condition code. is either CPSR orSPSR. specifies the field or fields to be moved. can be one or more of: ccontrol field mask byte (PSR[7:0]) x extension field mask byte (PSR[15:8]) sstatus field mask byte (PSR[23:16) f flags field mask byte (PSR[31:24]).immed_8r is an expression evaluating to a numeric constant. The constant mustcorrespond to an 8-bit pattern rotated by an even number of bits within a32-bit word. Rm is the source register.

 C Байт маски поля управления (psr [7: 0])

X расширенный байт маски поля (psr [15: 8])

S Байт маски поля состояния (psr [23:16])

 F Байт маски поля флага (psr [31:24])

Регистр CPSR

В чем разница между FIQ и IRQ?

РЕЖИМ (бинарный ниже)

10000

Пользовательский режим

PC,CPSR,R0~R14

10001

FIQ

PC,CPSR,SPSR_fiq,R14_fiq~R8_fiq,R7~R0

10010

IRQ

PC,CPSR,SPSR_irq,R14_irq~R13_irq,R12~R0

10011

Режим управления (SVC)

PC,CPSR,SPSR_svc,R14_svc~R13_svc,R12~R0

10111

Режим завершения

PC,CPSR,SPSR_abt,R14_abt~R13_abt,R12~R0

11011

Неопределенный

PC,CPSR,SPSR_und,R14_und~R13_und,R2~R0

11111

Системный режим (sys)

PC,CPSR,R14 ~R0

1.2 Формат команды

1) Базовый формат

<opcode>{<cond>}{S} <Rd>,<Rn>{,<opcode2>}

Среди них элементы в <> являются обязательными, элементы в {} являются необязательными, например, <opcode> является мнемоникой команды, требуется, и {<cond>} является условием выполнения инструкции, является необязательным , Если не записано, используется условие по умолчанию AL (безусловное выполнение).

opcodeКомандная мнемоника, такая как LDR, STR и т. Д.

condУсловия выполнения, такие как EQ, NE и т. Д.

SВлияет ли это на значение регистра CPSR, влияет на CPSR при записи, иначе это не влияет

RdЦелевой регистр

RnРегистр первого операнда

operand2Второй операнд

Примеры форматов команд:

LDREX — эта инструкция в основном берет число из памяти и затем помещает его в регистр, но по сравнению с обычной инструкцией LDR, его основные атомарные рабочие характеристики, семафор и спин-блокировка являются основными. Это последовательность загрузки-обновления-хранения. Чтобы предотвратить параллелизм, необходимо убедиться, что последовательность является атомарной. Так называемый атомарный означает, что когда процессор выполняет эту последовательность инструкций, он должен полностью занимать процессор и не может быть выключен. На ARM, начиная с V6, для этого используются инструкции LDREX и STREX.

LDR R0, [R1]; прочитать содержимое ячейки памяти по адресу R1, выполнить условие AL
BEQ DATAEVEN; инструкция перехода, EQ условия выполнения, равный переход к DATAEVEN
ADDS R1, R1, # 1; инструкция сложения R1 + 1 = R1 влияет на регистр CPSR, где S
SUBNES R1, R1, # 0xD; вычитание условного выполнения (NE), R1-0xD => R1, влияет на регистр CPSR, с S

2) Второй операнд

В инструкции ARM гибкое использование второго операнда может повысить эффективность кода. Форма второго операнда следующая:

#immed_8r

Постоянное выражение

Константа должна соответствовать 8-битной битовой карте, то есть константа состоит из 8-битной константыВращать четные битыПолучить.

Правовые константы:

0x3FC, 0, 0xF0000000, 200, 0xF0000001 и т. Д. Являются законными константами.

Нелегальная константа:

0x1FE, 511, 0xFFFF, 0x1010, 0xF0000010 и т. Д. Являются недопустимыми константами.

Примеры применения константных выражений:

MOV R0,#1 ;R0=1

И R1, R2, # 0x0F; R2 и 0x0F, результат сохраняется в R1

LDR R0, [R1], # -4; прочитать содержимое ячейки памяти по адресу R1, а R1 = R1-4

Rm

В режиме регистров операндом является значение регистра в режиме регистров.

Зарегистрировать примеры приложений:

SUB R1,R1,R2 ;R1-R2=>R1

MOV PC, R0; PC = R0, программа переходит на указанный адрес

LDR R0, [R1], -R2; прочитать содержимое ячейки памяти по адресу R1 и сохранить его в R0, а R1 = R1-R2

Rm, shift

Регистрация режима сдвига. Результат сдвига регистра используется в качестве операнда, но значение RM остается неизменным. Метод сдвига следующий:

ASR #n арифметический сдвиг вправо n мест (1≤n≤32)

LSL # n сдвиг влево логически на n бит (1≤n≤31)

LSR #n логический сдвиг влево n бит (1≤n≤32)

ROR # n повернуть вправо на n бит (1≤n≤31)

RRX вращается вправо на 1 бит с расширением

type Среди них type — один из ASR, LSL и ROR; регистр смещения Rs, младшие 8 битов действительны, если значение больше или равно 32, результат второго операнда равен 0 (ASR, ROR исключения).
Пример применения метода смещения регистра:

ADD R1,R1,R1,LSL #3 ;R1=R1*9

SUB R1,R1,R2,LSR#2 ;R1=R1-R2*4

R15 является программным счетчиком ПК процессора, как правило, им не управляют, и некоторые инструкции не могут использовать R15, например, инструкция UMULL.
(3) Код условия
Использование кодов условий команд может реализовать эффективные логические операции и повысить эффективность кода. Таблица A-1 показывает таблицу кодов условий.

Таблица A-1 Таблица кодов условий

Для набора команд Thumb только команда B имеет функцию выполнения кода условия. Код условия этой команды такой же, как в таблице A- ?, но если это безусловное выполнение, мнемоника кода AL в инструкции не записывается.

Примеры применения кодов условий:

Сравните два значения и добавьте соответственно 1. Код C:
 if(a>b)a++ ;
 else b++ ;
Соответствующие инструкции ARM следующие. Где R0 является a и R1 является b.
CMP R0, R1; R0 по сравнению с R1
ADDHI R0, R0, # 1, если R0> R1, то R0 = R0 + 1
ADDLS R1, R1, # 1; если R0 < = R1, то R1 = R1 + 1
Если оба условия выполняются, два значения добавляются вместе, а код C:

If((a!=10)&&(b!=20))a=a+b;

Соответствующие инструкции ARM следующие, где R0 — это a, а R1 — это b.
CMPR0, # 10; сравнить R0 с 10
CMPNE R1, # 20; Если R0 не 10, сравните, равно ли R1 20
ADDNE R0, R0, R1; если R0 не 10 и R1 не 20, инструкция выполняется, R0 = R0 + R1

1.3 Набор инструкций

1.3.1 Инструкция доступа к памяти ARM

Обработка ARM — это типичный RISC-процессор архитектуры загрузки / хранения, и доступ к памяти может быть достигнут только с помощью инструкций загрузки и хранения. Команда загрузки / сохранения ARM может реализовывать операцию слова, полуслова, байта без знака / знака, команда пакетной загрузки / сохранения может реализовывать одну инструкцию для загрузки / хранения содержимого нескольких регистров, что значительно повышает эффективность; инструкция SWP является регистром Инструкции, которыми обмениваются с содержимым памяти, могут использоваться для операций с семафорами и т. Д. Процессор ARM представляет собой структуру памяти фон Неймана.Программное пространство, пространство ОЗУ и пространство отображения ввода-вывода адресованы единообразно.В дополнение к операции ОЗУ доступ к периферийному вводу-выводу и программным данным должен выполняться посредством инструкций загрузки / сохранения. Таблица A-2 показывает список инструкций доступа к памяти ARM.

Таблица A-2 Таблица инструкций доступа к хранилищу ARM

 ЛДР и СТР
Загрузка / сохранение слова и беззнаковых байтовых инструкций. Используйте отдельные инструкции по передаче данных (STR и LDR) для загрузки и сохранения одного байта или слова данных из / в память. Инструкция LDR используется для считывания данных из памяти в регистр, инструкция STR используется для сохранения данных из регистра в память. Формат команды следующий:
LDR {cond} {T} Rd, <адрес>; загрузить данные (слово) по указанному адресу и поместить их в Rd
STR {cond} {T} Rd, <адрес>; хранить данные (слово) в блоке хранения указанного адреса, данные для хранения находятся в Rd
LDR {cond} B {T} Rd, <адрес>; загрузить байтовые данные и поместить их в Rd, то есть младший байт Rd действителен, а старшие 24 бита очищены
STR {cond} B {T} Rd, <адрес>; хранить байтовые данные, данные для хранения — Rd, младший байт действителен
Среди них необязательный суффикс T. Если инструкция имеет T, то даже если процессор находится в привилегированном режиме, система хранения обрабатывает доступ так, как если бы процессор находился в режиме пользователя. T недопустим в пользовательском режиме и не может использоваться с предыдущим смещением индекса.
Адресация команд LDR / STR очень гибкая и состоит из двух частей: одна часть является регистром базовых адресов, который может быть любым регистром общего назначения, а другая часть является смещением адреса. Смещение адреса имеет следующие три формата:
(1) немедленно. Непосредственное значение может быть значением без знака.Эти данные могут быть добавлены в регистр базового адреса, или это значение может быть вычтено из регистра базового адреса. Примеры инструкций следующие:
LDR R1, [R0, # 0x12]; Считать данные по адресу R0 + 0x12 и сохранить их в R1 (значение R0 остается неизменным)
LDR R1, [R0, # -0x12]; Считайте данные по адресу R0-0x12 и сохраните их в R1 (значение R0 остается неизменным)
LDR R1, [R0]; прочитать данные по адресу R0 и сохранить их в R1 (смещение нуля)
(2) Зарегистрируйтесь. Значение в регистре может быть добавлено в регистр базового адреса, или значение может быть вычтено из регистра базового адреса. Значение примера инструкции. Примеры инструкций следующие:
LDR R1, [R0, R2], считайте измеритель данных адреса R0 + R2 и сохраните его в R1 (значение R0 остается неизменным)
LDR R1, [R0, -R2]; Считайте измеритель данных по адресу R0-R2 и сохраните его в R1 (значение R0 остается неизменным)
(3) Регистры и константы сдвига. Смещенное значение регистра может быть добавлено в регистр базового адреса, или это значение может быть вычтено из регистра базового адреса. Примеры инструкций следующие:
LDR R1, [R0, R2, LSL # 2]; прочитать данные по адресу R0 + R2 * 4 и сохранить их в R1 (значения R0 и R2 остаются без изменений)
LDR R1, [R0, -R2, LSL # 2]; Считайте измеритель данных по адресу R0-R2 * 4 и сохраните его в R1 (значения R0 и R2 не изменились)
В соответствии с методом вычисления адреса в режиме адресации инструкция загрузки / сохранения имеет следующие 4 формы:
(1) Смещение нуля. Значение Rn используется в качестве адреса для передачи данных, то есть смещение адреса равно 0. Примеры инструкций следующие:
 LDR Rd,[Rn]
(2) Смещение переднего указателя. Перед передачей данных смещение добавляется в Rn, и результат используется в качестве адреса хранения переданных данных. Если используется суффикс «!», Результат записывается обратно в Rn, и значение Rn не может быть равно R15. Примеры инструкций следующие:
 LDR Rd,[Rn,#0x04]!
 LDR Rd,[Rn,#-0x04]
(3) Программа относительно смещена. Относительное смещение программы является еще одной версией формы индекса. Ассемблер вычисляет смещение из регистра ПК и использует регистр ПК в качестве Rn для генерации прединдексной инструкции. Суффикс «!» Не может быть использован. Примеры инструкций следующие:
LDR Rd, метка; метка — метка программы, метка должна быть в пределах ± 4 КБ от текущей инструкции
(4) Смещение заднего индекса. Значение Rn используется в качестве адреса хранения передаваемых данных. После передачи данных смещение добавляется в Rn, а результат записывается обратно в Rn. Rn не может быть R15. Примеры инструкций следующие:
 LDR Rd,[Rn],#0x04
Выравнивание адреса. В большинстве случаев необходимо обеспечить, чтобы адрес, используемый для 32-разрядной передачи, был выровнен по 32-разрядному.
Примеры загрузки / сохранения слова и беззнаковых байтов приведены ниже:
LDR R2, [R5]; загрузить данные (слово) по указанному адресу R5 и поместить их в R2
STR R1, [R0, # 0x04]; Сохранить данные от R1 до R0 + 0x04 единицы хранения, значение R0 остается неизменным
LDRB R3, [R2], # 1, прочитать один байт данных по адресу R2 и сохранить его в R3, R2 = R3 + 1
STRB R6, [R7]; прочитать данные R6 и сохранить их по адресу, указанному в R7, хранить только один байт данных
Загрузка / хранение полуслов и подписанных байтов. Такие инструкции LDR / STR могут загружать подписанные байты загружать подписанные полуслова, загружать / хранить неподписанные полуслова. Формат смещения и метод адресации совпадают с инструкциями загрузки / сохранения и байтов без знака. Формат команды следующий:
LDR {cond} SB Rd, <адрес>; загрузить данные (байты со знаком) по указанному адресу и поместить их в Rd
LDR {cond} SH Rd, <адрес>; загрузить данные (байты со знаком) по указанному адресу и поместить их в Rd
LDR {cond} H Rd, <адрес>; загрузить данные половинного слова и поместить их в Rd, то есть младшие 16 бит Rd действительны, а верхние 16 бит очищены
STR {cond} H Rd, <адрес>; хранить данные половинного слова, данные, которые должны быть сохранены, — Rd, допустимы минимум 16 бит
Описание: загрузка половинного слова / байта со знаком относится к загрузке знакового бита, расширенной до 32 бит, загрузка по половинному слову без знака относится к нулю, расширенному до 32 бит.
Выравнивание адреса — адрес для передачи полуслов должен быть четным числом. Загрузка с полусловом, не выровненная по половинному слову, сделает содержимое Rd ненадежным, а при хранении с половиной слов, не выровненным по половинному слову, содержимое 2-байтового хранилища указанного адреса ненадежно.

Примеры загрузки / сохранения полуслов и подписанных байтовых инструкций:

LDRSB R1 [R0, R3], считывать байтовые данные по адресу R0 + R3 в R1, старшие 24 бита расширяются знаковыми битами
LDRSH R1, [R9], считывать данные из полуслов по адресу от R9 до R1, а старшие 16 бит расширяются знаковыми битами
LDRH R6, [R2], # 2, считывать данные из полуслов по адресу от R2 до R6, старшие 16 бит дополняются нулями, R2 = R2 + 1
SHRH R1, [R0, # 2]!; Сохранить данные R1 по адресу R2 + 2, хранить только 2 младших байта данных, R0 = R0 + 2
Инструкция LDR / STR используется для доступа к переменным памяти, доступа к данным буфера памяти, таблицам поиска, операциям периферийного управления и т. Д.Используйте инструкцию LDR для загрузки данных в регистр ПК для реализации функции перехода по программе, которая также осуществляет передачу по программе.
 Переменный доступ
NumCount EQU 0x40003000; определить переменную NumCount
 …
LDR R0, = NumCount; используйте псевдоинструкцию LDR для загрузки адреса NumCount в R0
LDR R1, [R0]; вынуть значение переменной
 ADD R1,R1,#1 ;NumCount=NumCount+1
STR R1, [R0]; сохранить значение переменной
 …
Настройки GPIO
GPIO-BASE EQU 0Xe0028000; определяет базовый адрес регистра GPIO
 …
 LDR R0,=GPIO-BASE
LDR R1, = 0x00FFFF00; загружаются 32-битные непосредственные данные, что является заданным значением
STR R1, [R0, # 0x0C]; IODIR = 0x00FFFF00, адрес IODIR равен 0xE002800C
 MOV R1,#0x00F00000
STR R1, [R0, # 0x04]; IOSET = 0x00F00000, адрес IOSET равен 0xE0028004
 …
Передача программы
 …
MOV R2, R2, LSL # 2, умножьте номер функции на 4, чтобы проверить таблицу
LDR PC, [PC, R2]; посмотрите таблицу, чтобы получить адрес соответствующей подпрограммы функции и перейдите
 NOP
 FUN-TAB DCD FUN-SUB0
 DCD FUN-SUB1
 DCD FUN-SUB2
 …

  LDM и STM
Команды пакетной загрузки / сохранения могут передавать данные между набором регистров и блоком непрерывной памяти. LDM предназначен для загрузки нескольких регистров, а STM для хранения нескольких регистров. Позволяет инструкции для передачи любого поднабора из 16 регистров или всех регистров. Формат команды следующий:
LDM {cond} <mode> Rn {!}, Reglist {^}
STM {cond} <mode> Rn {!}, Reglist {^}
Основное использование LDM / STM — защита на месте, репликация данных, передача параметров и т. Д. Существует 8 режимов, перечисленных ниже: (первые 4 используются для передачи блока данных, а последние 4 — операции стека).
(1) IA: добавляйте 4 к адресу после каждой передачи
(2) IB: добавляйте 4 к адресу перед каждой передачей
(3) DA: адрес уменьшается на 4 после каждой передачи
(4) DB: минус 4 адреса перед каждой передачей
(5) FD: полный убывающий стек
(6) ED: пустой инкрементальный стек
(7) FA: полный увеличивающийся стек
(8) EA: пустой инкрементальный стек
Среди них регистр Rn является регистром базовых адресов, который снабжен начальным адресом передаваемых данных, Rn не может быть R15; суффикс «!» Указывает, что последний адрес записывается обратно в Rn; Используйте «,» для разделения, например {R1, R2, R6-R9}, расположение регистров от малого к большому, суффикс «^» не разрешается использовать в пользовательском режиме в качестве системного режима, если список регистров команд LDM содержит Используемый на ПК, в дополнение к обычной многоканальной передаче, копируйте SPSR в CPSR, который можно использовать для обработки и возврата исключений, когда для передачи данных используется суффикс «^», а список регистров не содержит ПК, пользовательский режим загружается / сохраняется Вместо текущего режима регистр.
Выравнивание адреса — эти инструкции игнорируют адресные биты [1: 0].
Примеры инструкций массовой загрузки / хранения:
LDMIA R0 !, {R3-R9}; Загрузите данные из нескольких слов по адресу, указанному в R0, сохраните их в R3 ~ R9 и обновите значение R0
STMIA R1!, {R3-R9}; сохранить данные R3 ~ R9 по адресу, указанному R1, значение R1 обновлено
STMFD SP!, {R0-R7, LR}; сохранить на месте, положить R0 ~ R7, LR в стек
LDFMDSP !, {R0-R7, PC} ^; восстановить сцену, вернуть обработку исключений
При копировании данных сначала установите указатель исходных данных, а затем используйте инструкции адресации блока копирования LDMIA / STMIA, LDMIB / STMIB, LMDMA / STMDA, LDMDB / STMDB для чтения и сохранения. При выполнении операций со стеком необходимо сначала установить указатель стека, обычно использовать SP, а затем использовать инструкции по адресации стека STMFD / LDMFD, STMED. LDMED, STMFA / LDMFA, STMEA / LDMEA осуществляют работу со стеком.
Принципиальная схема команды передачи с несколькими регистрами показана на рисунке A-1, где R1 — регистр базового адреса перед выполнением инструкции, а R1 ‘- регистр базового адреса после выполнения инструкции.

(A) Инструкция STMIA R1!, {R5-R7} (b) Инструкция STMIB R1!, {R5-R7}

   (C) Инструкция STMDA R1!, {R5-R7} (d) Инструкция STMDB R1!, {R5-R7}
Рисунок A-1 Принципиальная схема команды передачи в несколько регистров

Сохраняются ли данные над или под адресом базового регистра, и увеличивается ли адрес или уменьшается до или после сохранения первого значения. В таблице A-3 показана принципиальная схема многоадресного отображения команд передачи.

Таблица A-3 Таблица схемы отображения команд многоадресной передачи

 

Процедура копирования данных с использованием LDM / STM выглядит следующим образом:
 …
LDR R0, = SrcData; установить адрес данных источника
LDR R1, = DstData; установить целевой адрес
LDMIA R0, {R2-R9}; загрузить 8 слов данных в регистры R2 ~ R9
STMIA R1, {R2-R9}; сохранить регистры R2 ~ R9 по целевому адресу

Используйте LDM / STM для защиты регистров на месте, часто используемых в подпрограммах или обработке исключений:
 SENDBYTE
STMFD SP!, {R0-R7, LR}; зарегистрироваться в куче
 …
BL DELAY; вызов подпрограммы DELAY
 …
LDFMDSP !, {R0-R7, PC}; восстановить регистр и вернуться

 SWP
Регистрация и обмен инструкциями по памяти. Инструкция SWP используется для считывания содержимого блока памяти (адрес блока помещается в регистр Rn) в регистр Rd, и в то же время записывает содержимое другого регистра Rm в блок памяти. Используйте SWP для работы с семафорами.
Формат команды следующий:
 SWP{cond}{B} Rd,Rm,[Rn]
Среди них B — необязательный суффикс, если есть B, то обмениваются байтами, в противном случае обмениваются 32-битными словами: Rd — это регистр, в который данные загружаются из памяти; данные Rm используются для хранения в памяти, если Rm совпадает с Rn. Для обмена содержимым регистра и памяти; Rn — это адрес памяти, где должны обмениваться данные, Rn не может быть таким же, как Rd и Rm.
Примеры инструкций SWP:
SWP R1, R1, [R0], обмен содержимого R1 с содержимым блока хранения, на который указывает R0
SWP R1, R2 ,, [R0]; считывать содержимое блока хранения, на которое указывает R0, в один байт данных (верхние 24 бита очищаются)
Запишите содержимое R2 в этот блок памяти (допустим младший байт)
Использование инструкций SWP может легко выполнять операции семафора:
 12C_SEM EQU 0x40003000
 …
 12C_SEM_WAIT
 MOV R0,#0
 LDR R0,=12C_SEM
SWP R1, R1, [R0]; вынуть семафор и установить его в 0
CMPR1, # 0; судить, есть ли сигнал
BEQ12C_SEM_WAIT; если нет сигнала, подождите

1.3.2 Инструкции по обработке данных ARM

Инструкции по обработке данных можно условно разделить на 3 категории:

(1) Инструкции передачи данных (такие как MOV, MVN)

(2) Арифметические логические инструкции по работе (такие как ADD, SUM и AND)

(3) Сравнительные инструкции (такие как CMP, TST).

Инструкции по обработке данных могут работать только с содержимым регистров. Все инструкции по обработке данных ARM могут использовать суффикс S, чтобы влиять на флаг состояния. Команды сравнения CMP, CMN, TST и TEQ не нуждаются в суффиксе S, они напрямую влияют на флаги состояния. Инструкции по обработке данных ARM перечислены в таблице A-4.

Таблица A-4 Инструкции по обработке данных ARM

 

(1) Инструкции по передаче данных
 MOV
Инструкция по передаче данных. Непосредственные 8-битовые данные или регистр (operant2) передаются в целевой регистр Rd, который может использоваться для таких операций, как операция сдвига. Формат команды следующий:
 MOV{cond}{S} Rd,operand2
Примеры инструкций MOV следующие:
 MOV R1#0x10 ;R1=0x10
 MOV R0,R1 ;R0=R1
MOVS R3, R1, LSL # 2; R3 = R1 << 2 и влияют на флаг
MOV PC, LR; PC = LR, возврат подпрограммы

 MVN
Инструкция по передаче данных. 8-битовые непосредственные данные или регистр (операнд2) инвертируются бит за битом и затем передаются в целевой регистр (Rd). Поскольку он имеет обратную функцию, он может загружать более широкий диапазон непосредственных данных. Формат команды следующий:
 MVN{cond}{S} Rd,operand2
Примеры инструкций MVN:
 MVN R1,#0xFF ;R1=0xFFFFFF00
MVN R1, R2; перевернуть R2 и сохранить результат в R1

(2) инструкции по арифметической логике
 ADD
Инструкция по добавлению. Добавьте данные операнда 2 к значению Rn и сохраните результат в регистре Rd. Формат команды следующий:
 ADD{cond}{S} Rd,Rn,operand2
Примеры ADD-инструкций следующие:
 ADDS R1,R1,#1 ;R1=R1+1
 ADD R1,R1,R2 ;R1=R1+R2
 ADDS R3,R1,R2,LSL #2 ;R3=R1+R2<<2

 SUB
Инструкция по вычитанию. Вычтите операнд2 из регистра Rn. Результат сохраняется в Rd. Формат команды следующий:
 SUB{cond}{S} Rd,Rn,operand2
Примеры SUB-инструкций следующие:
 SUBS R0,R0,#1 ;R0=R0-1
 SUBS R2,R1,R2 ;R2=R1-R2
 SUB R6,R7,#0x10 ;R6=R7-0x10

 RSB
Инструкция обратного вычитания. Вычтите Rn с операндом регистра2 и сохраните результат в Rd. Формат команды следующий:
 RSB{cond}{S} Rd,Rn,operand2
Примеры SUB-инструкций следующие:
 RSB R3,R1,#0xFF00 ;R3=0xFF00-R1
 RSBS R1,R2,R2,LSL #2 ;R1=R2<<2-R2=R2×3
 RSB R0,R1,#0 ;R0=-R1

 ADC
С керри добавить инструкцию. Добавьте данные операнда 2 и значение Rn, а также флаг условия C в CPSR. Результат сохраняется в регистре Rd. Формат команды следующий:
 ADC{cond}{S} Rd,Rn,operand2
Примеры инструкций ADC следующие:
 ADDS R0,R0,R2
АЦП R1, R1, R3; использовать АЦП для достижения 64-битного сложения, (R1, R0) = (R1, R0) + (R3, R2)

 SBC
С инструкцией выполнения вычитания. Вычтите операнд2 из регистра Rn, а затем вычтите отрицание бита флага условия C в CPSR (то есть, если флаг C очищен, результат вычитается на 1), и результат сохраняется в Rd. Формат команды следующий:
 SCB{cond}{S}Rd,Rn,operand2
Примеры инструкций SBC:
 SUBS R0,R0,R2
SBC R1, R1, R3; использовать SBC для достижения 64-битного вычитания, (R1, R0) — (R3, R2)

 RSC
С инструкциями обратного вычитания. Вычтите Rn с операндом регистра2, а затем вычтите флаг условия C в CPSR и сохраните результат в Rd. Формат команды следующий:
 RSC{cond}{S} Rd,Rn,operand2
Примеры инструкций RSC следующие:
 RSBS R2,R0,#0
RSC R3, R1, # 0; используйте инструкцию RSC, чтобы найти отрицательное значение 64-битного значения

 AND
Логика и инструкция по эксплуатации. Значение операнда 2 и значение регистра Rn логически управляются с помощью бита, а результат сохраняется в Rd. Формат команды следующий:
 AND{cond}{S} Rd,Rn,operand2
Примеры инструкций AND следующие:
ANDS R0, R0, # x01; R0 = R0 & 0x01, вынуть наименее значимые данные
 AND R2,R1,R3 ;R2=R1&R3

 ORR
 Логика или инструкция по эксплуатации. Логически ИЛИ значение операнда 2 со значением регистра Rn и сохранение результата в Rd. Формат команды следующий:
 ORR{cond}{S} Rd,Rn,operand2
Примеры инструкций ORR следующие:
ORR R0, R0, # x0F; установите нижнюю 4 позицию R0 в 1
 MOV R1,R2,LSR #4
ORR R3, R1, R3, LSL # 8; используйте инструкцию ORR для перемещения старших 8 битов данных рядом с R2 в младшие 8 битов R3

 EOR
Инструкция по эксплуатации логики XOR. Логически XOR значение операнда 2 и значение регистра Rn по битам, и сохранить результат в Rd. Формат команды следующий:
 EOR{cond}{S}Rd,Rn,operand2
Примеры инструкций EOR следующие:
EOR R1, R1, # 0x0F; инвертировать младшие 4 бита R1
 EOR R2,R1,R0 ;R2=R1^R0
EORS R0, R5, # 0x01; логически ИЛИ R5 и 0x01, сохранить результат в R0 и повлиять на бит флага

 BIC
Немного понятная инструкция. Логически И побитовая инверсия значения регистра Rn и операнда 2 и сохранение результата в Rd. Формат команды следующий:
 BIC{cond}{S}Rd,Rn,operand2
Примеры инструкций BIC:
BIC R1, R1, # 0x0F; очистить младшие 4 бита R1, остальные биты остаются неизменными
BIC R1, R2, R3; логическое И инвертированного кода и R2, и результат сохраняется в R1

(3) Сравнительная инструкция
 CMP
Инструкция по сравнению. Инструкция использует значение регистра Rn минус значение операнда 2 и обновляет соответствующий бит флага условия в CPSR в соответствии с результатом операции, так что последующая инструкция решает, выполнять ли в соответствии с соответствующим флагом условия. Формат команды следующий:
 CMP{cond} Rn,operand2
Примеры инструкций CMP:
CMPR1, # 10; R1 сравнивается с 10, установить соответствующие флаги
CMP R1, R2; R1 сравнивается с R2, устанавливает соответствующие флаги
Разница между инструкцией CMP и инструкцией SUBS заключается в том, что инструкция CMP не сохраняет результат операции. При оценке размера двух данных для работы часто используются инструкции CMP и соответствующие коды условий.

 CMN
Инструкция сравнения отрицательных чисел. Инструкция использует регистр Rn и значение плюс значение операнда 2 и обновляет соответствующий бит флага условия в CPSR в соответствии с результатом операции, так что следующие инструкции определяют, следует ли выполнять в соответствии с соответствующим флагом условия. Формат инструкции следующий:
 CMN{cond} Rn,operand2
CMN R0, # 1; R0 + 1, определить, является ли R0 дополнением к 1, если Z установлен
Разница между инструкцией CMN и инструкцией ADDS заключается в том, что инструкция CMN не сохраняет результат операции. Инструкция CMN может использоваться для сравнения отрицательных чисел. Например, команда CMNR0, # 1 означает, что R0 сравнивается с -1. Если R0 — это (то есть дополнение к 1), то Z устанавливается, в противном случае Z сбрасывается.

 TST
местотестИнструкции. Команда логически оперирует значением регистра Rn и значением операнда2 побитно и обновляет соответствующий бит флага условия в CPSR в соответствии с результатом операции (когда результат равен 0, бит EQ установлен), так что следующие инструкции основаны на соответствующем флаге условия Чтобы определить, следует ли выполнить. Формат команды следующий:
 TST{cond} Rn,operand2
Примеры инструкций TST следующие:
TST R0, # 0x01; определить, равен ли младший бит R0 0
TST R1, # 0x0F; определить, равны ли младшие 4 бита R1
Разница между инструкцией TST и инструкцией ANDS заключается в том, что инструкция TST4 не сохраняет результат операции. Инструкция TST обычно используется вместе с кодами состояния EQ и NE.Если все тестовые биты равны 0, EQ действителен, и пока один тест не равен 0, NE является действительным.

 TEQ
¡Равная инструкция по тестированию. Значение регистра Rn команд и значение операнда 2 логически XOR в соответствии с битом, и соответствующий бит флага условия в CPSR обновляется в соответствии с результатом операции, так что последующие инструкции определяют, выполнять ли они в соответствии с соответствующим флагом условия. Формат команды следующий:
 TEQ{cond} Rn,operand2
Примеры инструкций TEQ следующие:
TEQ R0, R1; сравнить, равны ли R0 и R1 (не влияет на биты V и C)
Разница между инструкцией TST и инструкцией EORS заключается в том, что инструкция TST не сохраняет результат операции. TEQ используется для проверки на равенство. Часто используется в сочетании с кодами условий EQNE. Когда два данных равны, EQ действителен, в противном случае NE действителен

(4) Инструкция умножения
ARM7TDMI (-S) имеет 32 × 32 инструкции умножения, 32 × 32 инструкции умножения-сложения и 32 × 32 команды умножения с результатом в 64 бита. В таблице A-5 приведены все инструкции умножения ARM.

Таблица A-5 Все инструкции умножения ARM

 

MUL
32-битная инструкция умножения. Инструкция умножает значения в Rm и Rs, а младшие 32 бита результата сохраняются в Rd. Формат команды следующий:
 MUL{cond}{S} Rd,Rm,Rs
Примеры инструкций MUL следующие:
 MUL R1,R2,R3 ;R1=R2×R3
MULS R0, R3, R7; R0 = R3 × R7, установить бит N и бит Z в CPSR одновременно

 MLA
32-битная инструкция умножения-сложения. Инструкция умножает значения в Rm и Rs, затем добавляет произведение к третьему операнду, и младшие 32 бита результата сохраняются в Rd. Формат команды следующий:
 MLA{cond}{S} Rd,Rm,Rs,Rn
Примеры инструкций MLA:
 MLA R1,R2,R3,R0 ;R1=R2×R3+10

 UMULL
64-разрядная инструкция умножения без знака. Инструкция умножает значение в Rm и Rs на число без знака, младшие 32 бита результата сохраняются в RsLo, а старшие 32 бита сохраняются в RdHi. Формат команды следующий:
 UMULL{cond}{S} RdLo,RdHi,Rm,Rs
Примеры инструкций UMULL:
 UMULL R0,R1,R5,R8 ;(R1、R0)=R5×R8

 UMLAL
64-битная беззнаковая инструкция многократного добавления. Инструкция умножает значения в Rm и Rs на числа без знака. 64-разрядное произведение добавляется в RdHi и RdLo. Младшие 32 бита результата сохраняются в RdLo, а старшие 32 бита сохраняются в RdHi. Формат команды следующий:
 UMLAL{cond}{S} RdLo,RdHi,Rm,Rs
Примеры инструкций UMLAL:
 UMLAL R0,R1,R5,R8;(R1,R0)=R5×R8+(R1,R0)

 SMULL
64-битная знаковая инструкция умножения. Инструкция умножает значения в Rm и R на число со знаком, младшие 32 бита результата сохраняются в RdLo, а старшие 32 бита сохраняются в RdHi. Формат команды следующий:
 SMULL{cond}{S} RdLo,RdHi,Rm,Rs
Примеры SMULL-инструкций:
 SMULL R2,R3,R7,R6 ;(R3,R2)=R7×R6

 SMLAL
64-разрядная подписанная инструкция умножения-сложения. Инструкция умножает значения в Rm и Rs на число со знаком. 64-разрядное произведение добавляется в RdHi и RdLo. Младшие 32 бита результата сохраняются в RdLo, а старшие 32 бита сохраняются в RdHi. Формат команды следующий:
 SMLAL{cond}{S} RdLo,RdHi,Rm,Rs
Примеры инструкций SMLAL:
 SMLAL R2,R3,R7,R6;(R3,R2)=R7×R6+(R3,R2)

1.3.3 Инструкция перехода ARM

Есть два способа перейти к программе:

(1) Прыгайте прямо, используя инструкции по прыжкуСуществуют инструкции перехода B, инструкции перехода BL со ссылками и инструкции перехода BX с переключением состояний.

(2) Перейти непосредственно к реестру ПК

Таблица A-6 показывает все инструкции по переходу ARM.

Таблица A-6 Инструкция по переходу ARM

BИнструкция перехода, переход по указанному адресу для выполнения программы.

B{cond} label

Примеры следующие:

B WAITA; перейти к ярлыку WAITA

B 0x1234; перейти к абсолютному адресу 0x1234

Переход к инструкции B ограничен до ± 32 Мб текущей инструкции.

BLПерейти инструкции с ссылками. Инструкция копирует адрес следующей инструкции в регистр связи R14 (LR), а затем переходит на указанный адрес для запуска программы.
 BL{cond} label

Примеры следующие:

BL DELAY

Инструкция перехода B ограничена до ± 32 МБ текущей инструкции. Инструкция BL используется для вызова подпрограммы.
 

BXИнструкция перехода с переключением состояний. Для выполнения программы перейдите к адресу, указанному в Rm.Если бит [0] в Rm равен 1, при переходе автоматически устанавливается флаг T в CPSR, то есть код целевого адреса интерпретируется как код Thumb; 0] равно 0, флаг T в CPSR автоматически сбрасывается при переходе, то есть код целевого адреса интерпретируется как код ARM. Формат команды следующий:
 BX{cond} Rm
Примеры следующие:
 ADRL R0,ThumbFun+1
BX R0; перейти к адресу, указанному в R0, и переключить состояние процессора в соответствии с младшим битом R0

BLX

Целевой адрес BLX: переход, изменение состояния и сохранение значения ПК

1.3.4 Инструкции ARM сопроцессора

 ARM поддерживает работу сопроцессора, и управление сопроцессором должно осуществляться с помощью команд сопроцессора. В таблице A-7 приведены все инструкции ARM-сопроцессора.

Таблица A-7 Инструкции ARM сопроцессора

 

CDP
Инструкции по обработке данных сопроцессора. Процессор ARM уведомляет сопроцессор ARM посредством инструкций CDP для выполнения определенных операций. Эта операция выполняется сопроцессором, то есть интерпретация параметров команды относится к сопроцессору, а использование инструкций зависит от сопроцессора. Если сопроцессор не может успешно выполнить эту операцию, будет сгенерировано неопределенное исключение для инструкции. Формат команды следующий:
 CDP{cond}coproc,opcodel,CRd,CRn,CRm{,opcode2}
Среди них: имя сопроцессора операции команды coproc. Стандартное имя — pn, n — 0 ~ 15.
Opcodel Специфический код операции сопроцессора.
CRd является регистром сопроцессора в качестве целевого регистра.
CRN хранит регистр сопроцессора первого операнда.
CRm хранит регистр сопроцессора второго операнда.
Opcode2 Дополнительный код операции, специфичный для сопроцессора.
Примеры инструкций CDP следующие:
CDP p7,0, c0, c2, c3,0; операция сопроцессора 7, код операции 0, необязательный код операции 0
CDP, p6, 1, c3, c4, c5; операция сопроцессора, код операции 1

 LDC
Инструкция чтения данных сопроцессора.Инструкция LDC считывает данные из смежного блока памяти в регистры сопроцессора., Передача данных сопроцессора контролируется сопроцессором. Если сопроцессор не может успешно выполнить эту операцию, будет сгенерировано неопределенное исключение для инструкции. Формат команды следующий:
LDC {cond} {L} coproc, CRd, <адрес>
Среди них: L необязательный суффикс, указывающий, что это длинная целочисленная передача.
Имя сопроцессора операции команды coproc. Стандартное имя pn, n равно 0 ~ 15
CRd — регистр сопроцессора, зарегистрированный в качестве цели.
<Адрес> указанный адрес памяти
Примеры инструкций LDC следующие:
LDC p5, c2, [R2, # 4], прочитайте данные блока памяти, на который указывает R2 + 4, и перенесите их в регистр c2 сопроцессора p5
LDC p6, c2, [R1], считывает данные указанного блока памяти и передает их в регистр c2 сопроцессора p6

 STC
Инструкция по записи данных сопроцессора.Инструкция STC записывает данные регистра сопроцессора в блок непрерывной памяти, Передача данных данных сопроцессора осуществляется, а количество передаваемых слов контролируется сопроцессором. Если сопроцессор не может успешно выполнить эту операцию, будет сгенерировано неопределенное исключение для инструкции. Формат команды следующий:
STC {cond} {L} coproc, CRd, <адрес>
Среди них: L необязательный суффикс, указывающий, что это длинная целочисленная передача.
Имя сопроцессора операции команды coproc. Стандартное имя pn, n равно 0 ~ 15
CRd — регистр сопроцессора, зарегистрированный в качестве цели.
<Адрес> указанный адрес памяти
Примеры инструкций STC следующие:
 STC p5,c1,[R0]
 STC p5,c1,[Ro,#-0x04]
 MCR
 Инструкция по передаче данных из регистра ARM в регистр сопроцессора, Инструкция MCR передает данные из регистра процессора ARM в регистр сопроцессора. Если сопроцессор не может успешно выполнить эту операцию, будет сгенерировано неопределенное исключение для инструкции. Формат команды следующий:
 MCR{cond}coproc,opcodel,Rd,CRn,CRm{,opcode2}
Среди них: имя сопроцессора операции команды coproc. Стандартное имя — pn, а n — от 0 до 15.
Cpcodel Конкретный код операции сопроцессора.
RD — целевой регистр.
CRn Скопроцессорный регистр с первым операндом
CRm хранит регистр сопроцессора второго операнда.
Opcode2 Дополнительный код операции, специфичный для сопроцессора.
Примеры инструкций MCR следующие:
 MCR p6,2,R7,c1,c2,
 MCR P7,0,R1,c3,c2,1,

 MRC
 Инструкция передачи данных из регистра сопроцессора в регистр ARM, Инструкция MRC передает данные из регистра сопроцессора в регистр процессора ARM. Если сопроцессор не может успешно выполнить операцию. Будет сгенерировано неопределенное прерывание исключения. Формат команды следующий:
 MRC {cond}coproc,opcodel,Rd,CRn,CRm{,opcode2}
Среди них: имя сопроцессора операции команды coproc. Стандартное имя — pn, а n — от 0 до 15.
Opcodel Специфический код операции сопроцессора.
Rd как целевой регистр.
CRn хранит регистр сопроцессора первого операнда.
CRm хранит регистр сопроцессора второго операнда.
Opcode2 Дополнительный код операции, специфичный для сопроцессора.
Примеры инструкций MRC:
 MRC p5,2,R2,c3,c2
 MRC p7,0,R0,c1,c2,1

1.3.5 ARM Разные инструкции

В таблице A-8 приведены все инструкции ARM-сопроцессора.

Таблица A-8 ARM Разные инструкции

 

SWI
Мягкая инструкция прерывания. Команда SWI используется для генерации мягкого прерывания, так что пользовательский режим преобразуется в режим управления, CPSR сохраняется в SPSR в режиме управления, а выполнение переносится в вектор SWI.В других режимах команда SWI также может использоваться для переключения в режим управления таким же образом. , Формат команды следующий:
 SWI{cond} immed_24
Среди них: непосредственное 24-битное значение immed_24, значение является целым числом от 0 до 16777215
Примеры инструкций SWI:
SWI0; мягкое прерывание, значение немедленного прерывания равно 0
SWI 0x123456; мягкое прерывание, непосредственный номер прерывания 0x123456
При использовании инструкции SWI для передачи параметров обычно используются следующие два метода: обработчик прерываний исключений SWI может предоставлять соответствующие услуги. Оба метода являются соглашениями о программном обеспечении пользователя. Обработчик прерываний исключений SWI должен прочитать инструкцию SWI, которая вызвала мягкое прерывание для получения 24-битного непосредственного номера.
(A) 24-битное непосредственное значение инструкции указывает тип услуги, запрошенной пользователем, и параметры передаются через регистр.
MOV R0, # 34; установить номер функции на 34
SWI12; вызов 12 мягкого прерывания
24-битное непосредственное значение в команде (B) игнорируется, тип услуги, запрошенный пользователем, определяется значением регистра R0, а параметры передаются через другие регистры общего назначения.
MOV R0, # 12; вызов 12 мягкого прерывания
MOV R1, # 34; Установить номер подфункции на 34
 SWI 0 ;
В обработчике ненормального прерывания SWI шаги для получения немедленного значения SWI: сначала определите, что инструкция SWI, которая вызвала мягкое прерывание, является инструкцией ARM и инструкцией Thumb, которые могут быть получены путем доступа к SPSR: затем получите адрес инструкции SWI: Его можно получить, обратившись к регистру LR: затем прочитайте инструкцию и разложите непосредственные данные.
Прочитайте номер SWI:
 T_bit EQU 0x20
 SWI_Hander
STMFD SP!, {R0_R3, R12, LR}; защита на месте
MRS R0, SPSR; читать SPSR
STMFD SP!, {R0}; сохранить SPSR
TST R0, #T_bit; тестовый флаг T
LDRNEH R0, [LR, # -2]; если это инструкция Thumb, прочитайте код инструкции (16 бит)
BICNE R0, R0, # 0xFF00; Получить 8-битное непосредственное значение инструкции Thumb
LDREQ R0, [LR, # -4]; если это инструкция ARM, прочитайте код инструкции (32 бита)
BICNQ R0, R0, # 0xFF00000; Получить непосредственное 24-битное значение инструкции ARM
 …
LMDFDSP !, {R0-R3, R12, PC} ^; аварийный возврат SWI

 MRS
Прочитайте инструкцию регистра статуса. В процессоре ARM только команда MRS может считывать регистр состояния CPSR или SPSR в регистр общего назначения. Формат команды следующий:
 MRS{cond} Rd ,psr
Среди них: целевой регистр Rd. Rd не может быть R15.
CPSR или SPSR
Примеры инструкций MRS следующие:
MRS R1, CPSR; чтение и сохранение регистра состояния CPSR в R1
MRS R2, SPSR; прочитать регистр состояния SPSR и сохранить его в R2
Инструкция MRS считывает CPSR, который может использоваться для определения флага состояния ALU, или разрешены ли прерывания IRQ и FIQ и т. Д. В программе обработки исключений прочитайте SPSR, чтобы узнать состояние процессора перед выполнением исключения. MRS используется вместе с MSR для выполнения операций чтения-изменения-записи в регистре CPSR или SPSR, которые можно использовать для переключения режима процессора (), включения / отключения настроек прерываний IRQ / FIQ. Кроме того, когда процесс переключается или допускается вложение ненормальных прерываний, необходимо также использовать инструкцию MRS для считывания значения состояния SPSR. Сохрани это.
Включить процедуру прерывания IRQ:
 ENABLE_IRQ
 MRS R0,CPSR
 BIC R0。R0,#0x80
 MSR CPSR_c,R0
 MOV PC,LR
Отключить процедуру прерывания IRQ:
 DISABLE_IRQ
 MRS R0,CPSR
 ORR R0,R0,#0x80
 MSR CPSR_c,R0
 MOV PC,LR

 MSR
Напишите инструкцию регистрации статуса. В процессоре ARM. Только инструкция MSR может напрямую установить регистр состояния CPSR или SPSR. Формат команды следующий:
 MSR{cond} psr_fields,#immed_8r
 MSR{cond} psr_fields,Rm
Среди них: ПСР КПСС или СПСР
Поля указывает зону передачи. Поля могут быть одним или несколькими из следующих (буквы должны быть строчными):
Байт маски поля управления (psr [7… 0])
Байт расширенной маски поля (psr [15… 8])
Байт маски поля состояния (psr [23 …. 16])
Байт маски поля флага (psr [31… 24])
Immed_8r Непосредственное значение для передачи в указанное поле регистра состояния, 8 бит.
Rm Исходный регистр данных для передачи в указанное поле регистра состояния.
Примеры инструкций MSR следующие:
MSRCPSR_c, # 0xD3; CPSR [7… 0] = 0xD3, то есть переключиться в режим управления.
 MSR CPSR_cxsf,R3 ;CPSR=R3
 Регистр состояния может быть изменен только в привилегированном режиме
В программе управляющий бит TSR в CPSR не может быть напрямую изменен инструкцией MSR для достижения переключения состояния ARM / Thumb. Инструкция BX должна использоваться для завершения переключения состояния процессора (поскольку инструкция BX является инструкцией передачи, она прерывает состояние конвейера Переключение состояния процессора). MRS используется в сочетании с MSR для выполнения операций чтения-изменения-записи в регистре CPSR или SPSR, которые можно использовать для переключения режимов процессора, включения / отключения прерываний IRQ / FIQ и других настроек.
Процедура реализации инструкции стека:
 INITSTACK
MOV R0, LR; сохранить обратный адрес
Настроить режим управления стеком
 MSR CPSR_c,#0xD3
 LDR SP,StackSvc
Настроить стек режима прерывания
 MSR CPSR_c,#0xD2
 LDR SP,StackIrq
 …

1.3.6 Псевдоинструкция ARM

Псевдоинструкции ARM не являются инструкциями в наборе инструкций ARM, но компилятор определяет псевдоинструкции для удобства программирования. При использовании они могут использоваться как другие инструкции ARM, но эти инструкции будут заменены эквивалентными инструкциями ARM во время компиляции. Существует четыре псевдоинструкции ARM, а именно псевдоинструкция ADR, псевдоинструкция ADRL, псевдоинструкция LDR и псевдоинструкция NOP.
 ADR
Небольшой диапазон директив чтения адресов. Инструкция ADR считывает значение адреса на основе относительного смещения ПК в регистр. При сборке и компиляции исходной программы псевдоинструкция ADR заменяется подходящей инструкцией компилятора. Как правило, компилятор использует инструкцию ADD или инструкцию SUB для реализации функции псевдоинструкции ADR. Если это не может быть реализовано с помощью инструкции, возникает ошибка и происходит сбой компиляции.
Формат псевдоинструкции ADR выглядит следующим образом:
 ADR{cond} register,exper
Среди них: регистрация Целевой регистр загружен.
Выражение адреса. Когда значение адреса не является выравниванием слов, диапазон значений составляет от -255 до 255 байтов, а когда адрес является выравниванием слов, диапазон значений составляет от -1020 до 1020 байтов.
Для значений адреса, основанных на относительном смещении ПК, данный диапазон составляет два слова после текущего адреса инструкции (поскольку ARM7TDMI является трехступенчатым конвейером).
Примеры псевдоинструкций ADR:
 LOOP MOV R1, #0xF0
 …
ADR R2, LOOP; поместите адрес LOOP в R2
 ADR R3, LOOP+4
Вы можете использовать ADR для загрузки адреса, чтобы проверить таблицу:
 …
ADR R0, DISP_TAB; загрузить адрес таблицы преобразования
LDRB R1, [R0, R2]; используйте R2 в качестве параметра для проверки таблицы
 …
 DISP_TAB
 DCB0Xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90

 ADRL
Read Директивы чтения адресов среднего диапазона. Инструкция ADRL считывает значение адреса на основе относительного смещения ПК или значение адреса на основе относительного смещения регистра в регистр и может считывать больший диапазон адресов, чем псевдоинструкция ADR. При сборке и компиляции исходной программы псевдоинструкция ADRL заменяется компилятором с двумя подходящими инструкциями. Если функция псевдоинструкции ADRL не может быть реализована с помощью двух инструкций, возникает ошибка, и компиляция не выполняется. Формат псевдоинструкции ADRL выглядит следующим образом:
 ADR{cond} register,exper
Среди них: регистрация Целевой регистр загружен.
Выражение адреса. Если значение адреса не выровнено по словам, диапазон составляет от -64K до 64K байтов, а если значение адреса выровнено по словам, диапазон значений составляет от -256K до 256K байтов.
Примеры псевдоинструкций ADRL:
 ADRL R0,DATA_BUF
 …
 ADRL R1 DATA_BUF+80
 …
 DATA_BUF
SPACE100; определить 100-байтовый буфер
Вы можете и использовать ADRL для загрузки адресов для достижения программных переходов и загрузки адресов среднего диапазона:
 …
ADR LR, RETURNI; установить обратный адрес
ADRL R1Thumb_Sub + 1; получен адрес входа в подпрограмму Thumb и позиция 1 R1 0
BX R1; вызов подпрограммы Thumb и переключение состояния процессора
 RETURNI
 …
 CODE16
 Thumb_Sub
 MOV R1,#10
 …

 LDR
Широкий спектр директив по чтению адресов. Псевдоинструкция LDR используется для загрузки 32-битного непосредственного значения или значения адреса в указанный регистр. При сборке и компиляции исходной программы псевдоинструкция LDR заменяется подходящей инструкцией компилятора. Если загруженная константа не превышает диапазон MOV или MVN, вместо псевдо-инструкции LDR используется инструкция MOV или MVN, в противном случае ассемблер помещает константу в пул слов и использует инструкцию LDR с относительно смещением для чтения константы из пула текста. , Формат псевдоинструкции LDR выглядит следующим образом:
 LDR{cond} register,=expr/label_expr
Среди них: зарегистрируйте целевой регистр, загруженный
32 цифры сразу.
Выражение адреса Label_expr или внешнее выражение на основе ПК.
Примеры псевдоинструкций LADR:
LDR R0, = 0x123456; загрузить 32-битный прямой номер 0x12345678
LDR R0, = DATA_BUF + 60; загрузить адрес DATA_BUF + 60
 …
LTORG; пул текстов выписок
LDR с псевдоинструкцией часто используется для загрузки адреса регистра (32-разрядных непосредственных данных) периферийных функциональных компонентов микросхемы с целью выполнения различных операций управления для загрузки 32-разрядных непосредственных данных:
 …
LDR R0, = IOPIN; загрузить адрес регистра GPIO IOPIN
LDR R1, [R0]; прочитать значение регистра IOPIN
 …
 LDR R0,=IOSET
 LDR R1,=0x00500500
 STR R1,[R0] ;IOSET=0x00500500
 …
Смещение от ПК к текстовому пулу должно быть менее 4 КБ. По сравнению с LDR инструкции ARM параметры LDR псевдо инструкции имеют «=»

 NOP
Безоперационная псевдоинструкция. Псевдоинструкция NOP будет заменена на неактивную в ARM во время сборки, такую ​​как инструкция «MOV R0, R0» и т. Д. Формат псевдоинструкции NOP следующий:
 NOP
 NOP
 NOP
 NOP
 SUBS R1, R1, #1
 BNE DELAY1
 … 

1.4 Режим адресации

1.4.1 Немедленная адресация

Непосредственному номеру предшествует знак «#», а если это шестнадцатеричное число, после «#» добавляется «0x» или «&», а после двоичного числа «#» следует «%».

1.4.2 Адресация регистра

1.4.3 Регистрация косвенной адресации

Значение в регистре используется в качестве адреса операнда, а сам операнд помещается в память.

Например: ADD R0, R1, [R2]

1.4.4 Индексирование базовых адресов

Добавьте содержимое регистра к смещению адреса, указанному в инструкции, чтобы получить эффективный адрес операнда.

Например: LDR R0, [R1, # 4] R0 <- [R1 + 4]

1.4.5 Многоадресная адресация

Одна инструкция может завершить передачу нескольких регистров, а одна команда передает значения до 16 регистров общего назначения.

LDMIA R0,{R1,R2,R3,R4}

1.4.6 Относительная адресация

Взяв значение программного счетчика ПК в качестве базового адреса и метку адреса в инструкции в качестве смещения, эффективный адрес операнда получается путем сложения двух.

Например: BL NEXT;

1.4.7 Стековая адресация

Используйте специальный регистр для указателя стека, чтобы указать текущую рабочую позицию

Увеличение стека: рост к высоким адресам

Уменьшить стек: расти к младшим адресам

Полный стек: указатель стека указывает на последние действительные данные, помещенные в стек

Пустой стек: указатель стека указывает на следующее пустое место, где должны быть размещены данные

2. GNU ARM гибрид

Исходная программа сборки обычно используется для самой базовой инициализации системы: инициализации указателя стека, установки таблицы страниц, работы с сопроцессором ARM и т. Д. После того, как эти инициализации завершены, вы можете перейти к основной функции кода C для выполнения.

1.1 Формат заявления на ассемблере GNU

любойLinuxСборочная линия имеет следующую структуру:[<label>:][<instruction or directive orpseudo-instruction>}@comment

l инструкция есть инструкция

l директива является псевдооперацией

l псевдо-инструкция для директивы

l <label>:естьЭтикетка,В сборке GNU,Любой идентификатор, заканчивающийся двоеточием, считается меткойНе обязательно в начале строки

l комментарий — комментарий к заявлению

Далее определяется функция «add», которая в итоге возвращает сумму двух параметров:

.section.text, “x”

.globaladd @ give the symbol “add” externallinkage

add:

ADD r0, r0, r1 @ add input arguments

MOV pc, lr @ return from subroutine

@ endof program

Примечание:

l Инструкции ARM, псевдоинструкции, псевдооперации, имена регистров могут состоять из прописных или строчных букв,Но не смешанный случай

l Если предложение слишком длинное, вы можете написать предложение в несколько строк и использовать «» в конце строки, чтобы обозначить разрыв строки (то есть следующая строка совпадает с этой строкой). После «» не может быть символов, включая пробелы и символы табуляции.

1.2 Символ (или метка) в ассемблере GNU

Метка может быть только от А до Я, от А до Я, от 0 до 9 «..«, _ И т. Д. (Состоит из точек, букв, цифр, подчеркиваний и т. Д., Кроме локальных меток, не может начинаться с цифр) символов.

Суть символа: представляетПоэтому адрес, по которому он расположен, также может использоваться как переменная или функция.

l Значение адреса метки в сегменте определяется при сборке;

l Значение адреса метки вне сегмента определяется во время подключения.

Классификация символов: 3 типа (по методу генерации меток).

<1> ПК-этикетка.Метка на основе ПК — это метка перед целевой инструкцией или метка перед псевдооперацией определения данных в программе.Эта метка будет преобразована в значение ПК плюс (или минус) числовую константу во время сборки,Обычно используется для указания команд перехода”b”Адрес назначения и т. Д.,Или небольшое количество данных, встроенных в сегмент кода.

<2> Регистр на основе метки. Метки на основе регистров обычно определяются MAP и FIELD, а также могут быть определены EQU. Эта метка будет преобразована в значение регистра плюс (или минус) числовую константу во время сборки, которая часто используется для доступа к данным в сегменте данных.

<3> Абсолютный адрес.Абсолютный адрес — это 32-битные данные.Диапазон адресов: [0, 232-1], то есть все пространство памяти может быть адресовано напрямую.

Специальное примечание:Местный символ

Местные метки в основном используются в местном масштабе,И местные ярлыки могут появляться неоднократноОн состоит из двух частей:Он начинается с прямого числа 0-99, за которым следует символ, который обычно указывает область действия локальной переменной.Область локальных переменных обычно является текущим сегментом, вы также можете использоватьROUTОпределить область применения локальных переменных.

Синтаксический формат определения локальной переменной:N{routname}

l N: Это число от 0 до 99.

l Rouname: имя текущей локальной области (символ), обычно имя области переменной (Определяется с помощью псевдооперации ROUT)。

Синтаксический формат ссылки на локальную переменную:%{F|B}{A|T}N{routname}

l %: Указывает на справочную операцию

l N: номер локальной переменной

l Rouname: имя текущей области (Определяется с помощью псевдооперации ROUT

l F: поручить компилятору искать только вперед

l B: поручить компилятору искать только в обратном направлении

l A: Поручить компилятору искать все уровни вложенности макроса

l T: поручить компилятору искать текущий уровень макроса

Пример: пример использования локальных символов, программа цикла

subsr0, r0, # 1 @ каждый цикл составляет r0 = r0-1

bne 1F @Перейти к 1 метке для выполнения

Примечание:

l Если ни F, ни B не указаны, компилятор сначала ищет вперед, а затем назад

l Если не указаны ни A, ни T, компилятор ищет все текущие уровни до самого высокого уровня макроса, и уровни ниже текущего уровня больше не ищутся.

l Если указано имя маршрута, компилятор выполняет поиск самой последней псевдо операции ROUT.Если имя маршрута не совпадает с именем, определенным псевдо операцией ROUT, компилятор сообщает об ошибке, и сборка завершается неудачно.

1.3 Сегментация в ассемблере GNU

<1> псевдооперация .section

.section <section_name> {,”<flags>”}

Startsa new code or data section. Sections in GNU are called .text, a code section, .data, an initializeddata section, and .bss, an uninitialized data section.

Thesesections have default flags, and the linker understands the default names(similardirective to the armasm directive AREA).The following are allowable.section flagsfor ELF format files:

<Flag> Meaning

allowable section

writable section

executable section

Китайское объяснение:

Пользователь может настроить раздел с помощью псевдооперации .section,Формат выглядит следующим образом:

.section section_name [,»flags»[, %type[,flag_specific_arguments]]]

Каждый сегмент начинается с имени сегмента и заканчивается следующим именем сегмента или концом файла.Эти сегменты имеют флаги по умолчаниюРазъем может распознавать эти метки.(То же, что ОБЛАСТЬ в руке). Ниже приведены допустимые сегменты в формате ELF.flags:

Значение <Logo>

разрешенный раздел

w записываемый сегмент

х Исполнительный раздел

Пример: определить «сегмент»

.section.mysection @Пользовательский сегмент данныхНазвание раздела “.mysection”

.align 2

strtemp:

.ascii «Temp string n» @Чтобы понять это предложение, я думаю, что это должно быть: сохранить строку «Temp string n 0» в разделе пространства памяти, начинающемся с метки strtemp

<2> Предопределенные имена сегментов системы сборки

l .text @Фрагмент кода

l .data @Инициализировать сегмент данных.data Read-write initialized long data.

l .bss @Неинициализированный сегмент данных

l .sdata .sdata Read-write initialized short data.

l .sbss @

Примечание:Раздел .bss в исходной программе должен находиться перед разделом .text.

1.4 Точка входа в определение языка ассемблера GNU

Запись по умолчанию для ассемблера_startЭтикетка,Пользователи также могут использовать флаг ENTRY для указания других точек входа в сценарии подключения.

Пример: определение точки входа

.section .data

< initialized data here>

.section .bss

< uninitialized data here>

.section .text

.globl _start

_start:

<instruction code goes here>

1.5 Определение макро в ассемблере GNU

Формат выглядит следующим образом:

Макро имя макроса имя параметра @Директива. Макрос определяет макрос

Макро тело

.endm @.endmУказывает конец макроса

Если макрос использует параметр, добавьте префикс при использовании параметра в теле макроса“”Параметры, используемые в определении макроса, также могут использовать значения по умолчанию.Вы можете использовать директиву .exitm для выхода из макроса.

Пример: определение макроса

.macroSHIFTLEFT a, b

.if b< 0

MOV a,a, ASR #-b

.exitm

.endif

MOV a,a, LSL #b

.endm

1.6 Константы в ассемблере GNU

<1> Десятичные числа начинаются с ненулевых цифр, таких как: 123 и 9876;

<2> Двоичное число начинается с 0b, и буквы также могут быть заглавными;

<3> Восьмеричное число начинается с 0, например: 0456,0123;

<4> Шестнадцатеричные числа начинаются с 0x, например: 0xabcd, 0X123f;

<5> Строковые константы должны быть заключены в кавычки, а в середине можно также использовать escape-символы, такие как: «Добро пожаловать! N»;

<6> Текущий адрес начинается с «.«Означает, что вGNUЭтот символ может использоваться в ассемблере для представления адреса текущей инструкции;

<7> Выражение: выражение в ассемблере может использовать постоянное или числовое значение, «-» означает взятие отрицательного числа, «~» означает дополнение, «<>» означает не равно, другие символы, такие как: +, -, *, ,%, <, <<,>, >>, |, &, ^,!, ==,> =, <=, &&, || аналогичны использованию в языке Си.

1.7 Общие псевдо-операции сборки GNU ARM

Некоторые операции были упомянуты ранее, и следующие операции:

l Псевдооперация определения данных: .byte, .short, .long, .quad, .float, .string / .asciz / .ascii, многократно определяют псевдо-операции.rept, оператор присваивания .equ / .set;

l Определение функции

l Выравнивание псевдооперации .align;

l Псевдо-операция завершения исходного файла .end;

l .включить псевдооперацию;

l если псевдо операция

l псевдооперация .global / .globl;

l .type псевдооперация;

l Оператор управления списком;

Отличается отGNUASОбщие псевдо-операции сборки, следующие ARM-специфические псевдо-операции:

.reg ,.unreq,.code ,.thumb ,.thumb_func,.thumb_set, .ltorg,.pool

<1> Псевдооперация определения данных

l .byte: однобайтовое определение, например: .byte1,2,0b01,0x34,072, ‘s’;

l .short: определяет двухбайтовые данные, такие как: .short 0x1234,60000;

l .long: определяет 4 байта данных, например: .long0x12345678,23876565

l .quad: определить 8 байтов, например: .quad 0x1234567890abcd

l .float: определить числа с плавающей запятой, такие как: .float0f-314159265358979323846264338327

95028841971.693993751E-40 @ — pi

l .string / .asciz / .ascii: определить несколько строк, например:

.string «abcd»,»efgh», «hello!»

.asciz «qwer»,»sun», «world!»

.ascii «welcome»

Примечание:Строка, определенная псевдооперацией ascii, должна добавить конечный символ ‘ 0’ сама по себе.

l .rept: неоднократно определять псевдооперацию, формат выглядит следующим образом:

.rept Количество повторений

Определение данных

.endr @Конец повторения определения

Пример:

.rept 3

.byte 0x23

.endr

l .equ / .set: оператор присваивания, формат которого следующий:

.equ(.set)Имя переменной, выражение

Пример:

.equ abc, 3 @Пусть abc = 3

<2> Псевдооперация определения функции

l Определение функции, формат выглядит следующим образом:

Имя функции:

Тело функции

Возврат заявления

В общемЕсли функцию необходимо вызывать в других файлах, необходимо использовать псевдооперацию .global для объявления функции как глобальной функции.Чтобы не вызывать путаницы, когда другие программы вызывают функцию C, нам нужно следить за использованием регистров.APCSРекомендации.Компилятор функций обработает код функции как код сборки .global.

l Написание функции должно следовать следующим правилам:

a. Регистры a1-a4 (параметры, регистры результата или временные регистры, синонимы от r0 до r3) и регистры с плавающей запятой f0-f3 (если есть сопроцессор с плавающей запятой) не обязательно сохраняются в функции;

b. Если функция возвращает значение, не превышающее размер слова, значение должно быть отправлено в конец функции в г0;

c. Если функция возвращает число с плавающей запятой, поместите его в регистр с плавающей запятой f0 в конце функции;

d. Если процесс функции меняет sp (указатель стека, r13), fp (указатель кадра, r11), sl (предел стека, r10), lr (регистр соединения, r14), v1-v8 (регистр переменной, r4 на r11) и f4-f7, тогда эти регистры должны быть восстановлены в конце функции, чтобы содержать значение, которое она удерживала при входе в функцию.

<3> псевдо-операция .align.end.include.incbin

l .align: Используется для указания выравнивания данных, формат выглядит следующим образом:

.align [absexpr1, absexpr2]

В некотором раскладеЗаполните значения в неиспользованном хранилище.Первое значение указывает на выравнивание,4, 8, 16 или 32.Второе значение выражения представляет заполненное значение.

l .end: указывает на конец исходного файла.

l .include: вы можете развернуть указанный файл, где используется .include, обычно это заголовочный файл, например:

.include “myarmasm.h”

l Псевдооперация .incbin может скомпилировать неповрежденный двоичный файл в текущий файлИ способ использования заключается в следующем:

.incbin»file»[,skip[,count]]

skipОн указывает, что файл читается с начала файла, пропускает пропущенные байты, а count — это количество прочитанных слов.

<4> ..если псевдооперация

В соответствии со значением выражения, чтобы решить, следует ли компилировать следующий код, используйте псевдооперацию .endif, чтобы указать конец условного суждения,В середине вы можете использовать .else, чтобы определить, какая часть кода должна быть скомпилирована, если условие .if не выполнено.

.if имеет несколько вариантов:

.ifdefsymbol @Определите, определен ли символ

.ifcstring1,string2 @Если строки string1 и string2 равны, строку можно заключить в одинарные кавычки

.ifeqexpression @Определите, равно ли значение выражения 0

.ifeqsstring1,string2  @Определите, равны ли string1 и string2, строка должна быть заключена в двойные кавычки

.ifgeexpression @Определите, является ли значение выражения больше или равно 0

.ifgtabsolute expression @ Определить, является ли значение выражения больше 0

.ifleexpression @Определите, является ли значение выражения меньше или равно 0

.ifltabsolute expression @Определите, является ли значение выражения меньше 0

.ifncstring1,string2  @Чтобы определить, не совпадают ли string1 и string2, их использование в точности противоположно .ifc.

.ifndefsymbol, .ifnotdef @ symbol @ Определить, не является ли символ определенным, как противоположность .ifdef

.ifneexpression @Если значение выражения не равно 0, то компилятор скомпилирует следующий код

.ifnesstring1,string2 @Если строки string1 и string2 не равны, компилятор скомпилирует следующий код.

<5> .global .type .title .list

l .global / .globl: используется для определения глобального символа, формат выглядит следующим образом:

.global symbol или .globl symbol

l .type:Используется для указания, является ли тип символа типом функции или типом объекта,Тип объекта, как правило, данные, Формат выглядит следующим образом:

 .typeСимвол, описание типа

Пример:

.globla

.data

.align4

.typea, @object

.sizea, 4

a:

.long10

Пример:

.section.text

.typeasmfunc, @function

.globlasmfunc

asmfunc:

mov pc,lr

<6> Контрольный оператор списка:

.title: Используется для указания заголовка списка сборки, например:

.title “my program”

.list: используется для вывода файла списка.

<7> ARM-специфичные псевдо-операции

l .reg: используется для присвоения псевдонима регистру, формат следующий:

Псевдонимы .req имя регистра

l .unreq: используется для отмены псевдонима регистра, формат выглядит следующим образом:

.unreq зарегистрировать псевдоним

Обратите внимание, что отмененный псевдоним должен быть определен заранее, в противном случае компилятор сообщит об ошибке.Эту псевдооперацию также можно использовать для отмены предварительно созданного системного псевдонима, такого как r0, но это делать не рекомендуется, если в этом нет необходимости.

l Псевдооперация .code используется для выбора набора команд ARM или Thumb, формат которого следующий:

.code выражение

Если значение выражения равно 16, это означает, что следующая инструкция является инструкцией Thumb, если значение выражения равно 32, это означает, что следующая инструкция является инструкцией ARM.

l Псевдооперация .thumb эквивалентна .code 16, указывая на то, что используется команда Thumb, и аналогичный .arm эквивалентен .code 32

l Псевдооперация .force_thumb используется для того, чтобы заставить целевой процессор выбрать большой набор команд независимо от того, поддерживает ли его процессор

l Псевдооперация .thumb_func используется для указания того, что функция является функцией набора команд большого пальца

l Псевдооперация .thumb_set аналогична .set, которую можно использовать для присвоения псевдониму флага. В дополнение к функции .set, флаг может быть помечен как вход в функцию thumb.

l .ltorg используется для объявления начала пула данных, который может выделять много места.

l .pool имеет тот же эффект, что и .ltorg

l .space<number_of_bytes> {,<fill_byte>}

Выделите число_байт_байт пространства данных и заполните его значением fill_byte. Если это значение не указано, по умолчанию заполняется 0. (Та же функция, что и у пробела в армасмах)

l .word <word1>{,<word2>} …Вставьте 32-битную очередь данных.(Та же функция, что и у DCD в армасмах)Вы можете использовать .word, чтобы использовать идентификатор как константу.

Пример:

Start:

valueOfStart:

.word Start

Таким образом, Start хранится в начале программыЗначение переменной памятиOfStartДюйм

l .hword<short1> {,<short2>} …

Вставьте 16-битную очередь данных. (То же, что DCW в оружии)

1.8 Специальные символы и синтаксис сборки GNU ARM

<1> Символ комментария в строке кода: ‘@’

<2> Весь символ комментария строки: ‘#’

<3> Символ разделения операторов: ‘‘; ’

<4> Немедленный префикс: ‘#’ или ‘$’

3. ARM GCC встроенная сборка

Для процессоров RISC на основе ARM компилятор GNUC обеспечивает функцию встроенной сборки в C-коде. Эта очень полезная функция предоставляет функции, которые не поддерживаются кодом C, такие как ручная оптимизация кода ключевых частей программного обеспечения и использование соответствующих инструкций процессора. Здесь предполагается, что читатель является специалистом по написанию ARM-ассемблера, поскольку этот документ не является руководством по сборке ARM. И это неЯзык CРуководство. В этом документе предполагается, что используется версия 4 GCC, но она действительна для более ранних версий.

GCCasm заявление

Давайте начнем с простого примера. Как и объявление в C, следующий код объявления может появиться в вашем коде.

/ * Пример NOP * /

asm(«movr0,r0»);

Цель этого утверждения — переместить r0 в r0. Другими словами, он ничего не делает. Типичной является инструкция NOP, роль — короткая задержка.

Пожалуйста, продолжайте читать и изучать этот документ, потому что это утверждение отличается от того, что вы думаете, и других утверждений С. Встроенная сборка использует инструкции по сборке так же, как методы, используемые в чистых программах сборки. Вы можете написать несколько инструкций по сборке в операторе asm. Но для того, чтобы улучшить читаемость программы, лучше всего поместить каждую инструкцию по сборке в отдельную строку.

asm(

«mov r0, r0nt»

«mov r0, r0nt»

«mov r0, r0nt»

«mov r0, r0»

);

Использование разрывов строк и вкладок может сделать список команд красивым. В первый раз вы можете выглядеть немного странно, но когда компилятор C компилирует оператор C, он генерирует сборку в соответствии с вышеприведенным (перевод строки и табуляция). До сих пор нет никакой разницы между инструкциями по сборке и кодом в чистом ассемблере, который вы пишете. Но по сравнению с другими операторами C обработка констант и регистров asm отличается. Общий встроенный шаблон сборки выглядит следующим образом.

asm(code : output operand list : input operand list : clobberlist);

Связь между сборкой и оператором C осуществляется через необязательный список выходных операндов и список входных операндов в приведенном выше операторе asm., Клоббер списки позже.

Нижес языкомЦелочисленная переменная передается в сборку, и логика сдвигается влево на один бит перед передачей в другую целочисленную переменную на языке Си.

/* Rotating bits example */

asm(«mov %[result], %[value], ror #1» :[result] «=r» (y) : [value] «r» (x));

Каждое утверждение asm разделено на четыре части двоеточием (:).

Инструкции по сборке помещены в середине «» в первой части.

«mov %[result], %[value], ror #1»

Далее идет необязательный вывод и список после двоеточия,Каждая запись состоит из пары [] (квадратные скобки) и включенного в нее имени символа, за которым следует ограничительная строка, за которой следуют скобки и переменная C, заключенная в нее., В этом примере есть только одна запись.

[result] «=r» (y)

После двоеточия приведен список операторов ввода, его синтаксис такой же, как и список операций ввода

[value] «r» (x)

Список деструкторов, не использованный в этом примере

Как и в примере с NOP выше, в 4 частях оператора asmПока самая неиспользованная часть может быть опущена. Но есть одна вещь, которую следует отметить, это то, что пока используется последняя часть из 4-х частей, первая часть не может быть пропущена, если она не используется. Она должна быть пустой, но сохранять двоеточие, В следующем примере устанавливается регистр CPSR для ARMSoc, в котором есть входной, но нет выходного операнда.

asm(«msr cpsr,%[ps]» : : [ps]»r»(status))

Даже если код сборки не используется, часть кода должна содержать пустую строку. Следующий примерИспользуется специальный деструктор, целью которого является сообщить компилятору, что память была измененаA. Деструктор здесь объясняется в разделе оптимизации ниже.

asm(«»:::»memory»);

Чтобы повысить читабельность кода, вы можете использовать разрывы строк, пробелы и комментарии в стиле C

asm(«mov %[result], %[value], ror#1»

: [result]»=r» (y) /*Rotation result. */

: [value]»r» (x) /*Rotated value. */

: /* No clobbers */

);

Часть кода% сопровождается символами в квадратных скобках в следующих двух частях, что относится к записи в том же списке операций с символами

% [результат] представляет переменную С у второй части, а% [значение] представляет переменную С х трех частей;

Имена символических операторов используют отдельное пространство имен. Это означает, что он использует другие таблицы символов. Проще говоря, это означает, что вам не нужно беспокоиться об именах символов, используемых в C-коде. В раннем коде C пример циклического сдвига должен быть написан так:

asm(«mov %0, %1, ror #1″ :»=r» (result) : «r» (value))

В коде ассемблера ссылка операнда использует%, за которым следует число,% 1 представляет первый операнд,% 2 кодирует второй операнд и так далее. Этот метод в настоящее время поддерживается новейшими компиляторами. Но поддерживать код нелегко. Представьте, что вы написали много кода для инструкций по сборке. Если вы хотите вставить операнд, вам придется снова изменить номер операнда.

Оптимизировать код C

Есть две ситуации, которые определяют, что вы должны использовать сборку. Во-первых, C ограничивает вас быть ближе к базовому операционному оборудованию, например, C не изменяет напрямую оператор регистра состояния программы (PSR). Второе — написать более оптимизированный код. Нет сомнений, что оптимизатор кода GNUC работает очень хорошо, но его результаты далеки от кода сборки, который мы написали вручную.

Эта часть очень важна и является наиболее игнорируемой другими: код сборки, который мы добавляем через встроенную инструкцию сборки в коде C, также обрабатывается оптимизатором компилятора C. Давайте посмотрим на это ниже.

Ниже приведен пример кода.

[email protected]:~/embedded/basic-C$ arm-linux-gcc -c test.c

[email protected]:~/embedded/basic-C$ arm-linux-objdump -D test.o

Компилятор выбрал r3 в качестве циклического сдвига. Он также может выбрать распределение регистров для каждой переменной C. Загрузка или сохранение значения не выполняется явно. Ниже приведены результаты компиляции других компиляторов.

E420A0E1 mov r2, r4, ror #1 @ y, x

Компилятор выбирает соответствующий регистр для каждого операнда, кэширует манипулируемое значение в r4, а затем передает значение в r2. Вы можете понять этот процесс?

Иногда процесс ухудшается. Иногда компилятор даже полностью отбрасывает ваш встроенный ассемблерный код. Такое поведение компилятора C зависит от стратегии оптимизатора кода и контекста, в который встроена сборка. Если никакая выходная часть не используется во встроенном операторе сборки, оптимизатор кода C, вероятно, полностью удалит встроенный оператор. Например, пример NOP, мы можем использовать его как операцию задержки, но для компилятора, который влияет на скорость выполнения программы, это бессмысленно.

Вышеуказанные решения все еще доступны. ЭтоИспользуйте ключевое слово volatile. Его роль заключается в запрещении оптимизации оптимизатора, Модифицированный пример NOP выглядит следующим образом:

/* NOP example, revised */

asm volatile(«movr0, r0»);

Внизу нас ждут еще неприятности. Хорошо продуманный оптимизатор может изменить код. Посмотрите на код ниже:

i++;

if (j == 1)

x += 3;

i++;

Оптимизатор определенно реорганизует код, и два i ++ не влияют на условие if. Кроме того, значение i увеличивается на 2, и используется только одна инструкция по сборке ARM. Поэтому код должен быть реорганизован следующим образом:

if (j == 1)

x += 3;

i += 2;

Это сохраняет инструкцию ARM. Результат: эти операции не были одобрены.

Они будут иметь большое влияние на ваш код, который будет представлен ниже. Следующий код — это c c времен b, где один или оба из c и b могут быть изменены обработчиком прерываний. Перед вводом кода отключите прерывание, а затем выполните код перед включением прерывания.

asm volatile(«mrs r12,cpsrnt»

«orr r12, r12, #0xC0nt»

«msr cpsr_c, r12nt» ::: «r12», «cc»);

c *= b; /* This may fail. */

asm volatile(«mrs r12, cpsrn»

«bic r12, r12, #0xC0n»

«msr cpsr_c, r12» ::: «r12», «cc»);

Но, к сожалению, для приведенного выше кода оптимизатор решил сначала выполнить умножение, а затем выполнить две встроенные сборки или наоборот. Это сделает наш код бессмысленным.

Мы можем использовать clobberlist, чтобы помочь. Список Clobber в приведенном выше примере выглядит следующим образом:

«r12″,»cc»

Приведенный выше список clobber будет передавать следующую информацию компилятору, изменяя флаги r12 и регистр состояния программы. Между прочим, прямое указание используемых регистров, вероятно, помешает лучшим результатам оптимизации. Обычно вы просто передаете переменную и позволяете компилятору выбрать соответствующий регистр. Кроме того, имя регистра, cc (регистр условий, флаг регистра состояния) и память — все допустимые ключевые слова в списке клоббера.Он используется для указания компилятору, что инструкция встроенной сборки изменила значение в памяти, Это заставит компилятор сохранить все кэшированные значения перед выполнением кода сборки, а затем перезагрузить значения после выполнения кода сборки. Это сохранит порядок выполнения программы, потому что после использования объявления asm с клоббером памяти содержимое всех переменных непредсказуемо.

asm volatile(«mrs r12,cpsrnt»

«orr r12, r12, #0xC0nt»

«msr cpsr_c, r12nt» :: : «r12», «cc»,»memory»);

c *= b; /* This is safe. */

asm volatile(«mrs r12, cpsrn»

«bic r12, r12, #0xC0n»

«msr cpsr_c, r12» ::: «r12», «cc»,»memory»);

Отменить все кэшированные значения, только неоптимальные. При желании вы можете добавить dummyoperand, чтобы вручную добавить зависимости.

asm volatile(«mrs r12,cpsrnt»

«orr r12, r12, #0xC0nt»

«msr cpsr_c, r12nt» : «=X» (b) :: «r12″,»cc»);

c *= b; /* This is safe. */

asm volatile(«mrs r12

Первый asm выше пытается сначала изменить переменную b, а второй asm пытается изменить c. Это сохранит порядок выполнения трех операторов без аннулирования кэшированных переменных.

Важно понимать влияние оптимизатора на встроенную сборку. Если вы все еще читаете его в облаках, лучше прочитать эту статью несколько раз, прежде чем читать следующую тему ^ _ ^.

Input and output operands

Как мы узнали ранее, каждый операнд ввода и вывода состоит из символического имени, заключенного в квадратные скобки [], строки с ограничениями и выражения C в скобках.

Что это за ограничительные строки и зачем они нам нужны? Вы должны знать, что каждая инструкция по сборке принимает только определенные типы операндов. Например: целевой адрес перехода, ожидаемый инструкцией перехода. Не все адреса памяти являются действительными. Потому что окончательный код операции принимает только 24-битное смещение. Но противоречие состоит в том, что и команда перехода, и команда обмена данными ожидают, что 32-разрядный целевой адрес будет сохранен в регистре. Во всех случаях указатель функции может быть передан от C к операнду. Таким образом, перед лицом констант, указателей и переменных, передаваемых встроенной сборке, компилятор должен знать, как организовать его в код сборки.

Для основных процессоров ARM GCC предоставляет следующие ограничения.

Constraint

Usage in ARM state

Usage in Thumb state

f

Floating point registers f0 .. f7

Not available

G

Immediate floating point constant

Not available

H

Same a G, but negated

Not available

I

Immediate value in data processing instructions

e.g. ORR R0, R0, #operand

Constant in the range 0 .. 255

e.g. SWI operand

J

Indexing constants -4095 .. 4095

e.g. LDR R1, [PC, #operand]

Constant in the range -255 .. -1

e.g. SUB R0, R0, #operand

K

Same as I, but inverted

Same as I, but shifted

L

Same as I, but negated

Constant in the range -7 .. 7

e.g. SUB R0, R1, #operand

l

Same as r

Registers r0..r7

e.g. PUSH operand

M

Constant in the range of 0 .. 32 or a power of 2

e.g. MOV R2, R1, ROR #operand

Constant that is a multiple of 4 in the range of 0 .. 1020

e.g. ADD R0, SP, #operand

m

Any valid memory address

N

Not available

Constant in the range of 0 .. 31

e.g. LSL R0, R1, #operand

o

Not available

Constant that is a multiple of 4 in the range of -508 .. 508

e.g. ADD SP, #operand

r

General register r0 .. r15

e.g. SUB operand1, operand2, operand3

Not available

W

Vector floating point registers s0 .. s31

Not available

X

Any operand

= :Write-only operand, usually used for all output operands

+ :Read-write operand, must be listed as an output operand

& :A register that should be used for output only

Выходные операнды должны быть только для записи, а значение соответствующего выражения C должно быть lvalue. Входные операнды должны быть доступны только для чтения. Компилятор C не способен выполнить эту проверку.

Более строгое правило: не пытайтесь писать во входной операнд. Но если вы хотите использовать тот же операнд, что и для ввода и вывода. Ограничительный модификатор (+) может добиться эффекта. Примеры следующие:

asm(«mov %[value], %[value], ror #1″ : [value]»+r» (y))

В отличие от приведенного выше примера, окончательный результат сохраняется во входной переменной.

Возможно, модификатор + не поддерживает более ранние версии компилятора. К счастью, здесь представлены другие решения, и этот метод все еще действует в последних компиляторах.Для операторов ввода можно использовать одно число n в ограниченной строке. Используйте число n, чтобы указать компилятору использовать n-й операнд, операнд начинает считать с 0, Вот пример:

asm(«mov %0, %0, ror #1» : «=r» (value) :»0″ (value))

Ограничительная строка «0» указывает компилятору использовать тот же регистр ввода, что и первый оператор вывода.

Обратите внимание, что это не будет реализовано автоматически в обратном случае. Если бы я не сказал компилятору сделать это, компилятор мог бы также выбрать тот же регистр для ввода и вывода. В первом примере r3 был выбран для ввода и вывода.

В большинстве случаев это ничего, но если выходные данные были изменены до того, как их использовать, они будут фатальными. В случае, когда на входе и на выходе используются разные регистры, вы должны использовать & модификатор, чтобы ограничить выходной операнд. Ниже приведен пример кода:

asm volatile(«ldr %0, [%1]»»nt»

«str %2, [%1, #4]»»nt»

: «=&r» (rdv)

: «r»(&table), «r» (wdv)

: «memory»);

Прочитайте значение в таблице, а затем запишите в другое место в таблице.

другое

Встроенная сборка как макрос предварительной обработки

Если вы часто используете частичную сборку, лучше всего определить ее в заголовочном файле в виде макроса. Использование этого заголовочного файла вызовет предупреждение в строгом режиме ANSI. Во избежание таких проблем, Вы можете использовать __asm__ вместо asm, __volatile__ вместо volatile, Это может быть эквивалентно псевдониму. Вот рутина:

#define BYTESWAP(val) 

__asm__ __volatile__ ( 

«eor r3, %1, %1, ror #16nt» 

«bic r3, r3, #0x00FF0000nt» 

«mov %0, %1, ror #8nt» 

«eor %0, %0, r3, lsr #8» 

: «=r» (val) 

: «0»(val) 

: «r3», «cc» 

);

Функция C ворс

Определение макроса содержит тот же код. Это недопустимо в больших процедурах. В этом случае лучше определить функцию-заглушку.

unsigned long ByteSwap(unsigned longval)

{

asm volatile (

«eor r3, %1, %1, ror #16nt»

«bic r3, r3, #0x00FF0000nt»

«mov %0, %1, ror #8nt»

«eor %0, %0, r3, lsr #8»

: «=r» (val)

: «0»(val)

: «r3»

);

return val;

}

Заменить символическое имя переменной C

По умолчанию GCC использует то же символическое имя, что и функция или переменная. Вы можете использовать оператор asm, чтобы указать другое имя символа для кода сборки

unsigned long value asm(«clock») = 3686400

Это утверждение говорит компилятору использовать символическое имя часов вместо определенного значения.

Заменить символическое имя функции C

Чтобы изменить имя функции, вам нужно объявление прототипа, потому что компилятор не принимает ключевое слово asm в определении функции.

extern long Calc(void) asm («CALCULATE»)

Вызов функции calc () создаст инструкцию по сборке, которая вызывает функцию CALCULATE.

Принудительное использование определенных регистров

Локальные переменные могут храниться в регистре. Вы можете использовать встроенную сборку, чтобы указать конкретный регистр для этой переменной.

void Count(void) {

register unsigned char counterasm(«r3»);

… some code…

asm volatile(«eor r3, r3,r3»);

… more code…

}

Инструкция по сборке «eor r3, r3, r3» очистит r3. Waring: этот пример проблематичен в большинстве случаев, потому что он конфликтует с оптимизатором. Потому что GCC не будет резервировать другие регистры. Если оптимизатор считает, что переменная некоторое время не использовалась, регистр будет использоваться снова. Но у компилятора нет возможности проверить, не конфликтует ли он с предопределенными регистрами компилятора. Если вы укажете слишком много регистров таким образом, компилятор исчерпает регистры во время генерации кода.

Регистр временного пользования

Если вы используете регистры и не передаете входной или выходной операнд, вы должны указать их компилятору. В следующем примере r3 используется как пустой регистр.При записи r3 в список clobber компилятор знает, как использовать регистр. Поскольку инструкция ands имеет новый бит флага в регистре состояния, используйте cc для указания в списке clobber.

asm volatile(

«ands r3, %1, #3» «nt»

«eor %0, %0, r3» «nt»

«addne %0, #4»

: «=r» (len)

: «0» (len)

: «cc», «r3»

);

Лучший способ — использовать функции-заглушки и использовать локальные временные переменные.

Цель регистрации

Лучшим методом является анализ списка скомпилированных сборок и изучение кода, сгенерированного компилятором C. Ниже приведен типичный пример использования регистров ядра ARM компилятором, знание которого поможет понять код.

Register

Alt. Name

Usage

r0

a1

First function argument

Integer function result

Scratch register

r1

a2

Second function argument

Scratch register

r2

a3

Third function argument

Scratch register

r3

a4

Fourth function argument

Scratch register

r4

v1

Register variable

r5

v2

Register variable

r6

v3

Register variable

r7

v4

Register variable

r8

v5

Register variable=

r9

v6

rfp

Register variable

Real frame pointer

r10

sl

Stack limit

r11

fp

Argument pointer

r12

ip

Temporary workspace

r13

sp

Stack pointer

r14

lr

Link register Workspace

r15

pc

Program counter

  1. Manuals
  2. Brands
  3. ARM Manuals
  4. Processor
  5. Cortex-M4
  6. Generic user manual
  • Contents

  • Table of Contents

  • Bookmarks

Quick Links

Cortex

-M4 Devices

Generic User Guide

Copyright © 2010 ARM. All rights reserved.

ARM DUI 0553A (ID121610)

loading

Related Manuals for ARM Cortex-M4

Summary of Contents for ARM Cortex-M4

  • Page 1
    Cortex -M4 Devices ™ Generic User Guide Copyright © 2010 ARM. All rights reserved. ARM DUI 0553A (ID121610)
  • Page 2
    This document is intended only to assist the reader in the use of the product. ARM shall not be liable for any loss or damage arising from the use of any information in this document, or any error or omission in such information, or any incorrect use of the product.
  • Page 3: Table Of Contents

    Cortex-M4 Devices Generic User Guide Preface About this book ………………….vi Feedback ……………………ix Chapter 1 Introduction About the Cortex-M4 processor and core peripherals ……….1-2 Chapter 2 The Cortex-M4 Processor Programmers model ………………..2-2 Memory model ………………….. 2-12 Exception model ………………..2-21 Fault handling ………………….

  • Page 4
    Chapter 4 Cortex-M4 Peripherals About the Cortex-M4 peripherals …………….4-2 Nested Vectored Interrupt Controller …………… 4-3 System control block ………………..4-11 System timer, SysTick ………………. 4-33 Optional Memory Protection Unit …………….4-37 Floating Point Unit (FPU) ………………4-48 Appendix A Cortex-M4 Options Cortex-M4 implementation options …………….
  • Page 5
    Preface This preface introduces the Cortex-M4 Devices Generic User Guide. It contains the following sections: • About this book on page vi • Feedback on page ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. ID121610 Non-Confidential…
  • Page 6: About This Book

    Preface About this book This book is a generic user guide for devices that implement the ARM Cortex-M4 processor. Implementers of Cortex-M4 designs make a number of implementation choices, that can affect the functionality of the device. This means that, in this book: •…

  • Page 7: Typographical Conventions

    < and > Enclose replaceable terms for assembler syntax where they appear in code or code fragments. For example: CMP Rn, <Rm|#imm> ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. ID121610 Non-Confidential…

  • Page 8: Other Publications

    • ARMv7-M Architecture Reference Manual (ARM DDI 0403). Other publications This guide only provides generic information for devices that implement the ARM Cortex-M4 processor. For information about your device see the documentation published by the device manufacturer. ARM DUI 0553A Copyright ©…

  • Page 9
    Preface Feedback ARM welcomes feedback on this product and its documentation. Feedback on content If you have comments on content then send an e-mail to . Give: errata@arm.com • the title • the number, ARM DUI 0553A • the page numbers to which your comments apply •…
  • Page 10: About The Cortex-M4 Processor And Core Peripherals

    Chapter 1 Introduction This chapter introduces the Cortex-M4 processor and its features. It contains the following section: • About the Cortex-M4 processor and core peripherals on page 1-2. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. ID121610 Non-Confidential…

  • Page 11
    Figure 1-1 Cortex-M4 implementation The Cortex-M4 processor is built on a high-performance processor core, with a 3-stage pipeline Harvard architecture, making it ideal for demanding embedded applications. The processor delivers exceptional power efficiency through an efficient instruction set and extensively…
  • Page 12
    Boolean data handling. The Cortex-M4 processor has an optional Memory Protection Unit (MPU) that permits control of individual regions in memory, enabling applications to utilize multiple privilege levels, separating and protecting code, data and stack on a task-by-task basis.
  • Page 13: Programmers Model

    It provides up to eight different regions, and an optional predefined background region. Floating-point Unit The Floating-Point Unit (FPU) provides IEEE754-compliant operations on single-precision, 32-bit, floating-point values. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. ID121610 Non-Confidential…

  • Page 14: Memory Model

    Chapter 2 The Cortex-M4 Processor This chapter describes the Cortex-M4 processor. It contains the following sections: • Programmers model on page 2-2 • Memory model on page 2-12 • Exception model on page 2-21 • Fault handling on page 2-29 •…

  • Page 15
    The Cortex-M4 Processor Programmers model This section describes the Cortex-M4 programmers model. In addition to the individual core register descriptions, it contains information about the processor modes and privilege levels for software execution and stacks. 2.1.1 Processor mode and privilege levels for software execution…
  • Page 16
    Describes access type during program execution in thread mode and Handler mode. Debug access can differ. b. An entry of Either means privileged and unprivileged software can access the register. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. ID121610 Non-Confidential…
  • Page 17
    For example: • read all of the registers using with the instruction • write to the APSR N, Z, C, V, and Q bits using with the instruction. APSR_nzcvq ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. ID121610 Non-Confidential…
  • Page 18
    [28] Overflow flag [27] DSP overflow and saturation flag [26:20] Reserved [19:16] GE[3:0] Greater than or Equal flags. See SEL on page 3-70 for more information. [15:0] Reserved ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. ID121610 Non-Confidential…
  • Page 19
    [31:27] Reserved. [26:25], [15:10] Interruptible-continuable instruction bits, see Interruptible-continuable instructions on page 2-7. [26:25], [15:10] Indicates the execution state bits of the instruction, see IT on page 3-122. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. ID121610 Non-Confidential…
  • Page 20
    The conditions for the instructions are either all the same, or some can be the inverse of others. See IT on page 3-122 for more information. Thumb state The Cortex-M4 processor only supports execution of instructions in Thumb state. The following can clear the T bit to 0: • instructions POP{PC •…
  • Page 21
    1 = prevents the activation of all exceptions except for NMI. The processor clears the FAULTMASK bit to 0 on exit from any exception handler except the NMI handler. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. ID121610 Non-Confidential…
  • Page 22: Control Register

    0 = no floating-point context active 1 = floating-point context active. The Cortex-M4 uses this bit to determine whether to preserve floating-point state when processing an exception. SPSEL Defines the currently active stack pointer: In Handler mode this bit reads as zero and ignores writes. The…

  • Page 23
    The Cortex-M4 Processor In an OS environment, ARM recommends that threads running in Thread mode use the process stack and the kernel and exception handlers use the main stack. By default, Thread mode uses the MSP. To switch the stack pointer used in Thread mode to the PSP, either: •…
  • Page 24
    • Power management programming hints on page 2-34 • CMSIS functions on page 3-9 • Accessing the Cortex-M4 NVIC registers using CMSIS on page 4-4 • NVIC programming hints on page 4-9. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved.
  • Page 25
    Optional bit-banding on page 2-16. The processor reserves regions of the Private Peripheral Bus (PPB) address range for core peripheral registers, see About the Cortex-M4 peripherals on page 4-2. 2.2.1 Memory regions, types and attributes The memory map and programming the optional MPU splits the memory map into regions.
  • Page 26
    Means that the memory system does not guarantee the ordering of the accesses. < Means that accesses are observed in program order, that is, A1 is always observed before A2. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 2-13 ID121610 Non-Confidential…
  • Page 27
    Memory regions, types and attributes on page 2-12 for more information. The Code, SRAM, and external RAM regions can hold programs. However, ARM recommends that programs always use the Code region. This is because the processor has separate buses that enable instruction fetches and data accesses to occur simultaneously.
  • Page 28
    ISB on page 3-162. MPU programming Use a followed by an instruction or exception return to ensure that the new MPU configuration is used by subsequent instructions. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 2-15 ID121610 Non-Confidential…
  • Page 29
    • is the starting address of the alias region Bit_band_base • is the number of the byte in the bit-band region that contains the targeted bit Byte_offset ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 2-16 ID121610 Non-Confidential…
  • Page 30
    0x00000001 Directly accessing a bit-band region Behavior of memory accesses on page 2-14 describes the behavior of direct byte, halfword, or word accesses to the bit-band regions. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 2-17 ID121610 Non-Confidential…
  • Page 31: Synchronization Primitives

    2.2.7 Synchronization primitives The Cortex-M4 instruction set includes pairs of synchronization primitives. These provide a non-blocking mechanism that a thread or process can use to obtain exclusive access to a memory location. Software can use them to perform a guaranteed read-modify-write memory update sequence, or for a semaphore mechanism.

  • Page 32
    1. The Cortex-M4 includes an exclusive access monitor, that tags the fact that the processor has executed a Load-Exclusive instruction. If the processor is part of a multiprocessor system, the system also globally tags the memory locations addressed by exclusive accesses by each processor.
  • Page 33
    __LDREXB (uint8_t *addr) STREX uint32_t __STREXW (uint32_t value, uint32_t *addr) STREXH uint32_t __STREXH (uint16_t value, uint16_t *addr) STREXB uint32_t __STREXB (uint8_t value, uint8_t *addr) CLREX void __CLREX (void) ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 2-20 ID121610 Non-Confidential…
  • Page 34: Exception Model

    HardFaults have a fixed priority of -1, meaning they have higher priority than any exception with configurable priority. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 2-21 ID121610 Non-Confidential…

  • Page 35
    -3, the highest Asynchronous 0x00000004 Asynchronous 0x00000008 HardFault 0x0000000C MemManage Synchronous Configurable 0x00000010 BusFault Synchronous when precise, Configurable 0x00000014 asynchronous when imprecise UsageFault Synchronous Configurable 0x00000018 7-10 Reserved ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 2-22 ID121610 Non-Confidential…
  • Page 36: Fault Handling

    The least-significant bit of each vector must be 1, indicating that the exception handler is Thumb code, see Thumb state on page 2-7. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 2-23 ID121610 Non-Confidential…

  • Page 37: Exception Priorities

    Configurable priority values are in the range 0-. This means that the Reset, HardFault, and NMI exceptions, with fixed negative priority values, always have higher priority than any other exception. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 2-24 ID121610 Non-Confidential…

  • Page 38
    ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 2-25 ID121610 Non-Confidential…
  • Page 39
    Figure 2-3 on page 2-27 shows the Cortex-M4 stack frame layout when floating-point state is preserved on the stack as the result of an interrupt or an exception. Note Where stack space for floating-point state is not allocated, the stack frame is the same as that of ARMv7-M implementations without an FPU.
  • Page 40
    If another higher priority exception occurs during exception entry, the processor starts executing the exception handler for this exception and does not change the pending status of the earlier exception. This is the late arrival case. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 2-27 ID121610 Non-Confidential…
  • Page 41
    Return to Thread mode, exception return uses floating-point state from 0xFFFFFFE9 MSP and execution uses MSP after return. Return to Thread mode, exception return uses floating-point state from PSP 0xFFFFFFED and execution uses PSP after return. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 2-28 ID121610 Non-Confidential…
  • Page 42: Fault Types

    BusFault Status Register on page 4-26 during exception unstacking UNSTKERR during instruction prefetch IBUSERR during lazy floating-point state preservation LSPERR Precise data bus error PRECISERR Imprecise data bus error IMPRECISERR ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 2-29 ID121610 Non-Confidential…

  • Page 43
    Note Only Reset and NMI can preempt the fixed priority HardFault. A HardFault can preempt any exception other than Reset, NMI, or another HardFault. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 2-30 ID121610 Non-Confidential…
  • Page 44
    Note If lockup state occurs from the NMI handler a subsequent NMI does not cause the processor to leave lockup state. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 2-31 ID121610 Non-Confidential…
  • Page 45: Power Management

    The Cortex-M4 Processor Power management The Cortex-M4 processor sleep modes reduce power consumption. The sleep modes your device implements are implementation-defined. The modes can be one or both of the following: • sleep mode stops the processor clock • deep sleep mode stops the system clock and switches off the PLL and flash memory.

  • Page 46
    When the WIC is enabled and the processor enters deep sleep mode, the power management unit in the system can power down most of the Cortex-M4 processor. This has the side effect of stopping the SysTick timer. When the WIC receives an interrupt, it takes a number of clock cycles to wakeup the processor and restore its state, before it can process the interrupt.
  • Page 47
    ISO/IEC C cannot directly generate the instructions. The CMSIS provides the following functions for these instructions: void __WFE(void) // Wait for Event void __WFI(void) // Wait for Interrupt ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 2-34 ID121610 Non-Confidential…
  • Page 48
    Chapter 3 The Cortex-M4 Instruction Set This chapter is the reference material for the Cortex-M4 instruction set description in a User Guide. The following sections give general information: • Instruction set summary on page 3-2 • CMSIS functions on page 3-9 •…
  • Page 49: Instruction Set Summary

    Compare Negative N,Z,C,V page 3-49 Rn, Op2 Compare N,Z,C,V page 3-49 Rn, Op2 Change Processor State, Disable Interrupts page 3-159 CPSID Change Processor State, Enable Interrupts page 3-159 CPSIE ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. ID121610 Non-Confidential…

  • Page 50
    N,Z,C page 3-44 ORN, ORNS {Rd,} Rn, Op2 Logical OR N,Z,C page 3-44 ORR, ORRS {Rd,} Rn, Op2 Pack Halfword page 3-108 PKHTB PKHBT {Rd,} Rn, Rm, Op2 ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. ID121610 Non-Confidential…
  • Page 51
    Signed Halving Subtract and Add with Exchange page 3-56 SHSAX {Rd,} Rn, Rm Signed Halving Subtract 16 page 3-58 SHSUB16 {Rd,} Rn, Rm Signed Halving Subtract 8 page 3-58 SHSUB8 {Rd,} Rn, Rm ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. ID121610 Non-Confidential…
  • Page 52
    Store Register Exclusive page 3-36 STREX Rd, Rt, [Rn, #offset] Store Register Exclusive Byte page 3-36 STREXB Rd, Rt, [Rn] Store Register Exclusive Halfword page 3-36 STREXH Rd, Rt, [Rn] ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. ID121610 Non-Confidential…
  • Page 53
    Unsigned Multiply (32 x 32), 64-bit result page 3-93 UMULL RdLo, RdHi, Rn, Rm Unsigned Saturating Add 16 page 3-105 UQADD16 {Rd,} Rn, Rm Unsigned Saturating Add 8 page 3-105 UQADD8 {Rd,} Rn, Rm ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. ID121610 Non-Confidential…
  • Page 54
    Floating-point Fused Multiply Accumulate page 3-135 VFMA.F32 {Sd,} Sn, Sm Floating-point Fused Negate Multiply Accumulate page 3-136 VFNMA.F32 {Sd,} Sn, Sm Floating-point Fused Multiply Subtract page 3-135 VFMS.F32 {Sd,} Sn, Sm ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. ID121610 Non-Confidential…
  • Page 55
    VMOV Sd, Sm Copy ARM core register to single precision page 3-143 VMOV Sn, Rt Copy 2 ARM core registers to 2 single precision page 3-144 VMOV Sm, Sm1, Rt, Rt2 Copy ARM core register to scalar page 3-145 VMOV…
  • Page 56: Cmsis Functions

    The Cortex-M4 Instruction Set CMSIS functions ISO/IEC C code cannot directly access some Cortex-M4 instructions. This section describes intrinsic functions that can generate these instructions, provided by the CMSIS and that might be provided by a C compiler. If a C compiler does not support an appropriate intrinsic function, you might have to use inline assembler to access some instructions.

  • Page 57
    Table 3-3 CMSIS functions to access the special registers (continued) Special register Access CMSIS function Read uint32_t __get_MSP (void) Write void __set_MSP (uint32_t TopOfMainStack) Read uint32_t __get_PSP (void) Write void __set_PSP (uint32_t TopOfProcStack) ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-10 ID121610 Non-Confidential…
  • Page 58: About The Instruction Descriptions

    Shift Operations on page 3-13 • Address alignment on page 3-17 • PC-relative expressions on page 3-17 • Conditional execution on page 3-18 • Instruction width selection on page 3-21. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-11 ID121610 Non-Confidential…

  • Page 59
    Bit[0] of any address you write to the PC with a , or instruction must be 1 for correct execution, because this bit indicates the required instruction set, and the Cortex-M4 processor only supports Thumb instructions. 3.3.3 Flexible second operand Many general data processing instructions have a flexible second operand.
  • Page 60
    And it copies the original bit[31] of the register into the left-hand bits of the result. See Figure 3-1 on page 3-14. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-13 ID121610 Non-Confidential…
  • Page 61
    , to the left by places, into the left-hand bits of the result. And it sets the right-hand bits of the result to 0. See Figure 3-3 on page 3-15. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-14 ID121610 Non-Confidential…
  • Page 62
    RRXS Operand2 MOVS MVNS , the carry flag is updated to bit[0] of the register ANDS ORRS ORNS EORS BICS ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-15 ID121610 Non-Confidential…
  • Page 63
    The Cortex-M4 Instruction Set Carry Flag Figure 3-5 RRX ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-16 ID121610 Non-Confidential…
  • Page 64
    An aligned access is an operation where a word-aligned address is used for a word, dual word, or multiple word access, or where a halfword-aligned address is used for a halfword access. Byte accesses are always aligned. The Cortex-M4 processor supports unaligned access only for the following instructions: • LDRT •…
  • Page 65: Conditional Execution

    CBNZ the result. This section describes: • The condition flags on page 3-19 • Condition code suffixes on page 3-19. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-18 ID121610 Non-Confidential…

  • Page 66
    C = 1 Higher or same, unsigned CS or HS C = 0 Lower, unsigned CC or LO N = 1 Negative N = 0 Positive or zero ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-19 ID121610 Non-Confidential…
  • Page 67
    ; Skip next two instructions unless GT condition holds CMPGT R2, R3 ; If ‘greater than’, compare R2 and R3, setting flags MOVGT R4, R5 ; If still ‘greater than’, do R4 = R5 ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-20 ID121610 Non-Confidential…
  • Page 68
    ; creates a 32-bit instruction even for a short branch ADDS.W R0, R0, R1 ; creates a 32-bit instruction even though the same ; operation can be done by a 16-bit instruction ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-21 ID121610 Non-Confidential…
  • Page 69: Memory Access Instructions

    LDR and STR, register offset on page 3-27 STR{type} Store Register with unprivileged access LDR and STR, unprivileged on page 3-29 STR{type}T Store Register Exclusive LDREX and STREX on page 3-36 STREX{type} ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-22 ID121610 Non-Confidential…

  • Page 70
    SP and must not be PC. Condition flags This instruction does not change the flags. Examples R1, TextMessage ; Write address value of a location labelled as ; TextMessage to R1. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-23 ID121610 Non-Confidential…
  • Page 71
    Specifies an offset from . If is omitted, the address is the contents of offset offset Specifies the additional register to load or store for two-word operations. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-24 ID121610 Non-Confidential…
  • Page 72
    4 in the multiple of 4 in the multiple of 4 in the range −1020 to 1020 range −1020 to 1020 range −1020 to 1020 ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-25 ID121610 Non-Confidential…
  • Page 73
    ; Store R0 to address in R8, and store R1 to ; a word 4 bytes above the address in R8, ; and then decrement R8 by 16. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-26 ID121610 Non-Confidential…
  • Page 74
    1 for correct execution, and a branch occurs to this halfword-aligned address • if the instruction is conditional, it must be the last instruction in the IT block. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-27 ID121610 Non-Confidential…
  • Page 75
    ; to a word value and put it in R0 R0, [R1, R2, LSL #2] ; Stores R0 to an address equal to sum of R1 ; and four times R2. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-28 ID121610 Non-Confidential…
  • Page 76
    ; R4 to an address in R7, with unprivileged access LDRHT R2, [R2, #8] ; Load halfword value from an address equal to ; sum of R2 and 8 into R2, with unprivileged access. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-29 ID121610 Non-Confidential…
  • Page 77
    In these instructions: • can be SP or PC only for word loads • must not be SP and must not be PC • must be different from Rt2. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-30 ID121610 Non-Confidential…
  • Page 78
    R7, localdata ; Load a byte value from an address labelled ; as localdata, sign extend it to a word ; value, and put it in R7. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-31 ID121610 Non-Confidential…
  • Page 79
    If the writeback suffix is specified, the value of — 4 * ( -1) is written back to ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-32 ID121610 Non-Confidential…
  • Page 80
    ; LDMIA is a synonym for LDM STMDB R1!,{R3-R6,R11,R12} Incorrect examples R5!,{R5,R4,R9} ; Value stored for R5 is unpredictable R2, {} ; There must be at least one register in the list. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-33 ID121610 Non-Confidential…
  • Page 81
    • if the instruction is conditional, it must be the last instruction in the IT block. Condition flags These instructions do not change the flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-34 ID121610 Non-Confidential…
  • Page 82
    PUSH {R2,LR} ; Push R2 and the link-register onto the stack POP {R0,R6,PC} ; Pop r0,r6 and PC from the stack, then branch to the new PC. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-35 ID121610 Non-Confidential…
  • Page 83
    Load-Exclusive and Store-Exclusive instruction to a minimum. Note The result of executing a Store-Exclusive instruction to an address that is different from that used in the preceding Load-Exclusive instruction is unpredictable. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-36 ID121610 Non-Confidential…
  • Page 84
    STREXEQ R0, R1, [LockAddr] ; Try and claim the lock CMPEQ R0, #0 ; Did this succeed? ; No – try again ..; Yes – we have the lock. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-37 ID121610 Non-Confidential…
  • Page 85
    Synchronization primitives on page 2-18 for more information. Condition flags This instruction does not change the flags. Examples CLREX ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-38 ID121610 Non-Confidential…
  • Page 86: General Data Processing Instructions

    SASX and SSAX on page 3-60 SASX Signed Subtract and Add with Exchange SASX and SSAX on page 3-60 SSAX Subtract with Carry ADD, ADC, SUB, SBC, and RSB on page 3-41 ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-39 ID121610 Non-Confidential…

  • Page 87
    Unsigned Sum of Absolute Differences and Accumulate USADA8 on page 3-72 USADA8 Unsigned Subtract 16 USUB16 and USUB8 on page 3-73 USUB16 Unsigned Subtract 8 USUB16 and USUB8 on page 3-73 USUB8 ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-40 ID121610 Non-Confidential…
  • Page 88
    ADR on page 3-23. Note is equivalent to the syntax that uses the operand. is equivalent to the ADDW imm12 SUBW syntax that uses the operand. imm12 ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-41 ID121610 Non-Confidential…
  • Page 89
    0b00 calculation word-aligned. — If you want to generate the address of an instruction, you have to adjust the constant based on the value of the PC. ARM recommends that you use the instruction instead of with equal to the PC, because your assembler automatically calculates the correct constant for the instruction.
  • Page 90
    ; subtract the least significant words SBCS R9, R2, R1 ; subtract the middle words with carry R2, R8, R11 ; subtract the most significant words with carry ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-43 ID121610 Non-Confidential…
  • Page 91
    N and Z flags according to the result • can update the C flag during the calculation of , see Flexible second operand on Operand2 page 3-12 • do not affect the V flag. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-44 ID121610 Non-Confidential…
  • Page 92
    R9, R2, #0xFF00 ORREQ R2, R0, R5 ANDS R9, R8, #0x19 EORS R7, R11, #0x18181818 R0, R1, #0xab R7, R11, R14, ROR #4 ORNS R7, R11, R14, ASR #32 ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-45 ID121610 Non-Confidential…
  • Page 93
    0 to 31 shift length from 1 to 32 shift length from 1 to 31. Note is the preferred syntax for MOVS Rd, Rm LSLS Rd, Rm, #0 ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-46 ID121610 Non-Confidential…
  • Page 94
    R4, R5, #6 ; Logical shift right by 6 bits R4, R5, R6 ; Rotate right by the value in the bottom byte of R6 R4, R5 ; Rotate right with extend. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-47 ID121610 Non-Confidential…
  • Page 95
    . The result value is 32 if no bits are set and zero if bit[31] is set. Restrictions Do not use SP and do not use PC. Condition flags This instruction does not change the flags. Examples R4,R9 CLZNE R2,R3 ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-48 ID121610 Non-Confidential…
  • Page 96
    Operand2 Condition flags These instructions update the N, Z, C and V flags according to the result. Examples R2, R9 R0, #6400 CMPGT SP, R7, LSL #2 ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-49 ID121610 Non-Confidential…
  • Page 97
    , performs a bitwise logical NOT operation on the Operand2 value, and places the result into Note instruction provides the same function as , but is restricted to using the MOVW imm16 operand. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-50 ID121610 Non-Confidential…
  • Page 98
    0. Note Though it is possible to use as a branch instruction, ARM strongly recommends the use of instruction to branch for software portability to the ARM instruction set. Condition flags is specified, these instructions: •…
  • Page 99
    Condition flags This instruction does not change the flags. Examples MOVT R3, #0xF123 ; Write 0xF123 to upper halfword of R3, lower halfword ; and APSR are unchanged. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-52 ID121610 Non-Confidential…
  • Page 100
    REVHS R3, R7 ; Reverse with Higher or Same condition RBIT R7, R8 ; Reverse bit order of value in R8 and write the result to R7. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-53 ID121610 Non-Confidential…
  • Page 101
    ; R1 and writes to corresponding halfword of R1. SADD8 R4, R0, R5 ; Adds bytes of R0 to the corresponding byte in R5 and writes ; to the corresponding byte in R4. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-54 ID121610 Non-Confidential…
  • Page 102
    ; writes halved result to corresponding halfword in R1 SHADD8 R4, R0, R5 ; Adds bytes of R0 to corresponding byte in R5 and ; writes halved result to corresponding byte in R4. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-55 ID121610 Non-Confidential…
  • Page 103
    Restrictions Do not use SP and do not use PC Condition flags These instructions do not affect the condition code flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-56 ID121610 Non-Confidential…
  • Page 104
    ; of R3 and writes halved result to top halfword of R0 ; Adds top halfword of R5 to bottom halfword of R3 and ; writes halved result to bottom halfword of R0. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-57 ID121610 Non-Confidential…
  • Page 105
    ; of R1 and writes to corresponding halfword of R1 SHSUB8 R4, R0, R5 ; Subtracts bytes of R0 from corresponding byte in R5, ; and writes to corresponding byte in R4. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-58 ID121610 Non-Confidential…
  • Page 106
    ; and writes to corresponding halfword of R1 SSUB8 R4, R0, R5 ; Subtracts bytes of R5 from corresponding byte in ; R0, and writes to corresponding byte of R4. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-59 ID121610 Non-Confidential…
  • Page 107
    Writes the signed result of the subtraction to the top halfword of the destination register. Restrictions Do not use SP and do not use PC Condition flags These instructions do not affect the condition code flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-60 ID121610 Non-Confidential…
  • Page 108
    ; and writes to bottom halfword of R7 ; Adds top halfword of R3 with bottom halfword of R2 and ; writes to top halfword of R7. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-61 ID121610 Non-Confidential…
  • Page 109
    ; APSR is updated but result is discarded TEQEQ R10, R9 ; Conditionally test if value in R10 is equal to ; value in R9, APSR is updated but result is discarded. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-62 ID121610 Non-Confidential…
  • Page 110
    ; writes to corresponding halfword of R1 UADD8 R4, R0, R5 ; Adds bytes of R0 to corresponding byte in R5 and writes ; to corresponding byte in R4. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-63 ID121610 Non-Confidential…
  • Page 111
    Writes the unsigned result from the subtraction to the top halfword of the destination register. Restrictions Do not use SP and do not use PC Condition flags These instructions do not affect the condition code flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-64 ID121610 Non-Confidential…
  • Page 112
    ; and writes to bottom halfword of R7 ; Adds top halfword of R3 to bottom halfword of R2 and ; writes to top halfword of R7. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-65 ID121610 Non-Confidential…
  • Page 113
    ; and writes halved result to corresponding halfword in R7 UHADD8 R4, R0, R5 ; Adds bytes of R0 to corresponding byte in R5 and writes ; halved result to corresponding byte in R4. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-66 ID121610 Non-Confidential…
  • Page 114
    Writes the halfword result of the addition to the bottom halfword of the destination register. Restrictions Do not use SP and do not use PC Condition flags These instructions do not affect the condition code flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-67 ID121610 Non-Confidential…
  • Page 115
    ; R3 and writes halved result to top halfword of R0 ; Adds top halfword of R5 to bottom halfword of R3 and ; writes halved result to bottom halfword of R0. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-68 ID121610 Non-Confidential…
  • Page 116
    ; R1 and writes halved result to corresponding halfword in ; R1 UHSUB8 R4, R0, R5 ; Subtracts bytes of R5 from corresponding byte in R0 and ; writes halved result to corresponding byte in R4. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-69 ID121610 Non-Confidential…
  • Page 117
    These instructions do not change the flags. Examples SADD16 R0, R1, R2 ; Set GE bits based on result SEL R0, R0, R3 ; Select bytes from R0 or R3, based on GE. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-70 ID121610 Non-Confidential…
  • Page 118
    ; adds the differences and writes to R1 USAD8 R0, R5 ; Subtracts bytes of R5 from corresponding byte in R0, ; adds the differences and writes to R0. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-71 ID121610 Non-Confidential…
  • Page 119
    ; adds differences, adds value of R6, writes to R1 USADA8 R4, R0, R5, R2 ; Subtracts bytes of R5 from corresponding byte in R0 ; adds differences, adds value of R2 writes to R4. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-72 ID121610 Non-Confidential…
  • Page 120
    ; and writes to corresponding halfword in R1USUB8 R4, R0, R5 ; Subtracts bytes of R5 from corresponding byte in R0 and ; writes to the corresponding byte in R4. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-73 ID121610 Non-Confidential…
  • Page 121: Multiply And Divide Instructions

    Unsigned Multiply with Accumulate (32×32+64), UMULL, UMLAL, SMULL, and SMLAL on page 3-93 UMLAL 64-bit result Unsigned Multiply (32×32), 64-bit result UMULL, UMLAL, SMULL, and SMLAL on page 3-93 UMULL ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-74 ID121610 Non-Confidential…

  • Page 122
    , and places the least significant 32 bits of the result in The results of these instructions do not depend on whether the operands are signed or unsigned. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-75 ID121610…
  • Page 123
    MULLT R2, R3, R2 ; Conditionally multiply, R2 = R3 x R2 R4, R5, R6, R7 ; Multiply with subtract, R4 = R7 — (R5 x R6) ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-76 ID121610 Non-Confidential…
  • Page 124
    SP and do not use PC. • must be different registers. RdHi RdLo Condition flags These instructions do not affect the condition code flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-77 ID121610 Non-Confidential…
  • Page 125
    ; top 32 bits to R6, and the bottom 32 bits to R3 UMLAL R2, R1, R3, R5 ; Multiplies R5 and R3, adds R1:R2, writes to R1:R2. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-78 ID121610 Non-Confidential…
  • Page 126
    The bottom 16 bits of the 48-bit product are ignored. If overflow occurs during the addition of the accumulate value, the instruction sets the Q flag in the APSR. No overflow can occur during the multiplication. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-79 ID121610 Non-Confidential…
  • Page 127
    ; R3 to the result and writes top 32-bits to R10 SMLAWT R10, R2, R1, R5 ; Multiplies R2 with top halfword of R1, adds R5 ; and writes top 32-bits to R10. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-80 ID121610 Non-Confidential…
  • Page 128
    SMLALDX R0, R2, R4, R6 ; Multiplies top halfword of R2 with bottom halfword ; of R4, multiplies bottom halfword of R2 with top ; halfword of R4, adds R6 and writes to R0. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-81 ID121610 Non-Confidential…
  • Page 129
    Adds the resulting sign-extended 32-bit product to the 64-bit value in RdLo RdHi • Writes the 64-bit result of the multiplication and addition in RdLo RdHi The non-specified halfwords of the source registers are ignored. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-82 ID121610 Non-Confidential…
  • Page 130
    ; Multiplies top halfword in R5 with bottom ; halfword of R1, and bottom halfword of R5 with ; top halfword of R1, adds R8:R6 and writes to ; R8:R6. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-83 ID121610 Non-Confidential…
  • Page 131
    RdLo • Writes the 64-bit result of the addition to the RdHi RdLo Restrictions In these instructions: • Do not use SP and do not use PC. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-84 ID121610 Non-Confidential…
  • Page 132
    ; Multiplies bottom halfword of R6 with top ; halfword of R2, multiplies top halfword of R6 ; with bottom halfword of R2, subtracts second from ; first, adds R6:R3, writes to R6:R3. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-85 ID121610 Non-Confidential…
  • Page 133
    Writes the result of the subtraction in Restrictions In these instructions: • Do not use SP and do not use PC. Condition flags These instructions do not affect the condition code flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-86 ID121610 Non-Confidential…
  • Page 134
    ; subtracts R7, rounds and writes to R3 SMMLS R4, R5, R3, R8 ; Multiplies R5 and R3, extracts top 32 bits, ; subtracts R8, truncates and writes to R4. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-87 ID121610 Non-Confidential…
  • Page 135
    ; Multiplies R4 and R5, truncates top 32 bits ; and writes to R0 SMULLR R6, R2 ; Multiplies R6 and R2, rounds the top 32 bits ; and writes to R6. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-88 ID121610 Non-Confidential…
  • Page 136
    ; Multiplies bottom halfword of R4 with the bottom ; halfword of R5, adds multiplication of top halfword ; of R4 with top halfword of R5, writes to R0 ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-89 ID121610 Non-Confidential…
  • Page 137
    ; Multiplies bottom halfword of R5 with top halfword of ; R3, subtracts multiplication of top halfword of R5 ; with bottom halfword of R3, writes to R4. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-90 ID121610 Non-Confidential…
  • Page 138
    Writes the signed most significant 32 bits of the 48-bit result in the destination register. Restrictions In these instructions: • Do not use SP and do not use PC. • must be different registers. RdHi RdLo ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-91 ID121610 Non-Confidential…
  • Page 139
    ; extracts top 32 bits and writes to R4 SMULWB R4, R5, R3 ; Multiplies R5 with the bottom halfword of R3, ; extracts top 32 bits and writes to R4. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-92 ID121610 Non-Confidential…
  • Page 140
    Examples UMULL R0, R4, R5, R6 ; Unsigned (R4,R0) = R5 x R6 SMLAL R4, R5, R3, R8 ; Signed (R5,R4) = (R5,R4) + R3 x R8 ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-93 ID121610 Non-Confidential…
  • Page 141
    These instructions do not change the flags. Examples SDIV R0, R2, R4 ; Signed divide, R0 = R2/R4 UDIV R8, R8, R1 ; Unsigned divide, R8 = R8/R1 ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-94 ID121610 Non-Confidential…
  • Page 142: Saturating Instructions

    To clear the Q flag to 0, you must use the instruction, see MSR on page 3-164. To read the state of the Q flag, use the instruction, see MRS on page 3-163. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-95 ID121610 Non-Confidential…

  • Page 143
    ; write it back to R7 USATNE R0, #7, R5 ; Conditionally saturate value in R5 as an ; unsigned 7 bit value and write it to R0. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-96 ID121610 Non-Confidential…
  • Page 144
    ; of R7 USAT16NE R0, #13, R5 ; Conditionally saturates the top and bottom ; halfwords of R5 as 13-bit values, writes to ; corresponding halfword of R0. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-97 ID121610 Non-Confidential…
  • Page 145
    Do not use SP and do not use PC Condition flags These instructions do not affect the condition code flags. If saturation occurs, these instructions set the Q flag to 1. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-98 ID121610 Non-Confidential…
  • Page 146
    QSUB8 R4, R2, R5 ; Subtracts bytes of R5 from the corresponding byte in ; R2, saturates to 8 bits, writes to corresponding byte of ; R4. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-99 ID121610 Non-Confidential…
  • Page 147
    16, to the top halfword of the destination register. Restrictions Do not use SP and do not use PC Condition flags These instructions do not affect the condition code flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-100 ID121610 Non-Confidential…
  • Page 148
    ; R3, saturates to 16 bits, writes to top halfword of R0 ; Adds bottom halfword of R3 to top halfword of R5, ; saturates to 16 bits, writes to bottom halfword of R0. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-101 ID121610 Non-Confidential…
  • Page 149
    ; saturates to 32 bits, writes to R7 QDSUB R0, R3, R5 ; Subtracts R3 doubled and saturated to 32 bits ; from R5, saturates to 32 bits, writes to R0. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-102 ID121610 Non-Confidential…
  • Page 150
    16, to the bottom halfword of the destination register. Restrictions Do not use SP and do not use PC Condition flags These instructions do not affect the condition code flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-103 ID121610 Non-Confidential…
  • Page 151
    ; saturates to 16 bits, writes to top halfword of R0 ; Adds bottom halfword of R4 to top halfword of R5 ; saturates to 16 bits, writes to bottom halfword of R0. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-104 ID121610 Non-Confidential…
  • Page 152
    Saturates the results of the differences for each byte in the destination register to the unsigned range 0 ≤ x ≤ 2 −1, where x is 8. Restrictions Do not use SP and do not use PC ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-105 ID121610 Non-Confidential…
  • Page 153
    ; halfword in R6 UQSUB8 R1, R5, R6 ; Subtracts bytes in R6 from corresponding byte of R5, ; saturates to 8 bits, writes to corresponding byte of R1. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-106 ID121610 Non-Confidential…
  • Page 154: Packing And Unpacking Instructions

    Dual zero extend 8 bits to 16 and add SXT and UXT on page 3-117 UXTB16 Zero extend a halfword SXT and UXT on page 3-117 UXTH ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-107 ID121610 Non-Confidential…

  • Page 155
    If shifted, the shifted value of the second operand is written to the bottom halfword of the destination register. Restrictions must not be SP and must not be PC. Condition flags This instruction does not change the flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-108 ID121610 Non-Confidential…
  • Page 156
    R4, R0, R2 ASR #1 ; Writes R2 shifted right by 1 bit to bottom halfword ; of R4, and writes top halfword of R0 to top ; halfword of R4. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-109 ID121610 Non-Confidential…
  • Page 157
    16 bits, and extracts bits [23:16] and UXTB16 zero extends to 16 bits. Restrictions Do not use SP and do not use PC. Condition flags These instructions do not affect the flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-110 ID121610 Non-Confidential…
  • Page 158
    ; of result, sign extends to 32 bits and writes to R4 UXTB R3, R10 ; Extracts lowest byte of value in R10, zero extends, and ; writes to R3. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-111 ID121610 Non-Confidential…
  • Page 159
    Adds the signed or zero extended value to the word or corresponding halfword of Rn and writes the result in Rd. Restrictions Do not use SP and do not use PC. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-112 ID121610 Non-Confidential…
  • Page 160
    ; writes to R4 UXTAB R3, R4, R10 ; Extracts bottom byte of R10 and zero extends to 32 ; bits, adds R4, and writes to R3. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-113 ID121610 Non-Confidential…
  • Page 161: Bitfield Instructions

    SBFX and UBFX on page 3-116 UBFX Zero extend a byte SXT and UXT on page 3-117 UXTB Zero extend a halfword SXT and UXT on page 3-117 UXTH ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-114 ID121610 Non-Confidential…

  • Page 162
    ; Clear bit 8 to bit 19 (12 bits) of R4 to 0 R9, R2, #8, #12 ; Replace bit 8 to bit 19 (12 bits) of R9 with ; bit 0 to bit 11 from R2. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-115 ID121610 Non-Confidential…
  • Page 163
    UBFX R8, R11, #9, #10 ; Extract bit 9 to bit 18 (10 bits) from R11 and zero ; extend to 32 bits and then write the result to R8. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-116 ID121610…
  • Page 164
    ; 32 bits and write the result to R4. UXTB R3, R10 ; Extract lowest byte of the value in R10 and zero ; extend it, and write the result to R3. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-117 ID121610 Non-Confidential…
  • Page 165: Branch And Control Instructions

    CBZ and CBNZ on page 3-121 If-Then IT on page 3-122 Table Branch Byte TBB and TBH on page 3-124 Table Branch Halfword TBB and TBH on page 3-124 ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-118 ID121610 Non-Confidential…

  • Page 166
    −16 MB to +16 MB (inside IT block) Bcond label −16 MB to +16 MB BL{cond} label Any value in register BX{cond} Rm Any value in register BLX{cond} Rm ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-119 ID121610 Non-Confidential…
  • Page 167
    ; Return from function call BXNE ; Conditionally branch to address stored in R0 ; Branch with link and exchange (Call) to a address stored ; in R0. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-120 ID121610 Non-Confidential…
  • Page 168
    These instructions do not change the flags. Examples R5, target ; Forward branch if R5 is zero CBNZ R0, target ; Forward branch if R0 is not zero ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-121 ID121610 Non-Confidential…
  • Page 169
    PC-modifying instruction is permitted to branch to an instruction in an IT block. Restrictions The following instructions are not permitted in an IT block: • • CBNZ • CPSID CPSIE. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-122 ID121610 Non-Confidential…
  • Page 170
    ; Branch instruction can only be used in the last ; instruction of an IT block ; Next instruction is conditional R0, R0, R1 ; Syntax error: no condition code used in IT block ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-123 ID121610 Non-Confidential…
  • Page 171
    IT block, it must be the last instruction of the IT block. Condition flags These instructions do not change the flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-124 ID121610 Non-Confidential…
  • Page 172
    ((CaseB — BranchTable_H)/2) ; CaseB offset calculation ((CaseC — BranchTable_H)/2) ; CaseC offset calculation CaseA ; an instruction sequence follows CaseB ; an instruction sequence follows CaseC ; an instruction sequence follows ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-125 ID121610 Non-Confidential…
  • Page 173: Floating-Point Instructions

    Copy ARM core register to single precision VMOV ARM Core register to single precision on VMOV page 3-143 Copy 2 ARM core registers to 2 single precision VMOV Two ARM Core registers to two single precision VMOV on page 3-144 ARM DUI 0553A Copyright ©…

  • Page 174
    Table 3-15 Floating-point instructions (continued) Mnemonic Brief description Copies between ARM core register to scalar VMOV ARM Core register to scalar on page 3-145 VMOV Copies between Scalar to ARM core register VMOV Scalar to ARM Core register on page 3-142…
  • Page 175
    Takes the absolute value of the operand floating-point register. Places the results in the destination floating-point register. Restrictions There are no restrictions. Condition flags The floating-point instruction clears the sign bit. Examples VABS.F32 S4, S6 ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-128 ID121610 Non-Confidential…
  • Page 176
    Places the results in the destination floating-point register. Restrictions There are no restrictions. Condition flags This instruction does not change the flags. Examples VADD.F32 S4, S6, S7 ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-129 ID121610 Non-Confidential…
  • Page 177
    FPSCR the ARM flags by a subsequent instruction, see VMRS on page 3-146. VMRS Examples VCMP.F32 S4, #0.0VCMP.F32 S4, S2 ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-130 ID121610 Non-Confidential…
  • Page 178
    The integer to floating-point operation uses the rounding mode specified by the FPSCR Restrictions There are no restrictions. Condition flags These instructions do not change the flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-131 ID121610 Non-Confidential…
  • Page 179
    Round towards Zero fixed-point to floating-point operation uses the rounding mode. Round to Nearest Restrictions There are no restrictions. Condition flags These instructions do not change the flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-132 ID121610 Non-Confidential…
  • Page 180
    Writes the result into the top or bottom half of a single-precision register, preserving the other half of the target register. Restrictions There are no restrictions. Condition flags These instructions do not change the flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-133 ID121610 Non-Confidential…
  • Page 181
    Divides one floating-point value by another floating-point value. Writes the result to the floating-point destination register. Restrictions There are no restrictions. Condition flags These instructions do not change the flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-134 ID121610 Non-Confidential…
  • Page 182
    Places the results in the destination register. The result of the multiply is not rounded before the addition. Restrictions There are no restrictions. Condition flags These instructions do not change the flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-135 ID121610 Non-Confidential…
  • Page 183
    Places the result in the destination register. The result of the multiply is not rounded before the addition. Restrictions There are no restrictions. Condition flags These instructions do not change the flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-136 ID121610 Non-Confidential…
  • Page 184
    , of the registers in size list • For the base address, the SP can be used. In the ARM instruction set, if is not specified can be used. • must contain at least one register. If it contains doubleword registers, it must not list contain more than 16 registers.
  • Page 185
    Specifies the label of the literal data item to be loaded. label Operation This instruction: • Loads a single extension register from memory, using a base address from an ARM core register, with an optional offset. Restrictions There are no restrictions. Condition flags These instructions do not change the flags.
  • Page 186
    Subtracts the products from the destination floating-point value. Places the results in the destination register. Restrictions There are no restrictions. Condition flags These instructions do not change the flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-139 ID121610 Non-Confidential…
  • Page 187
    Is a floating-point constant. Operation This instruction copies a constant value to a floating-point register. Restrictions There are no restrictions. Condition flags These instructions do not change the flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-140 ID121610 Non-Confidential…
  • Page 188
    Specifies the source register, for a singleword operation. Operation This instruction copies the contents of one floating-point register to another. Restrictions There are no restrictions Condition flags These instructions do not change the flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-141 ID121610 Non-Confidential…
  • Page 189
    If x is 1, use upper half of doubleword register. Operation This instruction transfers: • one word from the upper or lower half of a doubleword floating-point register to an ARM core register. Restrictions Rt cannot be PC or SP.
  • Page 190
    The Cortex-M4 Instruction Set 3.11.16 VMOV ARM Core register to single precision Transfers a single-precision register to and from an ARM core register. Syntax VMOV{cond} Sn, Rt VMOV{cond} Rt, Sn where: Is an optional condition code, see Conditional execution on page 3-18.
  • Page 191
    • The contents of two consecutively numbered single-precision registers to two ARM core registers. • The contents of two ARM core registers to a pair of single-precision registers. Restrictions The restrictions are: • The floating-point registers must be contiguous, one after the other.
  • Page 192
    The Cortex-M4 Instruction Set 3.11.18 VMOV ARM Core register to scalar Transfers one word to a floating-point register from an ARM core register. Syntax VMOV{cond}{.32} Dd[x], Rt where: Is an optional condition code, see Conditional execution on page 3-18. cond Is an optional data size specifier.
  • Page 193
    Is an optional condition code, see Conditional execution on page 3-18. cond Specifies the destination ARM core register. This register can be R0-R14. Transfer floating-point flags to the APSR flags. APSR_nzcv Operation This instruction performs one of the following actions: •…
  • Page 194
    The Cortex-M4 Instruction Set 3.11.20 VMSR Move to floating-point System Register from ARM Core register. Syntax VMSR{cond} FPSCR, Rt where: Is an optional condition code, see Conditional execution on page 3-18. cond Specifies the general-purpose register to be transferred to the FPSCR.
  • Page 195
    This instruction: Multiplies two floating-point values. Places the results in the destination register. Restrictions There are no restrictions. Condition flags These instructions do not change the flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-148 ID121610 Non-Confidential…
  • Page 196
    Places the results in a second floating-point register. The floating-point instruction inverts the sign bit. Restrictions There are no restrictions. Condition flags These instructions do not change the flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-149 ID121610 Non-Confidential…
  • Page 197
    Multiplies together two floating-point register values. Writes the negation of the result to the destination register. Restrictions There are no restrictions. Condition flags These instructions do not change the flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-150 ID121610 Non-Confidential…
  • Page 198
    This instruction loads multiple consecutive extension registers from the stack. Restrictions The list must contain at least one register, and not more than sixteen registers. Condition flags These instructions do not change the flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-151 ID121610 Non-Confidential…
  • Page 199
    Stores multiple consecutive extension registers to the stack. Restrictions The restrictions are: • must contain at least one register, and not more than sixteen. list Condition flags These instructions do not change the flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-152 ID121610 Non-Confidential…
  • Page 200
    Calculates the square root of the value in a floating-point register. • Writes the result to another floating-point register. Restrictions There are no restrictions. Condition flags These instructions do not change the flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-153 ID121610 Non-Confidential…
  • Page 201
    If it contains doubleword registers it must not list contain more than 16 registers. • Use of the PC as is deprecated. Condition flags These instructions do not change the flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-154 ID121610 Non-Confidential…
  • Page 202
    0-1020. can be omitted, meaning an offset of Operation This instruction: • Stores a single extension register to memory, using an address from an ARM core register, with an optional offset, defined in Restrictions The restrictions are: •…
  • Page 203
    Subtracts one floating-point value from another floating-point value. Places the results in the destination floating-point register. Restrictions There are no restrictions. Condition flags These instructions do not change the flags. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-156 ID121610 Non-Confidential…
  • Page 204: Miscellaneous Instructions

    NOP on page 3-165 Send Event SEV on page 3-166 Supervisor Call SVC on page 3-167 Wait For Event WFE on page 3-168 Wait For Interrupt WFI on page 3-169 ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-157 ID121610 Non-Confidential…

  • Page 205
    ; Breakpoint with immediate value set to 0x3 (debugger can ; extract the immediate value by locating it using the PC) Note ARM does not recommend the use of the BKPT instruction with an immediate value set to 0xAB for any purpose other than Semi-hosting. ARM DUI 0553A Copyright ©…
  • Page 206
    CPSID f ; Disable interrupts and all fault handlers (set FAULTMASK) CPSIE i ; Enable interrupts and configurable fault handlers (clear PRIMASK) CPSIE f ; Enable interrupts and fault handlers (clear FAULTMASK) ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-159 ID121610 Non-Confidential…
  • Page 207
    Condition flags This instruction does not change the flags. Examples DMB ; Data Memory Barrier ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-160 ID121610 Non-Confidential…
  • Page 208
    The instruction completes when all explicit memory accesses before it complete. Condition flags This instruction does not change the flags. Examples DSB ; Data Synchronisation Barrier ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-161 ID121610 Non-Confidential…
  • Page 209
    Condition flags This instruction does not change the flags. Examples ISB ; Instruction Synchronisation Barrier ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-162 ID121610 Non-Confidential…
  • Page 210
    SP and must not be PC. Condition flags This instruction does not change the flags. Examples MRS R0, PRIMASK ; Read PRIMASK value and write it to R0 ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-163 ID121610 Non-Confidential…
  • Page 211
    This instruction updates the flags explicitly based on the value in Rn. Examples MSR CONTROL, R1 ; Read R1 value and write it to the CONTROL register ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-164 ID121610 Non-Confidential…
  • Page 212
    64-bit boundary. Condition flags This instruction does not change the flags. Examples NOP ; No operation ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-165 ID121610 Non-Confidential…
  • Page 213
    It also sets the local event register to 1, see Power management on page 2-32. Condition flags This instruction does not change the flags. Examples SEV ; Send Event ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-166 ID121610 Non-Confidential…
  • Page 214
    This instruction does not change the flags. Examples SVC #0x32 ; Supervisor Call (SVCall handler can extract the immediate value ; by locating it through the stacked PC) ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-167 ID121610 Non-Confidential…
  • Page 215
    0 and returns immediately. For more information see Power management on page 2-32. Condition flags This instruction does not change the flags. Examples WFE ; Wait for event ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-168 ID121610 Non-Confidential…
  • Page 216
    PRIMASK becomes pending • a Debug Entry request. Condition flags This instruction does not change the flags. Examples WFI ; Wait for interrupt ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 3-169 ID121610 Non-Confidential…
  • Page 217
    Chapter 4 Cortex-M4 Peripherals This chapter describes the ARM Cortex-M4 core peripherals. It contains the following sections: • About the Cortex-M4 peripherals on page 4-2 • Nested Vectored Interrupt Controller on page 4-3 • System control block on page 4-11 •…
  • Page 218
    Privileged Only privileged software can access the register. Unprivileged Both unprivileged and privileged software can access the register. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. ID121610 Non-Confidential…
  • Page 219
    Interrupt Priority Registers on page 4-7 0xE000E400 0x00000000 NVIC_IPR59 0xE000E4EF STIR Software Trigger Interrupt Register on page 4-8 Configurable 0xE000EF00 0x00000000 a. See the register description for more information. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. ID121610 Non-Confidential…
  • Page 220
    Cortex-M4 Peripherals 4.2.1 Accessing the Cortex-M4 NVIC registers using CMSIS CMSIS functions enable software portability between different Cortex-M profile processors. To access the NVIC registers when using CMSIS, use the following functions: Table 4-3 CMSIS access NVIC functions CMSIS function Description Enables an interrupt or exception.
  • Page 221
    Writing 1 to the ISPR bit corresponding to: • an interrupt that is pending has no effect • a disabled interrupt sets the state of that interrupt to pending. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. ID121610 Non-Confidential…
  • Page 222
    0 = interrupt is not pending 1 = interrupt is pending. Note Writing 1 to an ICPR bit does not affect the active state of the corresponding interrupt. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. ID121610 Non-Confidential…
  • Page 223
    [15:8] Priority, byte offset 1 [7:0] Priority, byte offset 0 Accessing the Cortex-M4 NVIC registers using CMSIS on page 4-4 for more information about the access to the interrupt priority array, which provides the software view of the interrupt priorities.
  • Page 224
    0x03 4.2.9 Level-sensitive and pulse interrupts A Cortex-M4 device can support both level-sensitive and pulse interrupts. Pulse interrupts are also described as edge-triggered interrupts. A level-sensitive interrupt is held asserted until the peripheral deasserts the interrupt signal. Typically this happens because the ISR accesses the peripheral, causing it to clear the interrupt request.
  • Page 225
    Cortex-M4 Peripherals Hardware and software control of interrupts The Cortex-M4 latches all interrupts. A peripheral interrupt becomes pending for one of the following reasons: • the NVIC detects that the interrupt signal is HIGH and the interrupt is not active •…
  • Page 226
    NVIC_SystemReset (void) The input parameter IRQn is the IRQ number, see Table 2-16 on page 2-22. For more information about these functions see the CMSIS documentation. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-10 ID121610 Non-Confidential…
  • Page 227: Auxiliary Control Register

    • interruption of multi-cycle instructions. By default this register is set to provide optimum performance from the Cortex-M4 processor, and does not normally require modification. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved.

  • Page 228
    BusFaults to be precise BusFaults but decreases performance because any store to memory must complete before the processor can execute the next instruction. Note This bit only affects write buffers implemented in the Cortex-M4 processor. DISMCYCINT When set to 1, disables interruption of load multiple and store multiple instructions. This increases the interrupt latency of the processor because any LDM or STM must complete before the processor can stack the current state and enter the interrupt handler.
  • Page 229
    — whether there are preempted active exceptions — the exception number of the highest priority pending exception — whether any interrupts are pending. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-13 ID121610 Non-Confidential…
  • Page 230
    Write: 0 = no effect 1 = changes SysTick exception state to pending. Read: 0 = SysTick exception is not pending 1 = SysTick exception is pending. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-14 ID121610 Non-Confidential…
  • Page 231
    1 to the PENDSVSET bit and write 1 to the PENDSVCLR bit • write 1 to the PENDSTSET bit and write 1 to the PENDSTCLR bit. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-15 ID121610 Non-Confidential…
  • Page 232
    Table 4-17 on page 4-17 for its attributes. To write to this register, you must write to the VECTKEY field, otherwise the processor 0x5FA ignores the write. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-16 ID121610 Non-Confidential…
  • Page 233
    0 to this bit, otherwise behavior is Unpredictable. VECTRESET Reserved for Debug use. This bit reads as 0. When writing to the register you must write 0 to this bit, otherwise behavior is Unpredictable. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-17 ID121610 Non-Confidential…
  • Page 234
    PRI_n[7:0] field showing the binary point. x denotes a group priority field bit, and y denotes a subpriority field bit. Note Determining preemption of an exception uses only the group priority field, see Interrupt priority grouping on page 2-25. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-18 ID121610 Non-Confidential…
  • Page 235
    STIR by unprivileged software, see Software Trigger Interrupt Register on page 4-8. See the register summary in Table 4-12 on page 4-11 for the CCR attributes. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-19 ID121610 Non-Confidential…
  • Page 236
    If this bit is set to 1, an unaligned access generates a UsageFault. Unaligned , and instructions always fault irrespective of LDRD STRD whether UNALIGN_TRP is set to 1. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-20 ID121610 Non-Confidential…
  • Page 237
    [31:24] PRI_7 Reserved. [23:16] PRI_6 Priority of system handler 6, UsageFault [15:8] PRI_5 Priority of system handler 5, BusFault [7:0] PRI_4 Priority of system handler 4, MemManage ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-21 ID121610 Non-Confidential…
  • Page 238
    Table 4-23 SHPR3 register bit assignments Bits Name Function [31:24] PRI_15 Priority of system handler 15, SysTick exception [23:16] PRI_14 Priority of system handler 14, PendSV [15:0] Reserved. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-22 ID121610 Non-Confidential…
  • Page 239
    Debug monitor active bit, reads as 1 if Debug monitor is active SVCALLACT SVCall active bit, reads as 1 if SVC call is active [6:4] Reserved. USGFAULTACT UsageFault exception active bit, reads as 1 if exception is active ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-23 ID121610 Non-Confidential…
  • Page 240
    MMFSR and BFSR with a halfword access to 0xE000ED28 • access the BFSR with a byte access to 0xE000ED29 • access the UFSR with a halfword access to 0xE000ED2A ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-24 ID121610 Non-Confidential…
  • Page 241
    When this bit is 1, the PC value stacked for the exception return points to the faulting instruction. The processor has not written a fault address to the MMAR. a. Only present in a Cortex-M4F device. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-25 ID121610 Non-Confidential…
  • Page 242
    The processor does not adjust the SP from the failing return, does not performed a new save, and does not write a fault address to the BFAR. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-26 ID121610…
  • Page 243
    1 only if it attempts to issue the faulting instruction. When the processor sets this bit is 1, it does not write a fault address to the BFAR. a. Only present in a Cortex-M4F device. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-27 ID121610 Non-Confidential…
  • Page 244
    No coprocessor UsageFault. The processor does not support coprocessor instructions: 0 = no UsageFault caused by attempting to access a coprocessor 1 = the processor has attempted to access a coprocessor. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-28 ID121610 Non-Confidential…
  • Page 245
    The UFSR bits are sticky. This means as one or more fault occurs, the associated bits are set to 1. A bit that is set to 1 is cleared to 0 only by writing 1 to that bit, or by a reset. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-29 ID121610…
  • Page 246
    Function [31:0] ADDRESS When the MMARVALID bit of the MMFSR is set to 1, this field holds the address of the location that generated the MemManage fault ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-30 ID121610 Non-Confidential…
  • Page 247
    CFSR and SHPR1-SHPR3 it can use byte or aligned halfword or word accesses. The processor does not support unaligned accesses to system control block registers. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-31 ID121610 Non-Confidential…
  • Page 248
    Software must follow this sequence because another higher priority exception might change the MMFAR or BFAR value. For example, if a higher priority handler preempts the current fault handler, the other fault might change the MMFAR or BFAR value. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-32 ID121610 Non-Confidential…
  • Page 249
    Table 4-33 SysTick SYST_CSR register bit assignments Bits Name Function [31:17] Reserved. [16] COUNTFLAG Returns 1 if timer counted to 0 since last time this was read. [15:3] Reserved. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-33 ID121610 Non-Confidential…
  • Page 250
    N processor clock cycles, use a RELOAD value of N-1. If the SysTick interrupt is required every 100 clock pulses, set RELOAD to 99. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-34 ID121610…
  • Page 251
    If calibration information is not known, calculate the calibration value required from the frequency of the processor clock or external clock. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-35 ID121610 Non-Confidential…
  • Page 252
    The SysTick counter reload and current value are not initialized by hardware. This means the correct initialization sequence for the SysTick counter is: Program reload value. Clear current value. Program Control and Status register. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-36 ID121610 Non-Confidential…
  • Page 253
    • overlapping regions • export of memory attributes to the system. The memory attributes affect the behavior of memory accesses to the region. The Cortex-M4 MPU defines: • eight separate memory regions, 0-7 •…
  • Page 254
    Indicates the number of supported MPU data regions: = Eight MPU regions. 0x08 [7:1] Reserved. SEPARATE Indicates support for unified or separate instruction and date memory maps: 0 = unified. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-38 ID121610 Non-Confidential…
  • Page 255
    Any access by unprivileged software that does not address an enabled memory region causes a MemManage fault. XN and Strongly-ordered rules always apply to the System Control Space regardless of the value of the ENABLE bit. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-39 ID121610 Non-Confidential…
  • Page 256
    The MPU_RBAR defines the base address of the MPU region selected by the MPU_RNR, and can update the value of the MPU_RNR. See the register summary in Table 4-38 on page 4-38 for its attributes. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-40 ID121610 Non-Confidential…
  • Page 257
    MPU_RASR is accessible using word or halfword accesses: • the most significant halfword holds the region attributes • the least significant halfword holds the region size and the region and subregion enable bits. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-41 ID121610 Non-Confidential…
  • Page 258
    SIZE field values The SIZE field defines the size of the MPU memory region specified by the RNR. as follows: (SIZE+1) (Region size in bytes) = 2 ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-42 ID121610 Non-Confidential…
  • Page 259
    Cached memory, BB = outer policy, AA = inner policy. 0b1BB Table 4-46 on page 4-44 for the encoding of the AA Shareable and BB bits. a. The MPU ignores the value of this bit. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-43 ID121610 Non-Confidential…
  • Page 260
    Simple code to configure one region: ; R1 = region number ; R2 = size/enable ; R3 = attributes ; R4 = address LDR R0,=MPU_RNR ; 0xE000ED98, MPU region number register ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-44 ID121610 Non-Confidential…
  • Page 261
    ; R3 = size, attributes in one LDR R0, =MPU_RNR ; 0xE000ED98, MPU region number register STM R0, {R1-R3} ; Region Number, address, attribute, size and enable ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-45 ID121610 Non-Confidential…
  • Page 262
    When setting up the MPU, and if the MPU has previously been programmed, disable unused regions to prevent any previous region settings from affecting the new MPU setup. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-46 ID121610…
  • Page 263
    DMA engine, the shareability attribute might be important. In these cases see the recommendations of the memory device manufacturer. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-47 ID121610 Non-Confidential…
  • Page 264
    = Privileged access only. An unprivileged access generates a NOCP 0b01 fault. = Reserved. The result of any access is 0b10 Unpredictable = Full access. 0b11 [19:0] Reserved. Read as Zero, Write Ignore. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-48 ID121610 Non-Confidential…
  • Page 265
    0 = Mode was not Thread Mode when the floating-point stack frame was allocated. 1 = Mode was Thread Mode when the floating-point stack frame was allocated. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-49 ID121610 Non-Confidential…
  • Page 266
    Condition code flags. Floating-point comparison operations update these flags. Negative condition code flag. [30] Zero condition code flag. [29] Carry condition code flag. Overflow condition code flag. [28] [27] Reserved. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-50 ID121610 Non-Confidential…
  • Page 267
    Input Denormal cumulative exception bit. Inexact cumulative exception bit. Underflow cumulative exception bit. Overflow cumulative exception bit. Division by Zero cumulative exception bit. Invalid Operation cumulative exception bit. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-51 ID121610 Non-Confidential…
  • Page 268
    R1, R1, #(0xF << 20) ; Write back the modified value to the CPACR R1, [R0]; wait for store to complete ;reset pipeline now the FPU is enabled ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. 4-52 ID121610 Non-Confidential…
  • Page 269
    Appendix A Cortex-M4 Options This appendix describes the configuration options for a Cortex-M4 processor implementation. It shows what features of a Cortex-M4 implementation are determined by the device manufacturer. It contains the following section: • Cortex-M4 implementation options on page A-2.
  • Page 270: Floating-Point Instructions On Page

    • the LSPERR bit in the BusFault Status Register (BFSR). Number of The implementer decides how many interrupts the Cortex-M4 implementation supports Cortex-M4 interrupts implementation supports, in the range 1-240. This affects: The range of IRQ values in Table 2-5 on page 2-6…

  • Page 271
    Cortex-M4 Options Table A-1 Effects of the Cortex-M4 implementation options (continued) Option Description, and affected documentation Bit-banding The implementer decides whether bit-banding is implemented., see Optional bit-banding on page 2-16 Memory model on page 2-12. SysTick timer The SYST_CALIB register is implementation- defined. This can affect: •…
  • Page 272
    Glossary This glossary describes some of the terms used in technical documents from ARM. A mechanism that indicates to a processor that the value associated with a memory access is Abort invalid. An abort can be caused by the external or internal memory system as a result of attempting to access invalid instruction or data memory.
  • Page 273
    If the condition code flags indicate that the corresponding condition is true when the instruction starts executing, it executes normally. Otherwise, the instruction does nothing. The environment that each process operates in for a multitasking operating system. In ARM Context processors, this is limited to mean the physical address range that it can access in memory and the associated memory access permissions.
  • Page 274
    See also Big-endian memory. Load/store architecture A processor architecture where data-processing operations only operate on register contents, not directly on memory contents. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. Glossary-3 ID121610 Non-Confidential…
  • Page 275
    , and STRH STRB PUSH In a write-allocate cache, a cache miss on storing data causes a cache line to be allocated into Write-allocate (WA) the cache. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. Glossary-4 ID121610 Non-Confidential…
  • Page 276
    In a write-through cache, data is written to main memory at the same time as the cache is Write-through (WT) updated. ARM DUI 0553A Copyright © 2010 ARM. All rights reserved. Glossary-5 ID121610 Non-Confidential…

Время на прочтение
6 мин

Количество просмотров 127K

Привет всем!
По роду деятельности я программист на Java. Последние месяцы работы заставили меня познакомиться с разработкой под Android NDK и соответственно написание нативных приложений на С. Тут я столкнулся с проблемой оптимизации Linux библиотек. Многие оказались абсолютно не оптимизированы под ARM и сильно нагружали процессор. Ранее я практически не программировал на ассемблере, поэтому сначала было сложно начать изучать этот язык, но все же я решил попробовать. Эта статья написана, так сказать, от новичка для новичков. Я постараюсь описать те основы, которые уже изучил, надеюсь кого-то это заинтересует. Кроме того, буду рад конструктивной критике со стороны профессионалов.

Введение

Итак, для начала разберёмся что же такое ARM. Википедия дает такое определение:

Архитектура ARM (Advanced RISC Machine, Acorn RISC Machine, усовершенствованная RISC-машина) — семейство лицензируемых 32-битных и 64-битных микропроцессорных ядер разработки компании ARM Limited. Компания занимается исключительно разработкой ядер и инструментов для них (компиляторы, средства отладки и т. п.), зарабатывая на лицензировании архитектуры сторонним производителям.

Если кто не знает, сейчас большая часть мобильных устройств, планшетов разработаны именно на этой архитектуре процессоров. Основным преимуществом данного семейства является низкое энергопотребление, благодаря чему он часто используется в различных встроенных системах. Архитектура развивалась с течением времени, и начиная с ARMv7 были определены 3 профиля: ‘A’(application) — приложения, ‘R’(real time) — в реальном времени,’M’(microcontroller) — микроконтроллер. Историю разработки этой технологии и другие интересный данные вы можете прочитать в Википедии или погуглив в интернете. ARM поддерживает разные режимы работы (Thumb и ARM, кроме того в последние время появился Thumb-2, являющийся смесью ARM и Thumb). В данной статье рассмотрим собственно режим ARM, в котором исполняется 32-битный набор команд.

Каждый ARM процессор создан из следующих блоков:

  • 37 регистров (из которых видимых при разработке только 17)
  • Арифметико-логи́ческое устройство (АЛУ) — выполняет арифметические и логические задачи
  • Barrel shifter — устройство, созданное для перемещения блоков данных на определенное количество бит
  • The CP15 — специальная система, контроллирующая ARM сопроцессоры
  • Декодер инструкций — занимается преобразованием инструкции в последовательность микроопераций

Это не все составляющие ARM, но углубление в дебри построения процессоров не входит в тему данной статьи.

Конвейерное исполнение (Pipeline execution)

В ARM процессорах используется 3-стадийный конвейер (начиная с ARM8 был реализова 5-стадийный конвейер). Рассмотрим простой конвейер на примере процессора ARM7TDMI. Исполнение каждой инструкции состоит из трёх ступеней:

1. Этап выборки (F)
На этом этапе инструкции поступают из ОЗУ в конвейер процессора.
2. Этап декодирования (D)
Инструкции декодируются и распознаётся их тип.
3. Этап исполнения (E)
Данные поступают в ALU и исполняются и полученное значение записывается в заданный регистр.

Но при разработке надо учитывать, что, есть инструкции, которые используют несколько циклов исполнения, например, load(LDR) или store. В таком случае этап исполнения (E) разделяется на этапы (E1, E2, E3…).

Условное выполнение

Одна из важнейших функций ARM ассемблера — условное выполнение. Каждая инструкция может исполняться условно и для этого используются суффиксы. Если суффикс добавляется к названию инструкции, то прежде чем выполнить ее, происходит проверка параметров. Если параметры не соответствуют условию, то инструкция не выполняется. Суффиксы:
MI — отрицательное число
PL — положительное или ноль
AL — выполнять инструкцию всегда
Суффиксов условного выполнения намного больше. Остальные суффиксы и примеры прочитать в официальной документации: ARM документация
А теперь пришло время рассмотреть…

Основы синтаксиса ARM ассемблера

Тем, кто раньше работал с ассемблером этот пункт можно фактически пропустить. Для всех остальных опишу основы работы с этим языком. Итак, каждая программа на ассемблере состоит из инструкций. Инструкция создаётся таким образом:
{метка} {инструкция|операнды} {@ комментарий}
Метка — необязательный параметр. Инструкция — непосредственно мнемоника инструкции процессору. Основные инструкции и их использование будет разобрано далее. Операнды — константы, адреса регистров, адреса в оперативной памяти. Комментарий — необязательный параметр, который не влияет на исполнение программы.

Имена регистров

Разрешены следующие имена регистров:
1.r0-r15

2.a1-a4

3.v1-v8 (переменные регистры, с r4 по r11)

4.sb and SB (статический регистр, r9)

5.sl and SL (r10)

6.fp and FP (r11)

7.ip and IP (r12)

8.sp and SP (r13)

9.lr and LR (r14)

10.pc and PC (программный счетчик, r15).

Переменные и костанты

В ARM ассемблере, как и любом (практически) другом языке программирования могут использоваться переменные и константы. Они разделяются на такие типы:

  • Числовые
  • Логические
  • Строковые

Числовые переменные инициализируются так:
a SETA 100; создается числовая переменная «a» с значением 100.
Строковые переменные:
improb SETS «literal»; создается переменная improb с значение «literal». ВНИМАНИЕ! Значение переменной не может превышать 5120 символов.
В логических переменных соответственно используются значения TRUE и FALSE.

Примеры инструкций ARM ассемблера

В данной таблице я собрал основные инструкции, которая потребуется для дальнейшей разработки (на самом базовом этапе:):

Название Синтаксис Применение
ADD (добавление) ADD r0, r1, r2 r0 = r1 + r2
SUB (вычитание) SUB r0, r1, r2 r0 = r1 — r2
RSB (обратное вычитание) RSB r0, r1, #10 r0 = 10 — r1
MUL (умножение) MUL r0, r1, r2 r0 = r1 * r2
MOV MOV r0, r1 r0 = r1
ORR( логическая операция) ORR r0, r1, r2 r0 = r1 | r2
TEQ TEQ r0, r1 r0 == r1
LDR (загрузка) LDR r4, [r5] r4 = *r5
STR STR r4, [r5] *r5 = r4
ADR ADR r3, a a — переменная. r3 = &a

Чтобы закрепить использование основных инструкций давайте напишем несколько простых примеров, но сначала нам понадобится arm toolchain. Я работаю в Linux поэтому выбрал: frank.harvard.edu/~coldwell/toolchain (arm-unknown-linux-gnu toolchain). Ставится он проще простого, как и любая другая программа на Linux. В моем случае (Russian Fedora) понадобилось только установить rpm пакеты с сайта.
Теперь пришло время написать простейший пример. Программа будет абсолютно бесполезной, но главное, что будет работать:) Вот код, который я вам предлагаю:


start:                       @ Необязательная строка, обозначающая начало программы
        mov   r0, #3         @ Грузим в регистр r0 значение 3
        mov   r1, #2         @ Делаем тоже самое с регистром r1, только теперь с значением 2
        add   r2, r1, r0     @ Складываем значения r0 и r1, ответ записываем в r2
        mul   r3, r1, r0     @ Умножаем значение регистра r1 на значение регистра r0, ответ записываем в r3
stop:   b stop               @ Строка завершения программы

Компилируем программу до получения .bin файла:


/usr/arm/bin/arm-unknown-linux-gnu-as -o arm.o arm.s
/usr/arm/bin/arm-unknown-linux-gnu-ld -Ttext=0x0 -o arm.elf arm.o
/usr/arm/bin/arm-unknown-linux-gnu-objcopy -O binary arm.elf arm.bin

(код в файле arm.s, а toolchain в моем случае лежит в директории /usr/arm/bin/)
Если все прошло успешно, у вас будет 3 файла: arm.s (собственно код), arm.o, arm.elf, arm.bin (собственно исполняемая программа). Для того, чтобы проверить работу программы не обязательно иметь собственное arm устройство. Достаточно установить QEMU. Для справки:

QEMU — свободная программа с открытым исходным кодом для эмуляции аппаратного обеспечения различных платформ.

Включает в себя эмуляцию процессоров Intel x86 и устройств ввода-вывода. Может эмулировать 80386, 80486, Pentium, Pentium Pro, AMD64 и другие x86-совместимые процессоры; PowerPC, ARM, MIPS, SPARC, SPARC64, m68k — лишь частично.

Работает на Syllable, FreeBSD, FreeDOS, Linux, Windows 9x, Windows 2000, Mac OS X, QNX, Android и др.

Итак, для эмуляции arm понадобится qemu-system-arm. Этот пакет есть в yum, так что тем, у кого Fedora, можно не заморачиваться и просто выполнить комманду:
yum install qemu-system-arm

Далее надо запустить эмулятор ARM, так, чтобы он выполнил нашу программу arm.bin. Для этого создадим файл flash.bin, который будет флэш памятью для QEMU. Сделать это очень просто:


dd if=/dev/zero of=flash.bin bs=4096 count=4096
dd if=arm.bin of=flash.bin bs=4096 conv=notrunc

Теперь грузим QEMU с полученой flash памятью:


qemu-system-arm -M connex -pflash flash.bin -nographic -serial /dev/null

На выходе вы получите что-то вроде этого:

[anton@localhost ~]$ qemu-system-arm -M connex -pflash flash.bin -nographic -serial /dev/null
QEMU 0.15.1 monitor — type ‘help’ for more information
(qemu)

Наша программа arm.bin должна была изменить значения четырех регистров, следовательно для проверки правильности работы давайте посмотрим на эти самые регистры. Делается это очень простой коммандой: info registers
На выходе вы увидите все 15 ARM регистров, при чем у четырех из них будут измененные значения. Проверьте:) Значения регистров совпадают с теми, которые можно ожидать после исполнения программы:


(qemu) info registers
R00=00000003 R01=00000002 R02=00000005 R03=00000006
R04=00000000 R05=00000000 R06=00000000 R07=00000000
R08=00000000 R09=00000000 R10=00000000 R11=00000000
R12=00000000 R13=00000000 R14=00000000 R15=00000010
PSR=400001d3 -Z-- A svc32

P.S. В этой статье я постарался описать основы программирования на ARM ассемблер. Надеюсь вам понравилось! Этого хватит для того, чтобы далее углубляться в дебри этого языка и писать на нем программы. Если все получится, буду писать дальше о том, что узнаю сам. Если есть ошибки, прошу не пинать, так как я новичок в ассемблере.

Автор
проекта
Виниченко А.В.

Данная книга представляет собой не только подробное справочное пособие по микроконтроллерам семейства LPC2000, но и практическое руководство по их программированию и использованию для решения широкого круга задач по проектированию электронной аппаратуры.

mikrokontrollery-arm7-semejstva-lpc2000-rukovodstvo-polzovatelya-p-p-redkin-2007

В книге приведено описание архитектуры ядра, системы команд, регистровой структуры, аппаратного построения основных и периферийных модулей микроконтроллеров ARM7 семейства LPC2000. Подробно рассмотрена программная среды разработки и отладки приложений IDE IAR Embedded Workbench, даны примеры использования программы-загрузчика Flash-памяти LPC2000.

Также приведены примеры алгоритмов и исходных текстов управляющих программ на языке С, демонстрирующих пользователю «в железе» работу ядра и периферийных узлов микроконтроллера. Все представленные программы написаны или протестированы лично автором книги, снабжены описаниями и комментариями, содержат драйверы периферийных устройств и могут использоваться в пользовательских приложениях на базе микроконтроллеров семейства LPC2000.

Скачать файл можно на сайте MEGA-DRIVE MEGA-DRIVE:  Микроконтроллеры ARM7 семейства LPC2000. Руководство пользователя (П.П. Редькин, 2007)

Понравилась статья? Поделить с друзьями:
  • Энтерожермина суспензия инструкция по применению для детей
  • Топливо для биокамина своими руками пошаговая инструкция
  • Бесконтактный термометр для измерения температуры тела человека инструкция по применению
  • Таблетки сирдалуд от чего они помогают цена взрослым инструкция
  • Гедистен крем инструкция по применению цена