Инструкции по сборке - Избранное для удобства

iOS язык ассемблера
Инструкции по сборке - Избранное для удобства

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, кешем и т. д.)