fl
"РЛ" - НАЧИНАЮЩИМ
fl
Роман Абраш
г. Новочеркасск
E-mail:
[email protected] radioliga.com
П родолж ение.
Начало в N 91-4/2007
Глава 11.
Подпрограм м ы
В десятой главе мы познакоми-
лись со стеком и двумя командами
для работы с ним, но вопрос о его
необходимости остался открытым.
Эта глава будет посвящена объяс-
нению необходимости наличия сте-
ка, о которой упоминалось ранее.
Давайте вспомним наш первый
пример - мигалку. Помните, как мы
реализовывали задержку задан-
ной длительности? Представим
себе теперь, что нам нужно, исполь-
зовать аналогичную задержку не
один раз, а, например 25, т.е. наша
программа гораздо сложнее. Не-
ужели же нам придется 25 раз по-
вторять один и тот же участок про-
грам мы
с
м ногочисленны м и
Оиыг?! А вдруг окажется, что слож-
ность программы нашей такова,
что регистры всех 4-х банков ин-
тенсивно используются и свобод-
ных регистров для реализации цик-
лов нет? Как быть в этом случае?
И тут на помощь приходит спе-
циальный прием программирова-
ния, а именно - использ9 вание под-
программ. Иногда вместо термина
подпрограмма используется “проце-
дура” или “функция”, для языка ас-
семблера разницы в терминах нет
никакой. Подпрограммой называет-
ся участок кода, выполняемый мно-
гократно для выполнения однотип-
ных действий. От обычного повтора
команд подпрограмма отличается
тем, что последовательность команд
описана
в программе единожды, а
из нужных мест программы осуще-
ствляется вызов подпрограммы, по
завершению которой осуществляет-
ся
возврат
обратно и
продолжение
работы основного участка програм-
мы. Для реализации описанного
принципа используются специаль-
ные команды -
таблица 8.
Каждая из этих команд выпол-
няет непростые действия, причем
активно работает со стеком.
Первые две команды сначала
заносят в стек значение программ-
ного счетчика РС, соответствую-
щего адресу следующей команды
(как помните, РС содержит 16 бит,
т.е. в стек заносится 2 байта, а зна-
чит ЭР увеличивается на 2), а за-
тем заносят в РС значение нового
адреса из своего операнда. Коман-
да АСА1_1_ использует 11-битный
адрес в качестве операнда, а
1_СА1_1. - 16-битный. Так как РС
имеет размерность в 16 битов, то
для команды АСАН, недостающие
5 битов сохраняются от старого
значения РС. Две последние ко-
манды выполняют
не скол ько
иное
действие - они про-
сто
извл екаю т 2
байта из стека (при
этом значение ЭР
уменьшается на 2)
и помещают его в
РС.
Давайте внима-
тельно разберемся,
что именно проис-
ходит и как. Раз ко-
манды заносят в РС
новое значение ад-
реса, то нормаль-
ная последователь-
ность выполнения
программы Изменя-
ется. Принято счи-
тать, что команды
АСАи. и 1_СА1_1- осу-
щ ествляю т вызов
подпрограммы по
указанному в опе-
ранде адресу, хотя
на самом деле ника-
кого “вы зова”
не
1
п ро исходит - п росто
после выполнения
этой команды начинает исполнять-
ся не следующая команда, а та, ад-
рес которой получился в РС. Те-
перь программа выполняется “ в
другом месте” до тех пор, пока не
встретит команду RET или RETI,
которые называются командами
возврата из подпрограммы. Что же
произойдет? А вот что - в РС за-
несется значение из стека, соот-
ветствующее адресу команды,
сле-
дую щ ей
за ACALL (или LCALL -
смотря по тому, какая была исполь-
зована) - выполнение программы
пойдет старым путем. Поясню зто
следующим рисунком
(р и с. 4).
Рис. 4.
Пояснение принципа работы
подпрограмм
Таблица 8. Команды организации подпрограмм
№ п/п
М немоника
команды
Число машинных
циклов
Длина команды,
байт
Изменяемые флаги
PSW
1
АС A LL D11
2
2
2
LC A LL D16
2
3
3
RET
2
1
4
RETI
2
1
56
[] Радиолюбитель - 0 4 /2 0 0 7
предыдущая страница 56 Радиолюбитель 2007-05 читать онлайн следующая страница 58 Радиолюбитель 2007-05 читать онлайн Домой Выключить/включить текст