Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Упражнения / АВС. Упражнение. Команды прямой и обратной загрузки

.pdf
Скачиваний:
20
Добавлен:
07.10.2020
Размер:
180.19 Кб
Скачать

Ассемблер ARM(Cortex A9)

Команды прямой и обратной загрузки.

Эти команды позволяют производить обмен данными между ячейками памяти и внутренними регистрами процессора. Мнемоника операции прямой загрузки: LDR – Load Register, мнемоника операции обратной загрузки: STR – Store Register. Формат данных может быть: слово, полуслово или байт. Соответствующие мнемоники:

LDRB (Load Register Byte) LDRSB (Load Register Signed Byte) LDRH (Load Register Halfword)

LDRSH (Load Register Signed Halfword)

Отличие загрузки знакового операнда от загрузки беззнакового операнда, формат которого меньше, чем слово, в расширении (знаком или нулем). Соответственно, для обратной загрузки

STRB (Store Register Byte) STRH (Store Register Halfword)

Операнды:

Регистр процессора (Rd). Регистр со стороны процессора всегда следует в тесте сразу после аббревиатуры команды. Этот регистр может использоваться как приемник (в случае прямой загрузки, LDR), так и источник, STR (для обратной загрузки, STR). Использовать возможно любые свободные регистры.

Ячейка памяти. Адрес ячейки формируется на основе базового, содержащегося в регистре (Rn). Смещение (offset), прибавляемое к базовому адресу, может записываться или непосредственно, или как содержимое индексного регистра

(Rm). Причем содержимое индексного регистра может задаваться со сдвигом вправо или влево на указанное число позиций (разрядов).

Надо понимать, что в качестве Rd , Rn и Rm могут использоваться любые регистры общего назначения.

Примеры:

LDR R2, [R6, # -20] – загрузка в R2 по адресу, записанному в R6, минус 20 LDR R3, [R6, R7]

LDR R5, [R6, R8, LSL# 2]

(LSL – Logic Shift Left, LSR – Logic Shift Right)

LDR R5, MEMLOC === LDR R5, [R15, # offset] – загрузка в R5 по адресу метки LDR R5, =MEMLOC – загрузка в R5 адреса метки.

STR R5, [R2]

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

В первом случае, как в приведенных выше примерах формируемый на шине адрес состоит из содержимого регистров, которое не изменяется. База остается и смещение остается.

Во втором случае содержимое регистров складывается, выводится на шину и копируется в базу.

Пример

LDR R2, [R6, R8, LSL#2]!

R6 <- [R6] + [R8 x 4] до получения содержимого в R2

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

Пример

LDR R5, [R6], #0x20

R6 <- [R6] + 32 – после получения содержимого в R2.

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

Пример

LDMIA R3!, {R4, R6-R8, R10}

Загрузка в перечисленную цепочку регистров с начального адреса, записанного в R3. После загрузки содержимое R3 увеличивается на 20.

STMDB SP!, {R1, R3-R5} === PUSH {R1, R3-R5}

Занесение в стек по адресу указателя с предыдущим декрементом.

LDMIA SP!, {R1, R3-R5} === POP {R1, R3-R5}

Работа № 2.

1.Ознакомиться с текстом программы – Прогр. 1.

2.На рабочем столе открыть редактор GVim: Меню приложений – Инструменты – Gvim.

3.Создать новый файл (Файл – Новый), войти в режим вставки (Insert).

4.Набрать текст Прогр.1. (номера команд не набирать!)

5.Сохранить файл, создав любую папку проекта в своем каталоге, присвоив ему расширение s. Например: part2_1.s

6.Подключить макет. Открыть Altera Monitor Program (Файловая система – opt – altera15.0 – University Program – Monitor Program – bin – altera monitor program.)

7.Выбрать File > New Project.

8.Далее выбрать имя папки, определить имя проекта в соответствии с тем, как Вы его назвали. Выбрать архитектуру ARM Cortex-A9. Клик Next.

9.Выбрать DE1-SoC Computer, Next.

10.Выбираем Assembly Program. Окно вставок не инициализируем! Next.

11.В следующем окне добавляем созданный файл. Next.

12.Specify system parameters оставляем без изменений. Next.

13.Диапазоны используемой памяти также оставляем без изменения. Finish.

14.Осуществить загрузку кодов в макет, дав положительный ответ на запрос “Download System”.

15.Произвести компиляцию файла и загрузку (Actions> Compile&Load)*.

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

Disassembly.

17.Выполнять программу пошагово, нажимая на верхнюю иконку с дугообразной желтой стрелкой. На каждом шаге просматривать содержимое основных регистров исполненной команды и содержимое

ячеек памяти. Изменение состояния регистра подсвечивается в отладчике красным цветом. Результаты заносить в таблицу 1.

18.Внести изменения в программу Прогр.1, касающиеся изменения обращения к памяти, получив Прогр.2.

19.Проделать все пункты данной работы с Прогр.2, занести результаты в таблицу, по форме аналогичную таблице 1, и сравнить полученные результаты в таблицах. Область стека можно вызвать в поиске опции

Memory.

Прогр. 1.

.text

.global _start

1._start: LDR R0, =ADR1

2.LDR R1, [R0]

3.LDR R2, [R0, #4]

4.LDR R3, [R0, #8]

5.LDR R4, =ADR2

6.STMIA R4!, {R1-R3}

7.LDMDB R4!, {R5-R7}

8.LDR R8, ADR3

9.STR R8, [R0]

10.Stop: B Stop

ADR1: .word 20, 30, 40

ADR2: .word 0, 0, 0

ADR3: .word 100

.end

 

 

 

Таблица 1.

 

 

 

 

Состояние регистра

Адрес используемой

Состояние

команды

 

ячейки памяти

используемой ячейки

1.

R0 =

 

 

 

 

 

 

Прогр. 2.

.text

.global _start

1._start: LDR R0, =ADR1

2.LDR R1, [R0],#4

3.LDR R2, [R0], #4

4.LDR R3, [R0]

5.LDR R4, =ADR2

6.PUSH {R1-R3}

7.STMIA R4!, {R1-R3}

8.POP {R5-R7}

9.Stop: B Stop

ADR1: .word 20, 30, 40

ADR2: .word 25, 37, 49

.end