Часто в программах некоторые последовательности команд, выполняющие определенную функцию, встречаются несколько раз, но оперируют различными данными. Такие последовательности можно оформить в макрокоманды и при необходимости использовать обращения к макрокоманде. Однако расширения макрокоманд целиком включаются в программу и существенно увеличивают ее длину. Гораздо удобнее включить повторяющуюся последовательность в программу 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. В подпрограмме адреса загружаются во внутренний указатель памяти, после чего производится считывание из памяти собственно значений параметров.
Подпрограммы могут, например, использоваться для выполнения определенных арифметических действий: сложения и вычитания, умножения и деления и т. д. В курсовом проекте используется подпрограмма умножения.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.