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. Способы обмена данными между вызывающей программой и подпрограммой.