Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Уч. пос. МПТ (2.04.12).pdf
Скачиваний:
403
Добавлен:
22.03.2015
Размер:
10.95 Mб
Скачать

Пример:

STMDB

SP!,

{R1-R2}

;

*(SP-=4) = R1; *(SP-=4) = R2

LDMIA

SP!,

{R3}

;

*SP = R3; SP += 4

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

Команды служат для безусловных и условных переходов (ветвлений) и вызова подпрограмм. Поскольку все команды ARM7 являются условными, достаточно всего трех команд B (перехода по непосредственному адресу) BL (переход с сохранением адреса возврата в LR) и BX (переход по адресу в регистре).

Адрес перехода, заданный непосредственно, кодируется как 24разрядное смещение (включая знак), которое умножается на 4 и прибавляется к текущему значению счетчика команд. Фактически реализуется операция

В мнемонической записи команды на ассемблере указывается абсолютный адрес, который при ассемблировании заменяется относительным.

Примеры:

BNE

0x380

;

if

(Z == 0) PC = 0x380

BL

0x380

;

LR

= PC + 4; PC = 0x380

1.3.7 Команды обращения к слову состояния программы

Команды этой группы предназначены для загрузки и сохранения слова состояния программы CPSR и его копии SPSP для текущего режима ядра. Возможно загрузка 8-разрядной константой с 4-разрядным смещением () или содержимым регистра общего назначения (). Копирование выполняется с наложением маски. Примеры:

MRS

CPSR, R0

; R0 = CPSR

MSR

CPSR_c, #0x10

; Загрузить 0x10 в младший байт

MSR

SPSR_cxsf, R0

; SPSR = R0

Сюда же отнесем команду вызова программного прерывания SWI. Эта команда переводит ядро в режим Supervisor и в режим ARM (если ядро находилось в 16-разрядном режиме Thumb), после чего передает управление по вектору программного прерывания.

1.4 Методы адресации

Адрес ячейки памяти или регистра общего назначения, к которым производится фактическое обращение, называется исполнительным адресом. Методом адресации называется способ формирования исполнительного адреса. Методы адресации различаются в зависимости от того, где расположены операнды и каким образом их расположение задано в коде операции.

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

20

этому длинные 32-разрядные адресе не могут размещаться в коде операции. Ниже рассмотрены поддерживаемые методы адресации.

Важный материал далее представлен в форме таблиц (1.4.1–1.4.3). В таблицах использованы следующие обозначения: текст, набранный шрифтом Consolas, не допускает изменения, так как является мнемоническим обозначением или элементами синтаксиса. Текст, оформленный наклонным шрифтом Times, представляет собой операнды. Вместо него подставляются константы, адреса или имена регистров, содержащих обрабатываемые данные. Элементы в фигурных скобках «{ }» не обязательны и могут быть опущены.

1.4.1 Непосредственная адресация

Непосредственная адресация наряду с регистровой применяется в командах арифметической и логической обработки. Непосредственная адресация наиболее проста. Операндом является числовая константа расположенная непосредственно в коде операции.

Пример (третий операнд адресован непосредственно):

SUB

R2, R0, #0x80000001

; R2 = R0 - 0x80000001

Разрядность поля операнда ограничена 12 битами. Это поле состоит из двух частей: восьмиразрядной , и четырехразрядной . Операнд формируется путем циклического сдвига вправо константы на разряда. Допустимыми являются только числа, которые могут быть представлены таким способом. Характерный пример — число 0x80000001 (шестнадцатеричное), которое получается путем сдвига числа 6 (двоичная запись ) на два разряда вправо. В то же время число , для записи которого в обычном прямом двоичном коде требуется всего девять разрядов, недопустимо, так как все эти разряды содержат единицы. Определить множество допустимых чисел с помощью удобной математической формулы вряд ли возможно.

1.4.2 Регистровая адресация

Регистровая адресация (короткая прямая) — вторая разновидность адресации в арифметико-логических командах. При регистровой адресации операнд расположен в одном из регистров .

Пример (все три операнда адресованы регистровым способом):

ORR

R3, R3, R2

; R3 = R3 | R2

Здесь примеры сопровождаются комментариями (через «;»), поясняющими выполняемые командой действия. При этом использован синтаксис языка Си.

В коде команды номер регистра обозначается коротким 4-разрядным полем. Это позволяет включить три адресных поля в сравнительно длинные 32-разрядные команды ARM7.

Кроме базового варианта поддерживается несколько видов сдвига регистрового операнда. Способ сдвига обозначается специальным ключевым словом. Число разрядов сдвига обозначается непосредственно константой или хранится в регистре общего назначения. Примеры:

ADD

R0,

R0,

R1,

LSR

#4

;

R0

=

R0

+

R1

>>

4

ADD

R0,

R0,

R1,

LSR

R2

;

R0

=

R0

+

R1

>>

R2

21

Сдвиг применим только к последнему третьему операнду (в примере это регистр R1). В таблице 1.4.1 приведены допустимые варианты регистровой адресации со сдвигом.

Таблица 1.4.1 – Непосредств. и регистровая адресация (операнд типа )

Метод адресации

 

Сдвиг операнда

Непосредственная

#

 

Регистровая

 

 

 

, LSL #

Логический влево на

разрядов

Регистровая с

, LSR #

Логический вправо на

разряд

непосредственным

, ASL #

Арифм. вправо на

разряд

сдвигом

, ROR #

Циклич. вправо на

разряд

 

, RRX

Цикл. вправо через перенос на 1 разр.

Регистровая с

, LSL

Логический влево на

разрядов

, LSR

Логический вправо на

разрядов

регистровым

, ASL

Арифм. вправо на разрядов

сдвигом

, ROR

Циклический вправо на разрядов

 

1.4.3 Косвенная адресация

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

LDR R0, [R1] ; R0 = *R1

Разумеется, регистр-указатель должен быть предварительно загружен нужным адресом.

1.4.4 Индексная адресация

Индексная адресация является развитием косвенной и так же как косвенная применяется в командах сохранения, загрузки и обмена с памятью. При индексной адресации исполнительный адрес вычисляется как сумма или разность базового адреса и смещения. Базовый адрес хранится в регистре общего назначения (). Смещение может быть задано непосредственно числовой константой или тоже храниться в одном из регистров общего назначения.

После выполнения операции исполнительный адрес может быть потерян, либо сохранен. В последнем случае регистр, хранящий базовый адрес, модифицируется, то есть увеличивается на величину смещения. Причем базовый адрес может модифицироваться на величину смещения до обращения к памяти или после. По этому признаку различают преиндексную адресацию и постиндексную.

Кроме того смещение, прибавляемое к базовому адресу или вычитаемое из него, может быть подвергнуто сдвигу. Поддерживается несколько видов сдвига (таблица 1.3.2).

22

Таблица 1.4.2 – Косвенная и индексная адресация (операнд типа )

 

Метод

 

 

Исполн.

Содержимое

 

 

Вид сдвига

 

адресации

 

 

адрес

после операции

 

 

 

 

 

 

 

 

 

Косвенная

[ ]

 

 

 

 

Постиндексная

 

Непоср.

[ ], #±

 

 

 

 

 

 

 

 

смещ.

 

 

 

 

 

 

 

 

Регистровое смещение сдвигомсо

[ ], ±

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[ ], ± , LSL #

 

 

 

 

 

 

Логический влево на

разрядов

 

 

 

[ ], ± , LSR #

 

 

 

 

 

 

Логический вправо на

разрядов

 

 

 

[ ], ± , ASR #

 

 

 

 

 

 

Арифметич. право на

разрядов

 

 

 

[ ], ± , ROR #

 

 

 

 

 

 

Циклический вправо на

разрядов

 

 

Непоср.

[ , #± ]{!}

 

 

 

меняетсянеRnбез

модификатора{!}

 

 

Преиндексная

 

смещ.

 

 

 

 

 

 

Регистровое смещение сдвигомсо

[ , ± ]{!}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[ , ± , LSL #

]{!}

 

 

 

 

 

Логический влево на

разрядов

 

 

 

[ , ± , LSR #

]{!}

 

 

 

 

 

Логический вправо на

разрядов

 

 

 

[ , ± , ASR #

]{!}

 

 

 

 

 

Арифметич. вправо на

разрядов

 

 

 

[ , ± , ROR #

]{!}

 

 

 

 

 

Циклический вправо на

разрядов

 

 

 

[ , ± , RRX]{!}

 

 

 

 

Цикл. вправо через перенос на 1 разр.

Таблица 1.4.3 – Косвенная и индексная адресация (операнд типа

)

 

 

 

 

 

Метод адресации

 

Исполн. адрес

Содержимое после операции

Косвенная

[ ]

 

Постиндексная с непосредств. смещением

[ ], #±

 

 

 

 

 

 

Постиндексная с регистровым смещением

[ ], ±

 

 

Преиндексная с непосредств. смещением

[ , #± ]{!}

 

(с модификатором {!})

 

 

 

 

Преиндексная с регистровым смещением

[ , #± ]{!}

 

(с модификатором {!})

23