Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основные сведения о ARM.pdf
Скачиваний:
116
Добавлен:
18.05.2014
Размер:
482.2 Кб
Скачать

5.6Вызов подпрограммы по адресу в регистре

Вызов подпрограммы по адресу в регистре выполняется командой «bxl» (от англ. «branch and exchange with link»). При выполнении команды blx в регистр r14 (LR) автоматически записывается адрес инструкции, следующей за инструкцией перехода.

Требования по выравниванию адреса аналогичны требованиям в команде «bx». Если адрес является нечётным, то произойдёт переход со сменой набора инструкций.

5.7Вызов подпрограммы со сменой набора инструкций

Команда blx может быть использована для вызова подпрограммы со сменой набора инструкций на Thumb. Описание набора инструкций Thumb выходит за рамки данных методических указаний.

 

 

Листинг 4. Пример использования команд переходов.

 

 

b label

@ Безусловный переход на метку label

 

@ Неинтересный фрагмент программы

label:

 

@ Метка (адрес) на который осуществляется переход

cmp r1, r2

@ Сравнить значения r1 и r2

blgt subpr

@ Вызов подпрограммы, начинающейся с метки subpr,

cmp

r1, #5

@ если r1 > r2

@ Отсюда продолжится выполнение после завершения

bxeq

r3

@ подпрограммы subpr

@ Переход по адресу, содержащемуся в регистре r3

subpr:

 

@ при условии, r1 равно 5

 

@ Что-то делаем...

 

bx lr;

@ Делаем переход на адрес, лежащий в регистре

 

 

@ ссылки, установленный при вызове подпрограммы

 

 

@ командой blgt, выполняя тем самым возврат из

 

 

@ подпрограммы.

6Команды доступа к памяти (пересылки данных)

6.1Условные обозначения

При описании формата записи команд доступа к памяти на языке ассемблера будут использоваться следующие условные обозначения:

-op – мнемоника инструкции (например «ldr», «str», см. табл. 7);

-{} — фигурные скобки; указывают, что содержащееся в них выражение не является обязательным и может быть опущено;

18

-{cond} — необязательный предикативный суффикс для реализации условного выполнения команды (подробнее см. п. 2);

-{type} – выражение, указывающее режим пересылки: пересылка знаковых или беззнаковых байта или полуслова; по умолчанию (т. е. если оно не указано) выполняется пересылка беззнакового слова;

-Rd — операнд назначения в инструкциях загрузки из памяти, либо исходный операнд в инструкциях сохранения в память;

-Addr — выражение, определяющее адрес, из которого осуществляется загрузка дынных, либо куда происходит сохранение;

-Rn — регистр, используемый в качестве основы для формирования адреса в Addr (должен отличаться от Rd);

-Offset — выражение, формирующее смещение (положительное или отрицательное), используемое в Addr совместно со значением регистра Rn;

-Rm – регистр, используемый в качестве основы для формирования смещения (Offset);

-shift – выражение, определяющее сдвиговую операцию, применяемую к регистру Rm для вычисления полного смещения;

-Sh_type #n – вид сдвиговой операции над регистром Rm и количество позиций сдвига;

-label — метка в тексте программы;

-{!} (восклицательный знак) — признак использования автоинкремента в командах с предындексной адресацией;

 

 

Таблица 7: Мнемоники, используемые в командах пересылки

 

 

 

Мнемоника

Расшифровка

Назначение

 

 

 

ldr

Load register

Загрузка значения регистра из памяти. Пересылает слово

 

 

или байт, расположенный адресу Addr в регистр назначения

 

 

Rd.

str

Store register

Сохранение значения регистра в память. Пересылает

 

 

значение исходного операнда Rd по адресу Addr.

Например, формату записи команды загрузки в регистр с использованием предындексной автоинкрементной адресации соответствует формат

op{cond}{type} Rd, Addr

(7)

где Addr (выражение, формирующее адрес) может быть записано как

 

[Rn, Offset]{!}

(8)

Такому формату соответствует, например, команда

 

19

ldreq r1, [r2, #5]!

(9)

где «ldr» – мнемоника команды пересылки данных из памяти в регистр; «eq» – предикативный суффикс (см. п. 3); выражение type не указано (что означает пересылку беззнакового слова); «r1» – регистр назначения, «[r2, #5]!» – выражение, формирующее адрес (Addr); «r2» – регистр, используемый в качестве основы для формирования Addr; «#5» – выражение, формирующее смещение (в данном случае оно выражено через константу 5); «!» (восклицательный знак) – признак автоинкремента (в результате выполнения инструкции значение r2 изменится на величину смещения).

6.2Форматы записи выражения, формирующего адрес, и виды адресации

Выражение адреса (Addr) может формироваться несколькими способами. Эти способы определяют так называемые виды адресации: постиндексную, предындексную, относительную, косвенную. Схема формирования Addr в командах доступа к памяти приведена на рис. 2. В таблице 8 представлены форматы команд пересылки с частично раскрытым выражением адреса.

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

Таблица 8: Форматы команд пересылки в общем виде

Вид адресации

Формат команд доступа к памяти

Примечания

 

 

 

 

 

 

 

 

 

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

op{cond}{type} Rd, [Rn], Offset

 

 

 

 

 

 

 

 

 

 

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

op{cond}{type} Rd, [Rn, Offset]{!}

 

 

 

 

 

 

 

 

 

Косвенная

op{cond}{type} Rd, [Rn]

Реализуется

 

через

 

 

предындексную

 

или

 

 

постиндексную

адресацию

с

 

 

нулевым смещением.

 

Относительная

op{cond}{type} Rd, label

Реализуется

 

через

 

 

предындексную

адресацию

при

 

 

которой в

качестве базового

 

 

регистра

Rn

выступает

 

 

программный

 

счётчик

r15.

 

 

Смещение

 

(константа)

 

 

вычисляется

 

компилятором

 

 

автоматически.

 

 

20

Названия «индексных» видов адресации отражают то, вычисляется ли полный адрес до выполнения команды пересылки (предындексная адресация), или после неё (постиндексная). Так, при использовании предындексной адресации сначала формируется полный адрес путём суммирования значения, лежащего в некотором «базовом» регистре (обозначен как Rn), со смещением; затем происходит операция пересылки в/из этого адреса. Инструкция пересылки с предындексной адресацией может быть автоинкрементной, если в конце команды поставлен символ «!» (восклицательный знак). Автоинкрементность означает, что полный адрес будет записан в Rn (т. е. значение регистра Rn будет изменено на величину смещения), но только после выполнения пересылки.

Постиндексная адресация подразумевает использование в качестве адреса пересылки только значения базового регистра Rn. Формирование полного адреса происходит уже после выполнения пересылки, причём этот полный адрес всегда записывается в базовый регистр адреса (Rn). Таким образом,

постиндексная адресация всегда является автоинкрементной.

Рис. 2: Схема формата записи адреса в командах доступа к памяти (обобщённая)

6.3Режимы пересылки

Выражение type определяет режим пересылки: разрядность и учёт знака(со знаком/без знака) и может раскрываться в один из суффиксов в соответствии с таблицей 9.

21

Таблица 9: Возможные значения суффикса type в командах пересылки

Значение суффикса type

Режим

Пояснение

<отсутствует>

word

Пересылка беззнакового слова

 

 

 

sh

signed halfword

Пересылка знакового полуслова

 

 

 

h

halfword

Пересылку беззнакового полуслова

 

 

 

sb

signed byte

Пересылку знакового байта

 

 

 

b

byte

Пересылка беззнакового байта

Поскольку все регистры общего назначения являются 32х-разрядными, загрузка данных вне зависимости от режима пересылки приводит к перезаписи значения регистра целиком (а не только какого-то байта или полуслова внутри него). При этом, знаковые загрузки выполняются с расширением знака (свободные биты заполняются единицами или нулями в зависимости от значения знакового разряда исходного операнда). При беззнаковых загрузках «лишние» биты заполняются нулями. Таким образом, пересылка 8-разрядного байта или 16-разрядного слова в 32-разрядный регистр позволяет сохранить значение числа при увеличении его разрядности.

Сохранение регистров в память всегда происходит без учёта знака в том смысле, что автоматическое расширение знака ни над каким операндом не выполняется. Если значение исходного операнда лежит в диапазоне значений операнда назначения, то это значение естественным образом останется неизменным при усечении разрядности числа вне зависимости от того, является ли это значение числом со знаком или нет.

Загрузка 32-разрядных слов в 32-разрядный регистр, как и сохранение, выполняется «бит в бит».

Адрес пересылки указывает на младший байт операнда1.

В программах для микроконтроллера AT91SAM7S адрес пересылки всегда должен быть выравнен в соответствии с разрядностью пересылки. Это означает, что адрес должен быть кратен 4 при пересылке слов или 2 при пересылке полуслов. Для команд пересылки байтов требования по выравниванию адреса отсутствуют. Во время работы программы в случае нарушения требований по выравниванию адреса выполнение инструкции прерывается и процессор переходит в специальный режим «Abort».

Перечень возможных форматов команд пересылки с раскрытым выражением type и частично раскрытым выражением адреса приведён в

1При использовании little-endian порядка байтов (от младшего к старшему).

22