Арифметические операции
ADD | ADD R0, R1, Operand2 ADD R0, R1, 12bit const. | Сложение R0 = R1 + R2 | N, Z, C, V | S | |
ADC | ADC R0, R1, R2 ADC R0, R1, 8bit const | Сложение с учётом переноса R0 = R1 + R2 + C | N, Z, C, V | S | |
ADDW | ADD R0, R1, 12bit const. | Сложение с 12bit константой | N, Z, C, V | ||
SUB | SUB R0, R1, R2 SUB R0, R1, 12bit const. | Вычитание R0 = R1 - R2 | N, Z, C, V | S | |
SBC | SBC R0, R1, R2 SBC R0, R1, 8bit const. | Вычитание с учётом переноса R0 = R1 - R2 - C | N, Z, C, V | S | |
SUBW | SUB R0, R1, 12bit const. | Вычитание с 12bit константой | N, Z, C, V | ||
RSB | RSB R0, R1, R2 RSB R0, R1, 8bit const. RSB R0, R1, R2, ASR#23 | Вычитание с противоположным порядком аргументов. R0 = R2 - R1 или R0 = 8bit const - R1 | N, Z, C, V | S |
Умножение. Деление.
MUL MLA MLS | R0 = R1 x R2 R0 = (R1 x R2) + R3 R0 = R3 - (R1 x R2) | Умножение. 32bit результат Умножение и сложение Умножение и вычитание | N, Z | S | |
UMULL UMLAL SMULL SMLAL | RLo, RHi = R2 x R3 RLo, RHi += R2 x R3 RLo, RHi = R2 x R3 RLo, RHi += R2 x R3 | Умножение. 64bit результат Умножение и сложение Умножение со знаком. 64bit результат Умножение со знаком и сложение | |||
UDIV SDIV | R0 = R1 / R2 R0 = R1 / R2 | Деление без знака Деление со знаком |
Доступ к памяти
ADR | ADR R0, label +/- 12bit ADR.W R0, label +/- 32bit | Загрузка адреса метки в регистр. | |||
LDR STR | LDR R0, [R1, #8bit const.]! - прединкремент LDR R0, [R1], #8bit const. - постинкремент LDRB R0, [R1] - без инкремента STRB R0, [R1], #1 | Загрузка/сохранение регистра в режиме адресации со смещением. B=байт, SB=байт со знаком (только загрузка) H=полуслово, SH=полуслово со знаком (только загрузка) | |||
LDR STR | LDR R0, [R1, R2, {LSL#0..3}] STR R0, [R1, R2, {LSL#0..3}] | Смещение задаётся третьим регистром. B, SB, H, SH работают аналогично | |||
LDR LDRD | LDR R0, label LDRD R0, R1, label | Смещение задаётся адресом метки. B, SB, H, SH работают аналогично Невозможно применить к STR/STRD. | |||
LDRT STRT | Непривилегированный доступ. Аналогичны простому LDR/STR. | ||||
LDRD STRD | LDRD R0, R1, [R2, #10bit const.]! - прединкремент LDRD R0, R1, [R2], #10bit const. - постинкремент LDRD R0, R1, [R2] - без инкремента STRD R0, R1, [R2] | Загрузка/сохранение двух регистров в режиме адресации со смещением. Константа должна быть кратна 4. | |||
LDM STM | LDM R0, {R1-R3} LDM R0!, {R1-R3} - постинкремент R0 IA, DB, FD, EA - см. описание | Загрузка/сохранение множества регистров. IA - с увеличением адреса DB - с уменьшением адреса. | |||
PUSH POP | PUSH {R0, R2-R7, R12} POP {R0, R2-R7, R12} | Загрузка/чтение из стека | |||
LDREX STREX | LDREX R1, [R2, #10bit const.] STREX R0, R1, [R2, #10bit const.] | Эксклюзивное чтение/запись регистра. B=байт, H=полуслово. | |||
CLREX | CLREX (без параметров) | Сброс признака эксклюзивного доступа. |
Перемещение и обработка данных
MOV MVN | MOV R0, R1 MOV R0, 16bit const. MVN R0, R1 | Загрузка/перемещение регистров Загрузка 16-бит в мл. полуслово, сброс старшего Перемещение регистра с инверсией | N, Z, C, V | S | |
MOVT | MOVT R0, 16bit const. | Загр. 16bit в старшее полуслово. Младш. остаётся без изменений. | |||
CMP CMN | CMP R0, R1 CMN R0, R1 | Сравнение Сравнение с противоположным знаком | N, Z, C, V | S | |
TST | TST R0, Operand2 | Проверить значение битов по маске | N, Z, C | S | |
TEQ | TEQ R0, Operand2 | Проверить равенство двух величин | N, Z | S | |
REV REV16 REVSH RBIT | REV R0, R1 | Изменение порядка битов или байтов в слове | |||
CLZ | CLZ R0, R1 | Подсчет количества ведущих нулей |
Логические операции
AND ORR EOR BIC ORN | И ИЛИ Исключающее ИЛИ Сброс битов по маске. И-НЕ ИЛИ-НЕ | 0 в маске сбрасывает биты. Второй Operand2 для всех команд 1 в маске устанавливает биты 1 в маске инвертирует биты 1 в маске сбрасывает биты 0 в маске устанавливает биты | N, Z, C | S |
Операции сдвига
ASR LSL LSR ROR RRX | Арифметический сдвиг вправо Логический сдвиг влево Логический сдвиг вправо Циклический сдвиг вправо Сдвиг вправо на 1 позицию через перенос | N, Z, C | S |
Ветвление. Подпрограммы.
B | B label | Переход к метке | |||
BX | BX R0 | Переход по адресу в регистре | |||
BL | BL label | Выполнить подпрограмму label | |||
BLX | BLX R0 | Выполнить подпрограмму по адресу в регистре | |||
BX LR | BX LR | Возврат из подпрограммы | |||
CBZ CBNZ | CBZ R0, label CBNZ R0, label | Переход, если R0 = 0 Переход, если R0 != 0 | |||
TBB TBH | TBB [R0, R1] TBH [R0, R1, LSL #1] | Табличный переход по индексу. Короткий переход. Длиннй переход | |||
IT | IT{x{y{z}}} cond | Блок условно исполняемых инструкций |
Работа с битовыми полями
BFC | BFC R0, #lsb, #width | Сброс поля в ноль | |||
BFI | BFI R0, R1, #lsb, #width | Копирует младшие биты R1 в поле R0 | |||
UBFX | UBFX R0, R1, #lsb, #width | Копирует поле R1 в мл. биты R0 с заполнением нулями | |||
SBFX | SBFX R0, R1, #lsb, #width | Копирует поле R1 в мл. биты R0 с расширением знака | |||
UXTB UXTH | UXTB R0, R1 {, ROR #8,16,24} | Преобразование байта с заполнением нулями Преобразование полуслова | |||
SXTB SXTH | SXTB R0, R1 {, ROR #8,16,24} | Преобразование байта с расширением знака Преобразование полуслова |
Преобразование данных с насыщением
SSAT USAT | SSAT Rd, #n, Rm {, shift #s} USAT Rd, #n, Rm {, shift #s} | Число со знаком в число со знаком, Число со знаком в число без знака | Q |
Управление системой
MRS MSR | MRS R0, PSR MSR PSR, R0 | Чтение/запись специальных регистров. | |||
CPSIE CPSID | Разрешение/запрет прерываний | ||||
WFE | WFE | Ожидать событие | |||
WFI | WFI | Ожидать прерывание | |||
BKPT | Точка останова | ||||
DMB DSB | DMB | Барьер синхронизации доступа к ОЗУ | |||
ISB | ISB | Сброс конвейера | |||
SEV | SEV | Дёрнуть ножкой события для внешних камней | |||
SVC | SVC 8bit const. | Вызов системного сервиса | |||
NOP | NOP |
Суффиксы условного исполнения
EQ | Z = 1 | Равенство | |
NE | Z = 0 | Неравенство | |
CS, HS | C = 1 | Больше или равно, беззнаковое сравнение | |
CC, LO | C = 0 | Меньше, беззнаковое сравнение | |
MI | N = 1 | Отрицательное значение, меньше нуля | |
PL | N = 0 | Положительное значение, больше или равно нулю | |
VS | V = 1 | Переполнение | |
VС | V = 0 | Нет переполнения | |
HI | C = 1 и Z=0 | Больше, беззнаковое сравнение | |
LS | C = 0 или Z=1 | Меньше или равно, беззнаковое сравнение | |
GE | N = V | Больше или равно, знаковое сравнение | |
LT | N != V | Меньше, знаковое сравнение | |
GT | Z = 0 и N = V | Больше, знаковое сравнение | |
LE | Z = 1 и N != V | Меньше или равно, знаковое сравнение | |
AL | 1 | Безусловное исполнение |
Встроенные псевдоинструкции компиллятора
MOV32 | MOV32 R0, 32bit const. (label) | Загрузить слово в регистр. | |
LDR | LDR R0, =label | Загрузить 32bit адрес метки или #число | |
ADRL | ADRL R0, label | Загрузить 32bit адрес метки |
Этого материала хватило для написания собственной ос на ассемблере.
ОтветитьУдалитьРезультаты работы тут http://forum.ixbt.com/topic.cgi?id=48:11735