1: Формат инструкции по сборке
ARM 汇编器
основной синтаксис, такой же, какGCC汇编器
Синтаксис отличается, и общий процесс компиляции выглядит следующим образом;
Второе: как ассемблерный код преобразуется в двоичный машинный код
Просто: преобразование протоколов
Например 🌰🌰🌰
mov r1,#0xff
1110 00 1 1101 0 0000 0001 000011111111
-
11--0位
: Операнд, если это непосредственное значение, заполните двоичное значение непосредственного значения, если это регистр общего назначения, заполните двоичное значение метки регистра общего назначения. -
15--12位
: указывает регистр назначения -
19--16位
: указывает первый исходный регистр операнда -
20
: Указывает, повлияет ли инструкция на регистр слова состояния программы. Установите 1, если да, установите 0 в противном случае -
24~21
: указывает тип команды.mov
да1101
-
25
: флагshifter_operand
Хранит ли сегмент непосредственное значение или регистр. Установите в ноль, если это регистр, установите в единицу, если это непосредственное значение. -
27~26
: зарезервированный бит, константа 00 -
31~28
: Раздел условийmov
Следующего условия нет, поэтому1110
Третье: базовые инструкции по сборке — легко ориентироваться
Я не буду размещать здесь английский документ, вы можете проверить его сами.
Тип инструкции | ширина инструкции | инструкция |
---|---|---|
Data operations |
16 | ADC, ADD, AND, ASR, BIC, CMN, CMP, CPY, EOR, LSL, LSR, MOV, MUL, MVN,NEG, ORR, ROR, SBC, SUB, TST, REV, REVH, REVSH, SXTB, SXTH, UXTB, and UXTH. |
Branches |
16 | B, B, BL, BX, and BLX. Note, no BLX with immediate. |
Load-store single |
16 | LDR, LDRB, LDRH, LDRSB, LDRSH, STR, STRB, STRH. |
Load-store multiple |
16 | LDMIA, POP, PUSH, and STMIA. |
Exception generating |
16 | BKPT stops in debug if debug enabled, fault if debug disabled. SVC faults to the SVCall handler. |
Data operations with immediate |
32 | ADC{S}. ADD{S}, CMN, RSB{S}, SBC{S}, SUB{S}, CMP, AND{S}, TST, BIC{S}, EOR{S}, TEQ, ORR{S}, MOV{S}, ORN{S}, and MVN{S}. |
Data operations with large immediate |
32 | MOVW, MOVT, ADDW, and SUBW. MOVW and MOVT have a 16-bit immediate. This means they can replace literal loads from memory. ADDW and SUBW have a 12-bit immediate. This means they can replace many from memory literal loads. |
Bit-field operations |
32 | BFI, BFC, UBFX, and SBFX. These are bitwise operations enabling control of position and size in bits. These both support C/C++ bit fields, in structs, in addition to many compare and some AND/OR assignment expressions. |
Data operations with three registers |
32 | ADC{S}. ADD{S}, CMN, RSB{S}, SBC{S}, SUB{S}, CMP, AND{S}, TST, BIC{S},EOR{S}, TEQ, ORR{S}, MOV{S}, ORN{S}, and MVN{S}. No PKxxx instructions. |
Shift operations |
32 | ASR{S}, LSL{S}, LSR{S}, RRX {S}, and ROR {S}. |
Miscellaneous |
32 | REV, REVH, REVSH, RBIT, CLZ, SXTB, SXTH, UXTB, and UXTH.Extension instructions same as corresponding v6 16-bit instructions. |
Table branch |
32 | TBB and TBH table branches for switch/case use. These are LDR with shifts and then branch. |
Multiply |
32 | MUL, MLA, and MLS. |
Multiply with 64-bit result |
32 | UMULL, SMULL, UMLAL, and SMLAL |
Load-store single |
32 | LDR, LDRB, LDRSB, LDRH, LDRSH, STR, STRB, STRH, and T variants. PLD and PLI are both hints and so act as a NOP. |
Load-store multiple |
32 | STM, LDM, LDRD, and STRD. |
Load-store exclusive |
32 | LDREX, STREX, LDREXB, LDREXH, STREXB, STREXH, CLREX. Fault if no local monitor. This is IMP DEF. LDREXD and STREXD are not included in this profile. |
Branches |
32 | B, BL, and B. No BLX (1) because always changes state. No BXJ. |
System |
32 | MSR(2) and MRS(2) replace MSR/MRS but also do more. These access the other stacks and also the status registers.CPSIE/CPSID 32-bit forms are not supported. No RFE or SRS. |
System |
16 | CPSIE and CPSID are quick versions of MSR(2) instructions and use the standard Thumb-2 encodings, but only permit use of i and f and not a. |
Extended32 |
32 | NOP (all forms), Coprocessor (MCR, MCR2, MCRR, MRC, MRC2, and MRRC), and YIELD (hinted NOP). Note, no MRS(1), MSR(1), or SUBS (PC return link). |
Combined branch |
16 | CBZ and CBNZ (Compare and Branch if register is Zero or Non-Zero). |
Extended |
16 | IT and NOP. This includes YIELD. |
Divide |
32 | SDIV and UDIV. 32/32 divides both signed and unsigned with 32-bit quotient result, no remainder, it can be derived by subtraction. Early out is permitted. |
Sleep |
16,32 | WFI, WFE, and SEV are in the class of hinted NOP instructions that control sleep behavior. |
Barriers |
32 | ISB, DSB, and DMB are barrier instructions that ensure certain actions have taken place before the next instruction is executed. |
Saturation |
32 | SSAT and USAT perform saturation on a register. They perform the following: Normalize the value using shift test for overflow from a selected bit position, the Q value. Set the xPSR Q bit if so, saturate the value if overflow detected. Saturation refers to the largest unsigned value or the largest/smallest signed value for the size selected. |
Общие команды
б команда
-
bl 指令
Перейти к пометке выполнения -
b.le
: Оцените, меньше или равно ли указанное выше значение cmp для выполнения метки, в противном случае перейдите непосредственно вниз -
b.ge
Больше или равно адресу выполнения, в противном случае вниз -
b.lt
Судя по тому, что значение лагеря выше меньше, чем Выполните метод по следующему адресу, в противном случае идите прямо вниз -
b.gt
больше, чем адрес выполнения, в противном случае вниз -
b.eq
Равно адресу выполнения, в противном случае вниз -
b.hi
Результат сравнения без знака больше чем, выполнить метод по адресу, иначе не прыгать -
b.hs
Инструкция состоит в том, чтобы определить, меньше ли беззнаковое, чем -
b.ls
Инструкция состоит в том, чтобы определить, больше ли без знака -
b.lo
Инструкция состоит в том, чтобы определить, больше ли unsigned или равно
вернуть обратно
-
mov x0,#0x10 -> x0 = 0x10
-
str w10 ,[sp]
Сохраните значение регистра w10 в памяти стека sp. -
stp x0,x1,[sp.#0x10]*
: значения x0 и x1 хранятся в sp+0x10 -
orr x0,wzr,#0x1
: x0 = wzr | 0x1 -
stur w10 ,[sp]
Сохраните значение регистра w10 в памяти стека sp. -
ldr w10 ,[sp]
w10 = значение в памяти стека sp -
ldp x0,x1,[sp]
x0, x1 = значение в памяти стека sp
adrp
Получить строку (глобальную переменную) по базовому адресу + смещение
-
cbz
Сравните, прыгайте, если ноль; -
cbnz
: Сравните, прыгайте, если не ноль. -
cmp: 比较功能
Например:cmp OPR1 , OPR2. = (OPR1)-(OPR2)
-
ccmp
: двойное сравнение.ccmp x13, x12, #0x0, ne
Судя по тому, что x13 и x12 существуют одновременно
16-битные инструкции по обработке данных
имя | Функция |
---|---|
ADC |
ДОБАВИТЬ с переносом |
ADD |
добавление |
AND |
Побитовое И. Побитовое И здесь такое же, как "&" в C. |
ASR |
Арифметический сдвиг вправо |
BIC |
Побитовая очистка (побитовое И число с дополнением до единицы другого беззнакового числа) |
CMN |
Отрицательное сравнение (сравнение одного числа с двумя дополнениями другого) |
CMP |
Сравнить (Сравнить, сравнить два числа и обновить флаг) |
cmp(Compare) |
инструкция сравнения |
CMP |
Сравните содержимое одного регистра с содержимым другого регистра или с непосредственным значением. Но не сохраняет результат, только правильный флаг изменения. Как правило, CMP переходит после принятия решения и обычно следует инструкции B! |
CPY |
Копировать (COPY) значение одного регистра в другой регистр |
EOR |
локальный XOR |
LSL |
Логический сдвиг влево |
LSR |
Логический сдвиг вправо |
MOV |
Данные загрузки регистров, которые можно использовать как для передачи между регистрами, так и для загрузки непосредственных данных |
MUL |
Умножение |
MVN |
Загрузить НЕ значение числа (взять логическое обратное значение) |
NEG |
взять дополнение до двух |
ORR |
побитовое ИЛИ |
ROR |
повернуть вправо |
SBC |
вычитание с заимствованием |
SUB |
вычитание |
TST |
Тест (тест, выполнение побитовой операции И и обновление Z на основе результата) |
REV |
Обратный порядок байтов в 32-битном регистре |
REVH |
Разделить 32-битный регистр на два (половины) 16-битных регистра, поменяв местами порядок следования байтов в каждом 16-битном регистре. |
REVSH |
Байт-реверс младшего 16-битного полуслова 32-битного регистра, затем расширение знака до 32 бит |
SXTB |
Signed (Подписано) расширяет байт (Byte) до 32 бит |
SXTH |
Подпись (Signed) расширяет полуслово (Half) до 32 бит |
UXTB |
Unsigned (Беззнаковый) расширяет байт (Byte) до 32 бит |
UXTH |
Без знака (Unsigned) расширяет полуслово (Half) до 32 бит |
16-битная инструкция перехода
имя | Функция |
---|---|
B |
Безусловная ветвь (Branch) |
B |
Условный (условный) перевод |
BL |
И передача соединения (Ссылка). Вызов адреса возврата подпрограммы хранится в LR |
CBZ |
Сравнить (Compare), перейти, если результат равен нулю (Zero) (перейти только к следующей инструкции) |
CBNZ |
Сравнить, если результат отличен от нуля (Non Zero), переход (можно только перейти к следующей инструкции) |
IT |
If-Then |
Инструкции по передаче данных в 16-битную память
имя | Функция |
---|---|
LDR |
Загрузить слово из памяти в регистр (Register) |
LDRH |
Загрузить половину слова из памяти в регистр |
LDRB |
Загрузить байт из памяти в регистр |
LDRSH |
Загрузить полуслово из памяти, расширить знак и сохранить в регистре |
LDRSB |
Загрузить байты из памяти, расширить знак и сохранить в регистре |
STR |
Сохранить регистр в памяти как слово |
STRH |
Сохранить младшее полуслово регистрового регистра в памяти |
STRB |
Сохранить младший байт регистра в памяти |
LDMIA |
Загрузить несколько слов и увеличить базовый регистр после загрузки |
STMIA |
Сохраните несколько слов и увеличьте базовый регистр после сохранения |
PUSH |
поместить несколько регистров в стек |
POP |
Вытолкнуть несколько значений из стека в регистры |
Другие 16-битные инструкции
имя | Функция |
---|---|
SVC |
Системный сервисный вызов (сервисный вызов) |
BKPT |
Инструкция Break Point (Точка останова). Если отладка включена, войдите в состояние отладки (стоп). |
NOP |
Нет операции |
CPSIE |
Включить PRIMASK(CPSIE i)/FAULTMASK(CPSIE f) - сбросить соответствующий бит |
CPSID |
Disable PRIMASK(CPSID i)/FAULTMASK(CPSID f) - Установите соответствующий бит |
Инструкции по обработке 32-битных данных
имя | Функция |
---|---|
ADC |
Дополнение с переносом |
ADD |
добавление |
ADDW |
Широкое добавление (можно добавить 12-битные немедленные данные) |
AND |
побитовое И |
ASR |
Арифметический сдвиг вправо |
BIC |
Очистка битов (инвертирование числа побитно и логическое И с другим числом) |
BFC |
битовое поле очистить |
BFI |
вставка битового сегмента |
CMN |
Отрицательное сравнение (сравните одно число с дополнением до двух другого числа и обновите флаги) |
CMP |
Сравните два числа и обновите флаги |
CLZ |
подсчитать количество лидирующих нулей |
EOR |
Побитовое исключающее ИЛИ |
LSL |
логический сдвиг влево |
LSR |
логический сдвиг вправо |
MLA |
умножить и добавить |
MLS |
умножать и вычитать |
MOVW |
Поместите 16-битные немедленные данные в младшие 16 бит регистра и очистите старшие 16 бит до 0. |
MOV |
Загрузить 16-битное непосредственное значение в регистр (фактически ассемблер сгенерирует MOVW) |
MOVT |
Поместите 16-битное непосредственное значение в старшие 16 бит регистра, младшие 16 бит не влияют |
MVN |
дополнить |
MUL |
умножение |
ORR |
побитовое ИЛИ |
ORN |
После побитового инвертирования исходного операнда выполните побитовое ИЛИ |
RBIT |
Инверсия битов (сначала представить 32-битное целое число в двоичном формате, а затем повернуть его на 180 градусов) |
REV |
Побайтовое обращение 32-битного целого числа |
REVH/REV16 |
Выполнение реверсирования байтов как в старших, так и в младших полусловах 32-битного целого числа. |
REVSH |
Байт-реверс младшего полуслова 32-битного целого числа и расширение знака до 32 бит |
ROR |
кружок вправо |
RRX |
Логический сдвиг с переносом вправо на один пробел (старший бит заполняется C и не влияет на значение C) |
SFBX |
Извлечение произвольного битового сегмента из 32-битного целого числа и расширение знака до 32-битного целого числа |
SDIV |
подписанное деление |
SMLAL |
Длинное умножение-сложение со знаком (умножьте два 32-битных целых числа со знаком, чтобы получить 64-битное произведение со знаком, и добавьте произведение к другому 64-битному целому со знаком) |
SMULL |
Длинное умножение со знаком (умножение двух 32-битных целых чисел со знаком для получения 64-битного произведения со знаком) |
SSAT |
Знаковая операция насыщения |
SBC |
вычитание с заимствованием |
SUB |
вычитание |
SUBW |
Широкое вычитание, может вычесть 12-битное непосредственное значение |
SXTB |
Расширение знака байта до 32 бит |
TEQ |
Тест на равенство (XOR двух чисел, обновить флаги, но не сохранять результат) |
TST |
Тест (выполните побитовое И двух чисел, обновите флаг Z, но не сохраняйте результат) |
UBFX |
Извлечение битового сегмента без знака |
UDIV |
беззнаковое деление |
UMLAL |
Беззнаковое длинное умножение-сложение (умножение двух беззнаковых 32-битных целых чисел для получения 64-битного беззнакового произведения и добавление произведения к другому беззнаковому 64-битному целому числу) |
UMULL |
Беззнаковое длинное умножение (умножение двух беззнаковых 32-битных целых чисел для получения 64-битного беззнакового произведения) |
USAT |
беззнаковая операция насыщения (но исходный операнд подписан) |
UXTB |
Байт без знака расширен до 32 бит (старшие 24 бита очищаются до 0) |
UXTH |
Полуслово без знака расширено до 32 бит (старшие 16 бит очищаются до 0) |
Инструкции по передаче данных в 32-битную память
имя | Функция |
---|---|
LDR |
загрузить слово в регистр |
LDRB |
загрузить байт в регистр |
LDRH |
загрузить полуслово в регистр |
LDRSH |
Загрузить полуслово в регистр, затем расширить по знаку до 32 бит |
LDM |
Загрузка нескольких слов в несколько регистров из непрерывного адресного пространства |
LDRD |
Загрузить двойное слово (64-битное целое число) в 2 регистра из непрерывного адресного пространства |
STR |
слово в регистре хранения |
STRB |
младший байт в регистре хранения |
STRH |
младшее полуслово в регистре хранения |
STM |
Хранить слова в нескольких регистрах в непрерывном адресном пространстве |
STRD |
Сохраняет двойное слово из 2 регистров в непрерывном адресном пространстве. |
PUSH |
Запихнуть в стек значения нескольких регистров |
POP |
Вытолкнуть значения нескольких регистров из стека |
32-битная инструкция перехода
имя | Функция |
---|---|
B |
безусловная передача |
BL |
передача и соединение (вызов подпрограммы) |
TBB |
Передача таблицы поиска в байтах. Выберите 8-битный адрес прямого перехода из массива байтов и ответвления |
TBH |
Передача справочной таблицы в полусловах. Выберите 16-битный адрес прямого перехода из массива полуслов и переходов |
Другие 32-битные инструкции
имя | Функция |
---|---|
LDREX |
Загрузить слово в регистр и пометить адрес в ядре как вход во взаимоисключающее состояние доступа |
LDREXH |
Загрузить полуслово в регистр и пометить адрес в ядре как вход во взаимоисключающее состояние доступа. |
LDREXB |
Загрузить байт в регистр и пометить адрес в ядре как вход во взаимоисключающее состояние доступа. |
STREX |
Проверить, не перешел ли записываемый адрес в состояние взаимоисключающего доступа, если да, то сохранить слово регистра |
STREXH |
Проверить, не перешел ли записываемый адрес в состояние монопольного доступа, если да, то сохранить полуслово регистра |
STREXB |
Проверить, перешел ли записываемый адрес в состояние монопольного доступа, если да, то сохранить байт регистра |
CLREX |
Очистить флаги состояния доступа к мьютексам при локальной обработке (ранее отмеченные LDREX/LDREXH/LDREXB) |
MRS |
Загрузить значение регистра специальной функции в регистр общего назначения. |
MSR |
Сохраните значение регистра общего назначения в регистр специальной функции. |
NOP |
бездействие |
SEV |
отправить событие |
WFE |
Засыпайте и просыпайтесь, когда происходит событие |
WFI |
Засыпать и просыпаться по прерыванию |
ISB |
Изоляция синхронизации инструкций (с конвейером, MPU и т. д.) |
DSB |
Изоляция синхронизации данных (с конвейером, MPU и кешем и т. д.) |
DMB |
Изоляция хранилища данных (с конвейером, MPU, кешем и т. д.) |