Арифметические операции
| 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