§ Таблица инструкции

Описание313029282726252423222120191817161514131211109876543210
Переход и обмен BXCond000100101111111111110001Rm
Обработка данных / PSRCond00IОпкодSRnRdОперанд
УмножениеCond000000ASRdRnRs1001Rm
Длинное умножениеCond00001UASRdHiRdLoRn1001Rm
Одиночный обмен даннымиCond00010B00RnRd00001001Rm
Передача полуслов (reg)Cond000PU0WLRnRd00001SH1Rm
Передача полуслов (imm)Cond000PU0WLRnRdСмещение1SH1Смещение
Одиночная передача данныхCond01IPUBWLRnRdСмещение
Блочная передача данныхCond100PUSWLRnСписок регистров
Условный переходCond101LСмещение
Программное прерываниеCond1111Игнорируется процессором
Передача данных (сопроцессор)Cond110PUNWLRnCRdCP#Смещение
Обработка данных (сопроцессор)Cond1110ОпкодCRnCRdCP#CP0CRm
Перемещения регистров (сопроцессор)Cond1110ОпкодLCRnCRdCP#CP1CRm
ЗарезервированоCond011-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

§ Операнд

I11 .. 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