Распределение памяти. ?дрес Команда Действие Замечания 0034 ' 0301 ' = ВЛ - 2 ' Адрес 1
Тесты: \.т = 400О0)= 190об), п = 420О0) = 1А4(16); 8ит = 2440(Ш) = 988(|б). 2. т = ЮОО(10) = ЗЕ8(]6), п = ЮЗО(10) = 406(16); 8иш = Ю140(10)= 279С, Программа
Примечание. Расчет переходов предлагаем читателю проделать самостоятельно. На примере данной задачи рассмотрим более подробно механизм обращения к подпрограмме. По схеме можно проследить, как осуществляются переход к вспомогательному алгоритму и возврат в вызывающую программную единицу. Программа
Программа 0000... 0026 Вызов п/п 0028 0080 -— 002А... Подпрограмма 0080... 00А0 Вызов п/п 00А2 0070 ------- 00А4... «— Подпрограмма —► 0070... ^— 007С Возврат из п/п
" 00С8 Возврат из п/п Рассмотрим, как изменяется содержание регистра — указателя стека 8Р и памяти по тем адресам, на которые указывает 8Р, во время исполнения программы. Начальный адрес в 8Р — 00РЕ(, 6).
До вызова первой п/п 8Р: 00РЕ После вызова первой п/п 8Р: 00РС 00РС: 002А После вызова второй п/п 5Р: 00РА 00РА: 00А4 00РС: 002А После возврата из второй п/п 8Р: 00РС 00РС: 002А После возврата из первой п/п 8Р: (ЮРЕ
Следует заметить, что регистр 8Р может быть использован не только при работе с подпрограммами, но -и для промежуточного хранения величин. Заметим также, что подпрограммы могут обращаться и сами к себе — прямо или косвенно (через другие подпрограммы). Подпрограмма, вызывающая себя, называется рекурсивной. Пример 10. Продемонстрируем это на классическом примере рекурсивного алгоритма — вычислении факториала натурального числа. С одной стороны, п\ определяется как произведение последовательных натуральных чисел от 1 до п включительно. ^ и Г1, если п = 0, С другой стороны, п! = \ \ п • (п - 1)!, если п > 0. Это и есть рекурсивное определение факториала, которым мы воспользуемся. План решения: 1. Сравнить п с 0. 3. Запомнить п в стеке; п\~ п~ 1. 5. Р: = Р* п. 7. Р: = 1. Распределение памяти 2. Если /2=0, переход к п. 7. 4. Вызов п/п вычисления факториала. 6. Переход к п. 1. 8. Возврат из п/п.
|