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

ADC           команда сложения с учетом содержимого carry-флага: складывает содержимое двух РОН  и помещает результат на место одного из слагаемых.

SUB           команда вычитания: вычитает из содержимого РОН содержимое другого РОН или непосредственную константу и помещает результат на место уменьшаемого.

SBC           команда вычитания с учетом содержимого carry-флага: вычитает из содержимого РОН содержимое другого РОН  и помещает результат на место вычитаемого.

MUL           умножение содержимого РОН на содержимое другого (или того же самого) РОН.

NEG           смена знака содержимого РОН

Операции побитовой обработки

BIC             очистка битов

EOR           исключающее ИЛИ

MVN           копирование в РОН инвертированного содержимого другого РОН

ORR          

Команды сдвигов

ASR          

LSL           

LSR           

ROR          

Команды проверки операндов

CMN           сравнение с отрицательной величиной: выполняется сложение содержимого РОН с содержимым другого РОН, по результату сложения изменяется состояние флагов в регистре состояний, после чего результат сложения теряется. (??? описание команды уточнить)

CMP           сравнение

TST            проверка битов

Команды передачи управления

B                Передача управления (может быть условная)

BL              Вызов подпрограммы THUMB

BLX            Вызов подпрограммы ARM

BX              Безусловная передача управления с переключением в режим ARM.

Команды программных прерываний

BKPT         Программное прерывание для отладочных целей

SWI            Программное прерывание для вызова сервисов ОС

Форматы команд



Команды умножения и дополнительные команды загрузки-сохранения

Разные команды


Поле условий

Почти все команды в архитектуре ARM могут быть выполнены условно (т.е. лишь при наличии заданной комбинации флагов C,Z,N,V). Для указания условия в каждой команде служит поле cond.


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

Большинство команд обработки трех-операндные. Из двух операндов-источников один – обязательно регистр. Второй может быть непосредственным операндом либо содержаться в регистре. Если второй операнд-источник находится в регистре, к нему перед выполнением операции может быть применена операция сдвига. Поэтому второй операнд-источник называют shifter-operand.

Способы загрузки констант в регистр

Загрузка заранее известного программисту значения в регистр общего назначения может понадобиться в двух случаях: 1) непосредственный операнд, например, начальное значение счетчика в циклической конструкции с заранее известным числом повторений; 2) адрес объекта, который далее будет использован в командах с косвенно-регистровой адресацией; 3) смещение относительно базового адреса в командах с адресацией косвенно-регистровой со смещением (смещение может содержаться либо как константа в команде, либо предварительно загружаться в регистр - ??? пояснить).

Непосредственный операнд в командах с непосредственной адресацией задается 8-битовой константой, которая перед выполнением команды может быть циклически сдвинута на четное число позиций: 0, 2, ….30. Для задания непосредственного операнда в команде используется два поля: 8 битов содержат собственно цифры константы, а поле сдвига (4 бита) определяет количество циклических сдвигов. Операция формирования константы показана на рисунке для случая, когда поле сдвига содержит значение 1001b=9, что задает циклический сдвиг (ротацию) исходной константы (вправо) на 9*2=18 позиций.

В таблице приведено несколько примеров для разных значений поля константы и поля сдвига.

Поле цифр

Поле сдвига

Значение непосредственного операнда после ротации

1

000000012

00002

0х00000001 = 1            (нет ротации)

2

000000012

11112

0х00000004 = 4            (ротация вправо на 15*2=30 позиций)

3

000000012

00012

0x40000000 = 230         (ротация вправо на 1*2=2 позиции)

4

000011112

10002

0x000F0000 = 220 - 216 (ротация вправо на 16 позиций)

5

111100002

10102

0x000F0000 = 220 - 216 (ротация вправо на 20 позиций)

6

000001002

00102

0x40000000 = 230         (ротация вправо на 4 позиции)

7

000000102

00102

0x20000000 = 229         (ротация вправо на 4 позиции)

8

111111102

00002

0x000000FE                 (нет ротации)

9

111111102

11112

0x000003F8                  (ротация на 30 позиций)

10

01111111

11112

0x000001FC                 (ротация на 30 позиций)

Ясно, что таким способом можно сформировать далеко не все возможные 32-битовые значения, а только такие, в двоичной записи которых содержится не более 8-ми единиц, содержащихся в непрерывном участке длиной 8 битов (остальные позиции 32-битовой константы – нули). Более того, общее количество различных значений существенно меньше величины 212, так как некоторым различным сочетаниям полей цифр и сдвига может соответствовать одно и то же значение (см. в таблице строки 4 и 5). Однако, значения величин, которые могут быть сформированы таким образом, покрывают подавляющую часть потребностей программистов, так как чаще всего как раз и требуется формировать значения, лежащие в диапазоне от единиц до сотен.

Для получения непосредственных операндов или адресов во всем диапазоне, перекрываемом 32-битовой разрядной сеткой используется другой прием, состоящий в том, что заранее определяется константное слово данных, помещаемый компилятором или ассемблером в область данных, к которому затем транслятор организует доступ, используя адресацию со смещением относительно счетчика команд. таким образом можно получить любое значение константы, ценой затраты лишнего 4-байтового слова в области данных.


 Литература

1. ARM Architecture Reference Manual. 1996-2000 ARM Limited. Document Number ARM DDI 0100E (www.arm.com/…).

2. ARM 7TDMI Data Sheet. 1995  ARM Limited. Document Number ARM DDI 0029E (www.arm.com/…).