Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вопросы с ответами ЯП.docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
231.17 Кб
Скачать

14) Организация подпрограмм (на примере е97)

Подпрограммы (вспомогательные алгоритмы) целесообразно использовать в тех случаях, когда исходная задача является достаточно сложной, а ее решение — громоздким. Тогда разумно выделить в ней отдельные подзадачи, решение каждой из которых оформить в виде подпрограммы. Еще более естественным является использование подпрограмм в тех случаях, когда некоторый фрагмент программы повторяется.

При обращении к подпрограммам в E97 используется стек — структура данных, организованная по принципу "последний пришел — первый ушел". Стек позволяет по окончанию работы подпрограммы обеспечить возврат в ту точку основной программы, которая следует сразу же за вызовом подпрограммы. При обращении к вспомогательному алгоритму адрес в указателе стека (SP) уменьшается на 2, по вновь полученному адресу записывается адрес, следующий за вызовом подпрограммы. Подпрограмма исполняется, и когда встречается команда возврата (0D00), в счетчик команд помещается адрес, на который указывает SP, значение SP увеличивается на 2. Таким образом исполнение основной программы продолжается.

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

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

Следует заметить, что регистр SP может быть использован не только при работе с подпрограммами, но и для промежуточного хранения величин.

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

Продемонстрируем это на классическом примере рекурсивного алгоритма — вычислении факториала натурального числа. С одной стороны, n! определяется как произведение последовательных натуральных чисел от 1 до n включительно. С другой стороны это и есть рекурсивное определение факториала, которым мы воспользуемся.

План решения

1. Сравнить n с 0.

2. Если n=0, переход к п. 7.

3. Запомнить n в стеке; n:=n-1.

4. Вызов п/п вычисления факториала.

5. F:=F*n.

6. Переход к п. 1.

7. F:=1.

8. Возврат из п/п.

Распределение памяти

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

Адрес Команда Действие Замечания

0070 2400 сравнить R0 c 0 n-0

0072 5D0E если равно 0, переход переход на F:=1

0074 0E20 n => стек

0076 2310 R0 := R0 - 1 n := n - 1

0078 9C0D переход к п/п

007A 0010 вычисления факториала

007C 0E30 стек => R0 n => R0

001E 0501 R1 := R1 * R0 F := F * n

0020 1D02 переход к возврату из п/п

0022 2111 1 => R1 F :=1

0024 0D00 возврат из п/п

Распределение памяти

Основная программа

Адрес Команда Действие

0000 0E6D Установка указателя

0002 00FE стека SP на адрес 00FE

0004 9C0D вызов п/п

0006 0010 вычисления факториала

0008 0F00 стоп

Тест. n=7; F=5040(10)=13B0(16). \vskip2mm