К. Хамахер, З. Вранешич, С. Заки - Организация ЭВМ - 5-е издание (2003) (1114649), страница 23
Текст из файла (страница 23)
Для выполнения каядой из этих операций указанной выше команды недостаточно — ее нужно заменить последовательностью команд, приведенной на рис. 2.23. Команда сравнения Сошраге згс,е)зг выполняет операцию (згс) — (сЬГ) и устанавливает флаги условий в соответствии с полученным результатом, Она не изменяет значения ни одного из операндов.
Еще одна полезная структура данных, очень похожая на стек, называется очередью. Данные помещаются в очередь и извлекаются из нее в порядке «первым вошел — первым вышель (Р1гзт 1п Г1гзт Оцц Р1ГО). Как правило, очередь растет в направлении увеличения адресов. В этом случае новые данные добавляются в ее конец, имеющий наибольший адрес, а извлекаются таковые из начала очереди, имеющего наименьший адрес. 96 Глава 2.
Машинные команды и программы Проверка того,не содержит лн указатель стека значение больше 2000, Если это так, значит, стек пуст, н осуществляется переход к подпрограмме ЕМРТУЕККОК, выполняющей соответствующее действие 5АРЕРОР Сошраге №2000,5Р ВгапсЬ>0 ЕМРТт'ЕККОК В противном случае элемент, расположенный на вершине стека, выталкивается, а затем помещается в память по адресу 1ТЕМ Моче (5Р)+,1ТЕМ 5АРЕР()5Н Сошраге ВгапсЬк0 №1500,5Р Р()(.(.ЕККОК Проверка того, не содержит ли указатель стека значение меньше нлн равное 1500.
Если содержит, значит, стек полон. В таком случае выполняется переход к подпрограмме Р()Ы ЕККОК, осуществляющей соответствующее действие ХЕ'йг1ТЕМ,— (5Р) В противном случае в стек помещается элемент, хранящийся в памяти по адресу ХЕч(Г1ТЕМ Моче Рис. 2.23. Контроль пустого и полного стеков при выполнении операций проталкивания и выталкивания элемента: выталкивание элемента иэ стека (в); помещение элемента в стек (б) Между способами реализации стека и очереди имеются два важных различия.
Один конец стека (его дно) зафиксирован, а другой перемещается то вверх то вниз по мере добавления и удаления данных. Для ссылки на вершину стека в каждый конкретный момент нужен один-единственный указатель. Иное дело— очередь. По мере добавления и удаления данных оба ее конца смещаются в направлении увеличения адресов. Поэтому приходится отслеживать местоположение обоих концов очереди, используя для этого два указателя. Второе различие между стеком и очередью состоит в том, что без дополнительного управления очередь будет постоянно смещаться в памяти компьютера в направлении увеличения адресов.
Один нз способов удержания ее в фиксированной области заключается в использовании так называемого циклического буфера. Предположим, очереди выделена область памяти от адреса ВЕС1ХХ1ХС до адреса ЕХР. Первый элемент помещается в очередь по адресу ВЕС1ХХ1ХС, а последующим поочередно добавляющимся элементам присваиваются возрастающие адреса. Когда 2.9. Подпрограммы 97 конец очереди достигнет адреса ЕЛЧ), в начале выделенной для нее области памяти может уже образоваться свободное пространство, поскольку время от времени какие-то элементы удаляются из очереди. В таком случае указателю конца очереди снова будет присвоен адрес ВЕС?МХ?Л?С, и процесс повторится. Как и в случае стека, при выполнении операций с очередью необходимо отслеживать моменты заполнения выделенной для нее области памяти и полной очистки очереди (см.
упражнения 2.18 и 2.19). 2.9. Подпрограммы Очень часто программа должна по многу раз выполнять определенную подзадачу, но с разными значениями данных. Такая подзадача обычно называется подпрограммой. Подпрограмма может, скажем, вычислять функцию зш или сортировать список в порядке возрастания или убывания значений. Составляющий такую подпрограмму блок команд можно включать во все те места программы, где он должен выполняться. Однако на практике так никогда не поступают.
Для экономии места в память помещают только одну копию блока команд, и любая программа, которой потребуется выполнить эту подпрограмму, просто переходит к ее начальному адресу. Такой переход называется вызовом подпрограммы и выполняется в помощью команды Са11. После реализации подпрограммы работа вызывающей ее программы должна быть продолжена. В таком случае говорят, что выполняется возврагл из подпрограммы в вызывающую программу. Делается зто с помощью команды Кегпгп. Поскольку подпрограмма может вызываться из нескольких разных мест основной программы, при ее вызове где-то должен сохраняться адрес возврата. Иными словами, для обеспечения правильного возврата из подпрограммы команда Сай должна сохранить содержимое регистра РС.
Применяемый компьютером способ выполнения вызовов подпрограмм и возврата из таковых называется методом связывания подпрограмм. Простейший метод связывания подпрограмм заключается в сохранении адреса возврата в заданном месте, которым может быть специально выделенный для этого регистр. Такой регистр называется регистром связи. Когда работа подпрограммы завершается, команда Кетпгп возвращает управление вызывающей программе, выполняя неявный переход через регистр связи.
Особой разновидностью команды перехода является команда Са!1, выполняющая такие операции, как сохранение содержимого регистра РС в регистре связи и переход по указанному в команде целевому адресу. Команда Кегпгп также является разновидностью команды перехода, но она выполняет переход по адресу, заданному в регистре связи. Этот процесс проиллюстрирован на рис. 2.24. 98 Глава 2. Машинные команды и программы Вызывающая подпрограмма Подпрограмма БПВ Адрес в памяти Адрес в памяти 200 Са11 Я??В оооо Первая команда 204 Следующая команда я — 1 Кето гп 1000 Регистр связи Кегпгп Рис.
2.24. Связывание подпрограммы через регистр связи 2.9.1. Вложенность подпрограмм и стек процессора В программировании очень распространена практика вызова одних подпрограмм из других. Такие подпрограммы, вызываемые друг из друга, называются вложенными. Если вложенные вызовы будут реализованы по описанной выше технологии, вторая команда Са11 сохранит адрес возврата в регистре связи, уничтожив его текущее содержимое, после чего возврат в исходную программу станет не возможным.
Поэтому перед вызовом очередной подпрограммы нужно где-то сохранять содержимое регистра связи. Теоретически подпрограммы могут вкладываться на любую глубину. Рано или поздно последняя вызванная подпрограмма завершит свою работу и вернет управление вызвавшей ее подпрограмме. Необходимый для этого адрес возврата — это последний адрес, сохраненный в данной цепочке вызовов подпрограмм. Иными словами, адреса возврата сохраняются и используются в порядке ?.?РО (?азг ?и Р?гзг Оцц что в переводе с английского значит япоследним вошел — первым вышелз).
Очевидно, что адреса возврата, связанные с вызовами подпрограмм, должны помещаться в стек. Многие процессоры делают это автоматически, как часть работы команды СаЦ. Для использования в качестве указателя стека (ЯР) вызовов подпрограмм выделяется отдельный регистр, именуемый стлеком процессора. Команда Са11 помещает в стек процессора содержимое регистра РС, а команда Кеьцгп вьпалкивает из этого стека адрес возврата и помещает его в РС. 2.9. Подпрограммы аа 2.9.2. Передача параметров Вызывающая программа Моче Моче СаП Моче Х,К1 К1 играет роль счетчика ЗХРМ1,К2 К2 указывает на последовательность Р1 СТАРР Вызов подпрограммы КО,Я1М Сохранение результата Подпрограмма 1.!СТАРР С1еаг 1.0 0Р АгЫ Ресгетцепг ВгапсЬ>О Кеьцтп Инициализация суммы значением О Добавление числа из последовательности КО (К2)ч-,КО К1 1.ООР Возврат в вызывающую программу Рис.
2.25. Программа, представленная на рис. 2пб, реализованная как подпрограмма; параметры передаются через регистры Если у подпрограммы много параметров, для их передачи может просто не хватить регистров общего назначения. С другой стороны, стек — структура гибкая, в него можно поместить много параметров. Следующий пример показывает, как выполняется передача параметров через стек. На рис.
2.26, а приведена та же програьтма, что и на рис. 2.16, но реализованная в виде подпрограммы Е15ТАРР. Любая другая программа может вызвать указанную подпрограмму для сложения Вызывая подпрограмму, программа должна передать ей параметры (операнды), которые будут использоваться в вычислениях, или же их адреса. Закончив свою работу, подпрограмма вернет другие параметры — результаты вычислений. Такой обмен информацией между вызывающей программой и подпрограммой называется передачей ларамалров. Передача параметров может выполняться несколькимн способами. Например, параметры можно помещать в регистры или в память, откуда подпрограмма сможет их считать.
В качестве альтернативы параметры можно поместить в стек процессора, используемый для хранения адресов возврата. Использование регистров процессора — способ простой и аффективный. На рис. 2.25 показано, как реализовать программу, представленную на рис. 2.16 (выполняет сложение последовательности чисел), в виде подпрограммы с передачей параметров через регистры. Длина последовательности п, информация о которой хранится в памяти по адресу Х, и адрес первого числа, ХПМ1, передаются подпрограмме через регистры К1 и К2.
Вычисленная подпрограммой сумма возвращается вызывающей программе через регистр КО. Соответствующую часть вызывающей программы составляют первые четыре команды из числа представленных на рис. 2.25. Первые две команды загружают в регистры К1 и К2 значения Х и ХПМ1.
Команда Са11 выполняет переход к подпрограмме, начинающейся по адресу Е1ЯТАЭР, Кроме того, зта команда помещает в стек процессора адрес возврата из подпрограммы. Подпрограмма вычисляет сумму и помещает ее в регистр КО. После возврата из подпрограммы вызывающая программа сохраняет зту сумму в памяти по адресу 50М.