Микропроцессоры. Управляющие сигналы и принцип работы микропроцессоров, страница 15

            Часто в программах некоторые последовательности команд, выполняю­щие определенную функцию, встречаются несколько раз, но оперируют различ­ными данными. Такие последовательности можно оформить в макрокоманды и при необходимости использовать обращения к макрокоманде. Однако расшире­ния макрокоманд целиком включаются в программу и существенно увеличи­вают ее длину. Гораздо удобнее включить повторяющуюся последовательность в программу 1 раз, а в нужных точках вызывать ее для выполнения с текущими данными. Такая вызываемая последовательность команд, или своеобразная «программа в программе» называется подпрограммой.

            Подпрограмма представляет собой законченный сегмент (модуль) про­граммы, который может вызываться любое число раз. Достоинством подпро­грамм по сравнению с макрокомандами является сокращение длины программы и экономия программной памяти. Недостаток подпрограмм по сравнению с макрокомандами заключается в том, что вызов и возврат связаны с непроизво­дительными потерями времени микропроцессора.

            Вызов подпрограммы нарушает естественный порядок следования ко­манд. Из точки вызова управление следует передать первой команде подпро­граммы, затем обычным образом выполнить команды подпрограммы, а по ее завершении управление необходимо передать (возвратить) в точку вызова. Инициирование выполнения подпрограммы осуществляется путем указания ее имени в 3-байтной команде вызова CALL. Имя подпрограммы должно нахо­диться в поле метки первой ее команды. При выполнении команды CALL теку­щее содержание счетчика команд (адрес возврата) загружается в стек, а в счет­чик команд загружается адрес перехода — второй и третий байт команды CALL. После этого начинает выполняться первая команда подпрограммы, затем вторая и т. д. Заключительной командой каждой подпрограммы должна быть 1-байтная команда возврата RET, которая извлекает адрес возврата из стека и пе­редает его в счетчик команд. Следовательно, теперь будет выполняться ко­манда, находящаяся в вызываемой программе сразу после команды CALL. На­помним, что в системе команд микропроцессора КР580ВМ80 имеются 8 команд условного вызова и 8 команд условного возврата.

            Положительные качества подпрограмм в полной мере могут быть реали­зованы только при наличии для каждой подпрограммы четких спецификаций. В спецификациях необходимо указать:

            — где находятся данные, обрабатываемые подпрограммой;

            — где будут размещены результаты, полученные при выполнении под­программы;

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

            При программировании на языке ассемблера спецификация обычно вы­носится в строки комментария, образующие заголовок подпрограммы.

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

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

            1. Общие данные. Понятие общих данных относится к данным, храни­мым в тех ячейках памяти, к которым могут обращаться вызывающая про­грамма и подпрограмма.

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

            3. Область параметров. Третий способ — передача параметров через специально выделенную область ОЗУ, называемую областью параметров. Вы­зывающая программа до вызова подпрограммы записывает параметры в после­довательных ячейках области параметров. Затем начальный адрес области за­гружается в один из указателей памяти микропроцессора, чаще всего — в реги­стры H, L. Команда вызова CALL запоминает в стеке адрес возврата и передает управление первой команде подпрограммы. Информация о нахождении пара­метров доступна подпрограмме, так как регистры H, L адресуют начало области параметров. С помощью команд MOV R, M значения параметров считываются во внутренние регистры микропроцессора и обрабатываются подпрограммой. В качестве недостатка этого способа отметим необходимость выделения отдель­ной области параметров для каждой подпрограммы. Иногда передавать пара­метры в смежных ячейках памяти по каким-либо причинам неудобно. В таких случаях целесообразно применить передачу подпрограмме адресов параметров, оформленных в виде таблицы. Перед вызовом подпрограммы начальный адрес таблицы адресов загружается в регистры H, L. В подпрограмме адреса загружа­ются во внутренний указатель памяти, после чего производится считывание из памяти собственно значений параметров.

            Подпрограммы могут, например, использоваться для выполнения опре­деленных арифметических действий: сложения и вычитания, умножения и де­ления и т. д. В курсовом проекте используется подпрограмма умножения.