Icall ; команда icall не имеет операндов

Для возврата из подпрограмм используется команда RET. При выполнении команды RET адрес возврата загружается из стека в программный счётчик. При этом содержимое указателя стека увеличивается на 2 или 3 в зависимости от разрядности программного счётчика (см. выше).

Стек может также использоваться для сохранения содержимого РОН на время выполнения подпрограмм. Для сохранения в стеке и извлечения из стека содержимого РОН служат команды PUSH и POP. Команда PUSH заносит содержимое регистра в стек по адресу, хранящемуся в указателе стека, при этом значение указателя стека уменьшается на единицу (SPH:SPL = SPH:SPL – 1). Команда POP выполняет обратные действия: значение указателя стека увеличивается на единицу (SPH:SPL = SPH:SPL + 1); содержимое ячейки памяти по адресу, хранящемуся в указателе стека, загружается в регистр.

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

Nolist ; отключить генерацию листинга

.include "m8535def.inc" ; подключить inc-файл

List ; включить генерацию листинга

Rjmp RESET ; переход к основной программе

PODPR: ; подпрограмма PODPR

; ...

Ret ; возврат в основную программу

RESET: ; основная программа

Ldi R16, low(RAMEND)

Out SPL, R16 ; инициализация SPL

Ldi R16, high(RAMEND)

Out SPH, R16 ; инициализация SPH

; ...

Rcall PODPR ; вызов подпрограммы PODPR

; ...

Рис. 25. Пример программы с использованием подпрограммы

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

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

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

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

LDI R16, $33 ; R16 <- $33

PUSH R16 ; сохранение содержимого регистра R16 в стеке

то в подпрограмме можно получить к нему доступ:

IN R30, SPL ; младший байт указателя стека

IN R31, SPH ; старший байт указателя стека

LDD R20, Z+3 ; загрузка числа $33 из стека в регистр R20

(команда IN служит для считывания содержимого регистра ввода-вывода в РОН). Аналогично можно использовать стек для хранения адреса массива передаваемых параметров, расположенного в оперативной памяти данных.

ЗАДАНИЕ

1. Составить программу, использующую для вызова подпрограммы команду RCALL. Выполняемую подпрограммой функцию взять из задания лабораторной работы № 4 (по указанию преподавателя). Для передачи параметров в подпрограмму использовать регистры общего назначения. Выполнить программу в пошаговом режиме, отслеживая изменение содержимого программного счётчика, указателя стека, а также занесение в стек адреса возврата из подпрограммы.

2. Выполнить задание п. 1, используя стек для передачи параметров в подпрограмму. Проследить в симуляторе занесение передаваемых параметров в стек.

3. Выполнить задание п. 2, применив для вызова подпрограммы команду ICALL.

СОДЕРЖАНИЕ ОТЧЁТА

Отчёт должен содержать: титульный лист с указанием номера и названия лабораторной работы, номера группы и фамилий выполнивших работу; цель работы; листинги трансляции программ в соответствии с заданием.

КОНТРОЛЬНЫЕ ВОПРОСЫ

1. Условия взаимодействия вызывающей программы и подпрограммы.

2. Принципы организации и назначение стека.

3. Механизм вызова подпрограмм.

4. Команды работы с подпрограммами на ассемблере микроконтроллеров семейства AVR.

5. Способы обмена данными между вызывающей программой и подпрограммой.

Наши рекомендации