Команда вызова подпрограмм


Как и для реализации безусловных переходов, для вызова подпрограмм имеется только одна команда — команда относительного вызова RCALL. Если не принимать во внимание некоторые отличия, описанные ниже, эта команда работает так же, как и команда относительного безусловного перехода RJMP.

Команда RCALL сохраняет в стеке значение счетчика команд. За тем содержимое счетчика команд увеличивается или уменьшается на некоторое значение, являющееся операндом команды (Рис. 6.4).

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

Команда относительного вызова подпрограмм выполняется за 3 машинных цикла, 2 из которых затрачиваются на сохранение в стеке двух байт счетчика команд.

Команды возврата из подпрограмм

В конце каждой подпрограммы обязательно должна находиться команда возврата из нее. В системе команд микроконтроллеров семейства имеется две таких команды. Для возврата из обычной подпрограммы, вызываемой командой RCALL, используется команда RET. Для возврата из подпрограммы обработки прерывания используется команда RETI.

Обе команды восстанавливают из стека содержимое счетчика команд, сохраненное там перед переходом к подпрограмме. Команда возврата из подпрограммы RETI дополнительно устанавливает в «1» флаг общего разрешения прерываний I регистра SREG, сбрасываемый аппаратно при возникновении прерывания.

На выполнение каждой из команд возврата из подпрограммы требуется 4 машинных цикла.

Стек

В микроконтроллерах AVR семейства Tiny стек реализован аппаратно. Глубина стека равна трем уровням, а размер равен размеру счетчика команд (9 или 10 разрядов). Стек расположен в собственной области памяти и имеет LIFO-организацию (Last In First Out — последним вошел, первым вышел), т. е. значение, записанное последним, будет прочитано первым.

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

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

Рассмотрим выполнение команды RCALL (Рис. 6.5): содержимое счетчика команд пересылается на 1-й уровень стека, а предыдущие значения предварительно «сползают» на один уровень (значение, находившееся на первом уровне, перемещается на второй уровень и т. д.).Заметим, что в результате этой операции будет потеряно значение, расположенное на 3-м уровне стека.

При выполнении команды возврата из подпрограммы RET или RE-TI (Рис. 6.6) значение, хранящееся на 1-м уровне стека, заносится в счетчик команд. Во время этой операции все значения «поднимаются» на один уровень вверх (значение, находившееся на втором уровне, перемещается на первый уровень и т. д.).

Рис. 6.5. Работа стека при выполнении команды RCALL

Рис. 6.6. Работа стека при выполнении команды RET

 

Регистровый файл содержит 32 8-и разрядных регистра общего назначения (РОН), которые в командах обозначаются от r0 до r31. Раньше только один регистр – аккумулятор мог воспринимать результаты операций АЛУ. В МК-ах фирмы Atmel все 32 регистра могут выполнять функции аккумулятора. Такой подход значительно облегчает процесс написания программы и упрощает саму программу, избавляя ее от ненужных команд, перекладывающих результат из аккумулятора в нужный регистр. Шесть из 32-х регистров можно использовать как три 16-ти разрядных регистровых пары (указатели адреса в адресном пространстве данных).

Эти регистры обозначаются как X, Y и Z, и определены следующим образом:

Для адресации таблиц в памяти программ можно использовать только регистровую пару Z.



Дата добавления: 2016-12-27; просмотров: 3148;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.009 сек.