Система команд процессоров ARM, страница 2

·  ‑ Фиксированная длина команды (4 байта) ограничивает длину поля, которое в команде может быть отведено под непосредственный операнд. Это означает невозможность задать в этом поле значение непосредственной константы произвольным в диапазоне, определяемом разрядностью регистров, т.е. от 0 до 232.

В подавляющем большинстве требуемые значения непосредственной константы лежат в диапазоне единиц, десятков или сотен, и лишь весьма редко бывают нужны большие значения в диапазоне до 232-1, (определяемых разрядностью регистров) которых требует архитектура программной модели. Поэтому вполне допустимо иметь в команде поле ограниченной длины для непосредственной константы. Однако, как же в таком случае все-таки можно получить константу с произвольным значением ? Для этого в RISC-архитектурах используют несколько различных приемов, но все они требуют для формирования произвольной константы использовать более, чем одну команду (что допустимо с точки зрения экономии длины кода, так как произвольные «длинные» константы нужны нечасто).

Для задания непосредственного операнда в командах набора ARM отведено 8 битов. Однако, перед выполнением операции, предписываемой командой, процессор выполняет циклический сдвиг этой константы вправо. Количество сдвигов задается в той же команде в 4-битовом поле и равно удвоенному содержимому этого поля. Таким образом, количество сдвигов может быть равно 0, 2, 4,…26, 28, 30, а общая длина поля непосредственного операнда составляет 12 битов.

Этот же прием (возможность в той же команде выполнить сдвиг одного из операндов перед выполнением операции, предписываемой командой) используется в большинстве команд копирования и обработки. Это позволяет во многих случаях, совмещая сдвиг с другими операциями, уменьшить количество команд. Этим же объясняется отсутствие в наборе ARM отдельных команд сдвига. Для обозначения специфического (подвергаемого сдвигу) операнда в англоязычных описаниях используется словосочетание shifter operand. В данном тексте в дальнейшем будем использовать русскоязычный эквивалент «С-операнд». С-операндом может быть кроме уже рассмотренного случая непосредственной константы, также 32-битовое содержимое РОН, при этом при этом программист может задать одну из четырех разновидностей сдвига, а также любое количество сдвигов от 0 до 31. Более подробно об особенностях С-операнда в различных командах следует смотреть в описаниях отдельных команд.Рассмотрим состав системы команд ARM, ведя описание по функциональным группам команд.

Команды копирования (пересылки).

Традиционно эту группу команд именуют командами пересылки, однако термин «пересылка» по смыслу своему предполагает операцию перемещения, когда перемещаемый объект появляется в месте назначения (операнд-приёмник) и прекращает своё существование в источнике. Правильнее называть подобные команды командами «копирования», как это делает, в частности, патриарх компьютерной науки Эндрю Танненбаум (Andrew Tannenbaum) в своём фундаментальном учебнике Structured Computer Organisation, четвертое издание которого издано в России в 2002 году под названием «Архитектура компьютеров».

Команды загрузки и сохранения

LDR            загрузка слова в регистр из памяти

LDRH         загрузка беззнакового полуслова в регистр из памяти (с расширением «нулями»).

LDRB         загрузка беззнакового байта в регистр из памяти (с расширением «нулями»).

LDRSH      загрузка полуслова в регистр с расширением знака.

LDRSB       загрузка байта в регистр с расширением знака

LDRT         загрузка слова в регистр с трансляцией

LDRBT       загрузка байта в регистр с трансляцией

STR            сохранение слова из регистра в память

STRH         сохранение полуслова из регистра в память

STRB         сохранение байта из регистра в память

STRT         сохранение слова из регистра в память с трансляцией

STRBT       сохранение байта из регистра в память с трансляцией

STM           множественное сохранение ‑ при выполнении этой команды в память записывается содержимое некоторых (или всех 16) регистров общего назначения. Перечень сохраняемых регистров задается в команде битовой маской, и может быть произвольным.

LDM           множественная загрузка – при выполнении этой команды из памяти восстанавливаются значения некоторых (или всех16) регистров общего назначения, перечень регистров задается в команде битовой маской.

Команды копирования «регистр – регистр»

MOV           копирование содержимого одного РОН (содержащего С-операнд, так что, возможно, со сдвигом) в другой РОН.

MVN           копирование инвертированного содержимого одного РОН (содержащего С-операнд, так что, возможно, со сдвигом) в другой РОН.

MRS           копирование содержимого РОН в активный (соответствующий текущему режиму) регистр состояния.

MSR           копирование активного (соответствующего текущему режиму) регистра состояния в РОН.

SWP          обмен содержимым (32-битовым словом) между элементом в памяти и регистрами.

SWPB        обмен байтовым элементом данных между байтом памяти и регистрами.

Команды обработки

Арифметические операции

ADD           сложение С-операнда и содержимого РОН и помещение результата сложения в РОН (может быть, на место одного из операндов)..

ADC           сложение С-операнда и содержимого РОН с учетом переноса (carry-флага) и помещение результата сложения в РОН (может быть, на место одного из операндов).

SUB           вычитание С-операнда из содержимого РОН и помещение результата в РОН (может быть, на место одного из операндов).

SBC           вычитание С-операнда из содержимого РОН с учетом заема (carry-флага) и помещение результата в РОН (может быть, на место одного из операндов).

RSB           «обратное» вычитание: содержимое РОН вычитается из С-операнда, результат помещается в РОН (может быть, на место одного из операндов).

RSC           «обратное» вычитание с заемом: содержимое РОН вычитается из С-операнда с учетом значения carry-флага, результат помещается в РОН (может быть, на место одного из операндов

MUL           умножение содержимого РОН на содержимое РОН (другого, либо того же самого) и помещение «короткого» (32-битового) произведения в РОН (может быть на место одного из сомножителей).