Подпрограммы

Любую программу можно превратить в подпрограмму, пометив ее первую команду или точку входа и поставив в конце программы команду RETURN (ВОЗВРАТ). Главная программа может вызывать подпрограмму и так устанавливать указатель стека, чтобы обеспечить правильное сохранение адресов возврата.

Однако если подпрограмму написать специальным образом, то ею будет удобнее пользоваться и не возникает йикаких ограничений на размещение ее в памяти. В простейшем случае главная программа перед обращением к подпрограмме размещает исходные данные и адреса в регистрах; подпрограмма, в свою очередь, помещает полученные результаты в регистры. Данные и адреса, которые требуются подпрограмме, называются параметрами; процесс, делающий параметры доступными подпрограмме, называется переданей параметров. Для работы более сложных подпрограмм может потребоваться слишком много параметров, чтобы их можно было разместить в доступных регистрах.

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

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

Программу преобразования из кода ASCII в десятичный (см. пример 11) удобно оформить в виде подпрограммы. Очевидно, что для любой программы, которая вводит числа с телетайпа, требуется такое преобразование. Чтобы превратить рассмотренные в предыдущих примерах программы в подпрограммы, достаточно присвоить метку первой команде (например, ASDEC) и заменить последнюю команду на ВОЗВРАТ (RET в МП Intel 8080 или RTS в МП Motorola 6800). Модифицированные соответствующим образом программы для МП Intel 8080 и МП Motorola 6800 оформлены в виде примера 13.

пример 13. Подпрограмма преобразования из кода ASCII в десятичный простейший вариант. Motorola 6800 пример 13

Простейшая подпрограмма преобразования из кода ASCII в десятичный

лавная программа должна поместить исходные данные в ячейку 40, вызвать подпрограмму и интерпретировать полученный результат. Пример 14 иллюстрирует, как происходит обращение к подпрограмме. В МП Motorola 6800 имеются две команды вызова подпрограммы: BSR, использующая относительную адресацию, и JSR, использующая прямую (16-битный адрес) адресацию или индексированную адресацию. В МП Intel 8080 имеются как безусловная, так и условная форма команды CALL и команды RETURN.

Пример 14. Обращение к простейшей подпрограмме преобразования из кода ASCII в десятичный. Motorola 6800 пример 14

Обращение к простейшей подпрограмме преобразований из кода ASCII в десятичный

Поскольку команды CALL и JSR помещают адрес возврата в стек, главная программа должна правильно установить значение указателя стека. В МП Motorola 6800 эта операция выполняется по команде LDS (ЗАГРУЗИТЬ УКАЗАТЕЛЬ СТЕКА); в Intel 8080 ее можно выполнить либо по команде LXI SP (ЗАГРУЗИТЬ В УКАЗАТЕЛЬ СТЕКА НЕПОСРЕДСТВЕННЫЙ ОПЕРАНД), либо по команде SPHb (ПЕРЕСЛАТЬ Н и L В УКАЗАТЕЛЬ СТЕКА). Обычно стек располагается в старших адресах оперативной памяти. Если, например, оперативная память системы занимает адреса от 10001в до 13FF16, то начальное значение указателя стека обычно устанавливают равным 1400 для МП Intel 8080 или 13FF для Motorola 6800.

Если при обращении к подпрограмме для передачи параметров и результатов используются регистры, то отпадает необходимость выбирать данные из памяти и посылать их в память. Такую подпрограмму, как преобразование символа из кода ASCII в десятичный, легко модифицировать, так как для ее выполнения требуется передача одного входного параметра и она возвращает в вызывающую программу один выходной параметр. Модифицированные подпрограммы и обращение к ним иллюстрируются в примере 15. Организация передачи параметров поясняется комментариями. 

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

Пример. 15. Модифицированный вариант подпрограммы преобразования из кода ASCII в десятичный. Motorola 6800 пример 15

Модифицированный вариант преобразования из кода ASCII в

десятичный *

* Подпрограмма ASDEC преобразует

* символ ASCII из аккумулятора А

* в десятичную цифру в аккумуляторе А.

* Если в аккумуляторе был не цифровой символ ASCII,

* то ASDEC помещает в аккумулятор А код FF,

* Используемые регистры: А.

ASDEC SUB А #'0 Вычесть 0 в коде ASCII

СМРА # 10 Результат меньнге 10?

BCS DONE Да, преобразование сделано

LDAA #$FF Нет, уста-невите признак ошибки DONE RTS

* Пример обращения к подпрограмме

LDAA ASDAT Загрузить символ ASCII

JSR ASDEC Преобразовать в десятичный

СМРА #$FF Ошибка?

BEQ ERROR Да, переход к процедуре обработки ошибок


 



Как оплатить жку через интернет ростов telecombg.ru/uslugi/internet/.