Архитектура ARM предусматривает 16 команд обработки данных общего назначения, перечисленных в таблице ниже. Помимо этих инструкций, разные модели процессоров могут иметь дополнительные команды, имеющие, как правило, специальное назначение (основным исключением являются команды умножения, отсутствующие в базовой архитектуре, хотя во всех более-менее современных процессорах ARM основная их часть присутствует всегда).
Мнемоника | Код операции | Операция | Действие |
---|---|---|---|
Логическое И | Rd := Rn AND операнд сдвигателя | ||
Логическое исключающее ИЛИ | Rd := Rn EOR операнд сдвигателя | ||
Вычитание | Rd := Rn – операнд сдвигателя | ||
Обратное вычитание | Rd := операнд сдвигателя – Rn | ||
Сложение | Rd := Rn + операнд сдвигателя | ||
Сложение с переносом | Rd := Rn + операнд сдвигателя + C | ||
Вычитание с переносом | Rd := Rn – операнд сдвигателя – NOT C | ||
Обратное вычитание с переносом | Rd := операнд сдвигателя – Rn – NOT C | ||
Проверка | Rn AND операнд сдвигателя | ||
Проверка эквивалентности | Rn EOR операнд сдвигателя | ||
Сравнение | Rn – операнд сдвигателя | ||
Сравнение с обратной величиной | Rn + операнд сдвигателя | ||
Логическое ИЛИ | Rd := Rn OR операнд сдвигателя | ||
Пересылка | Rd := операнд сдвигателя | ||
Сброс битов | Rd := Rn AND NOT операнд сдвигателя | ||
Пересылка с инверсией | Rd := NOT операнд сдвигателя |
У большинства команд обработки данных, за исключением MOV и MVN, имеются два исходных операнда (регистр общего назначения Rn и так называемый операнд-сдвигателя — сдвинутое содержимое регистра Rs или однобайтовой константы, заданной непосредственно в коде команды; о нём подробно написано в разделе Режим адресации 1: инструкции обработки данных), между которыми и производится операция. Результат большинства инструкций помещается в отдельно указанный регистр Rd; исключением являются команды CMP, CMN, TST и TEQ: их результат теряется, и единственным последствием их выполнения является изменение флагов N, Z, V и C в регистре состояния CPSR. Остальные инструкции также могут менять эти флаги, но могут их и не менять: это завсит от значения бита S в коде команды (когда он установлен, флаги меняются), единичному значению которого соответствует буква S, добавляемая к мнемонике команды, например, MOVS, ADDS. У перечисленных четырёх инструкций этот бит всегда установлен; коды команд с нулевым значением этого бита не являются операциями обработки данных, а относятся к одному из пространств расширения системы команд.
Общий формат кодирования инструкций обработки данных приведён на рисунке:
Назначение полей кода команды:
- cond — код условия, при соблюдении которого инструкция выполняется;
- I — разряд, задающий формат операнда сдвигателя (константа или содержимое регистра; подробнее см. в разделе Режим адресации 1: инструкции обработки данных);
- opcode — код выполняемой операции (приведены в таблице выше);
- S — бит, указывающий, должна ли команда изменять флаги состояния в регистре CPSR (при единичном значении флаги меняются, при нулевом — не меняются). В инструкциях CMP, CMN, TST и TEQ этот разряд всегда равен единице;
- Rn — номер регистра-источника. Это поле не используется в командах MOV и MVN;
- Rd — номер регистра-приёмника. Это поле не используется в командах CMP, CMN, TST и TEQ;
- shifter_operand — операнд сдвигателя (см. раздел Режим адресации 1: инструкции обработки данных).