§ Таблица инструкции
Описание | 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|
Переход и обмен BX | Cond | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | Rm |
---|
Обработка данных / PSR | Cond | 0 | 0 | I | Опкод | S | Rn | Rd | Операнд |
---|
Умножение | Cond | 0 | 0 | 0 | 0 | 0 | 0 | A | S | Rd | Rn | Rs | 1 | 0 | 0 | 1 | Rm |
---|
Длинное умножение | Cond | 0 | 0 | 0 | 0 | 1 | U | A | S | RdHi | RdLo | Rn | 1 | 0 | 0 | 1 | Rm |
---|
Одиночный обмен данными | Cond | 0 | 0 | 0 | 1 | 0 | B | 0 | 0 | Rn | Rd | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | Rm |
---|
Передача полуслов (reg) | Cond | 0 | 0 | 0 | P | U | 0 | W | L | Rn | Rd | 0 | 0 | 0 | 0 | 1 | S | H | 1 | Rm |
---|
Передача полуслов (imm) | Cond | 0 | 0 | 0 | P | U | 0 | W | L | Rn | Rd | Смещение | 1 | S | H | 1 | Смещение |
---|
Одиночная передача данных | Cond | 0 | 1 | I | P | U | B | W | L | Rn | Rd | Смещение |
---|
Блочная передача данных | Cond | 1 | 0 | 0 | P | U | S | W | L | Rn | Список регистров |
---|
Условный переход | Cond | 1 | 0 | 1 | L | Смещение |
---|
Программное прерывание | Cond | 1 | 1 | 1 | 1 | Игнорируется процессором |
---|
Передача данных (сопроцессор) | Cond | 1 | 1 | 0 | P | U | N | W | L | Rn | CRd | CP# | Смещение |
---|
Обработка данных (сопроцессор) | Cond | 1 | 1 | 1 | 0 | Опкод | CRn | CRd | CP# | CP | 0 | CRm |
---|
Перемещения регистров (сопроцессор) | Cond | 1 | 1 | 1 | 0 | Опкод | L | CRn | CRd | CP# | CP | 1 | CRm |
---|
Зарезервировано | Cond | 0 | 1 | 1 | - | 1 | - |
---|
§ Флаги
- Z — Флаг нуля, устанавливается, когда результат равен 0
- C — Флаг переноса
- N — Флаг знака, 31-й бит результата
- V — Флаг переполнения, когда результаты переполняют знак
§ Регистры
- R0–R12: общие регистры
- R13: указатель стека SP
- R14: регистр связи LR
- R15: счётчик команд PC
§ Условия
Используются в битах 31:28
COND | Символ | Флаги | Описание |
0000 | EQ | Z=1 | Равно |
0001 | NE | Z=0 | Не равно |
0010 | CS | C=1 | Выше или равно (беззнаковое) |
0011 | CC | C=0 | Ниже (беззнаковое) |
0100 | MI | N=1 | Значени негативное |
0101 | PL | N=0 | Значение позитивное |
0110 | VS | V=1 | Есть переполнение |
0111 | VC | V=0 | Нет переполнения |
1000 | HI | C=1 & Z=0 | Выше (беззнаковое) |
1001 | LS | C=0 | Z=1 | Ниже или равно (беззнаковое) |
1010 | GE | N == V | Выше или равно (знаковое) |
1011 | LT | N != V | Ниже (знаковое) |
1100 | GT | Z=0 & (N == V) | Больше чем |
1101 | LE | Z=1 & (N != V) | Ниже чем или равно |
1110 | AL | Всегда | Выполняется всегда |
1111 | ?? | Ошибка | |
§ Обработка данных
Биты | Значение | Описание |
31:28 | COND | Условие исполнения инструкции |
27:26 | 0 0 | |
25 | I | Если =0, то операнд 2 использует регистр; если =1, то константу |
24:21 | Opcode | Номер опкода (таблица выше) для АЛУ: Rd = Rn опкод Операнд 2 |
20 | S | =1 Писать результирующие флаги =0 не писать |
19:16 | Rn | Операнд 1 |
15:12 | Rd | Результирующий регистр |
11:0 | Rd | Операнд 2 |
§ Операнд
I | 11 .. 8 | 7 | 6 5 | 4 | 3 .. 0 |
0 |
Кол-во сдвигов (0..31) |
00 LSL Логический влево
01 LSR Логический вправо
10 ASR Арифметический вправо
11 ROR Вращение направо
|
0 |
Rm регистр операнда |
0 |
Rs регистр для кол-ва сдвигов |
0 |
1 |
1 |
Циклических сдвигов вправо ROR (0..15) * 2 |
Константа 8 бит |
§ Специальные случаи
- LSL #0 не будет менять Rm, также не меняется C
- LSR #0 обнуляет Rm => 0, C = Rm[31]
- ASR #0 заполняет все биты Rm в бит Rm[31], C = Rm[31]
- ROR #0 (RRX) сдвигает направо на 1, Rm[31] = флаг C из регистров флагов, C=Rm[0]
- При чтении из Rm=15, читается PC+8 если указан сдвиг в виде константы, если в виде регистра, PC+12
- Запись в Rd=15, S=0 — флаги не обновляются
- Запись в Rd=15, S=1 — флаги переписываются из SPSR
§ Арифметико-логическое устройство
Опкод | Код | Описание |
0000 | AND | op1 & op2 |
0001 | EOR | op1 ^ op2 |
0010 | SUB | op1 - op2 |
0011 | RSB | op2 - op1 |
0100 | ADD | op1 + op2 |
0101 | ADC | op1 + op2 + carry |
0110 | SBC | op1 - op2 - carry + 1 |
0111 | RSC | op2 - op1 - carry + 1 |
1000 | TST | op1 & op2, результат не пишется |
1001 | TEQ | op1 ^ op2, результат не пишется |
1010 | CMP | op1 - op2, результат не пишется |
1011 | CMN | op2 - op1, результат не пишется |
1100 | ORR | op1 | op2 |
1101 | MOV | op2 |
1110 | BIC | op1 & ~op2, очистка бита |
1111 | MVN | ~op2 |