Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OtvetyGOS_1_60.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
2 Мб
Скачать
☆
  1. Операції звертання до підпрограм. Способи організації підпрограм. Організація динамічного розподілу пам'яті для підпрограм і їхніх даних.

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

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

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

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

Для обращения к подпрограмме и возврата из неё в систему команд микропроцессоров вводят специальные команды. В микроконтроллерах семейства MCS-51 это команды LCALL, ACALL для вызова подпрограммы и команда RET для возврата из подпрограммы. Эти команды не только осуществляют передачу управления на указанный адрес, но и запоминают адрес команды, следующей за командой вызова подпрограммы. Команда возврата из подпрограммы RET передаёт управление команде, адрес которой был запомнен командой вызова подпрограммы.

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

Ячейки памяти, в которых хранятся адреса возврата из подпрограмм называются стеком. Логически эти ячейки памяти организованы так, чтобы считывание последнего записанного адреса производилось первым, а первого записанного адреса производилось последним. Такая логическая организация формируется специальным счётчиком. Этот счётчик называется указателем стека SP. Ячейка памяти, в которую в данный момент может быть записан адрес возврата из подпрограммы, называется вершиной стека. Количество ячеек памяти, предназначенных для организации стека, называется глубиной стека. Последняя ячейка памяти, в которую можно производить запись называется дном стека. Логическая организация стека приведена на следующем рисунке:

Организация подпрограмм (модулей), описанная в предыдущих разделах, выглядит довольно стройной. Но у нее есть существенный недостаток - каждый модуль рассчитан на то, что он занимает определенное место в памяти. Современные библиотеки стандартных подпрограмм ( не считая подпрограмм, разрабатываемых лишь для включения в состав одной или немногих программ) насчитывают, как правило, сотни модулей. Их общий объем намного превышает объем оперативной памяти. Если даже учесть, что каждая программа использует во время своей работы лишь небольшую часть библиотеки и что использование некоторых комбинаций модулей в одной программе очень маловероятно, то и тогда оказывается практически невозможным выбрать для каждого модуля свое неизменное место в памяти, на которое не претендовал бы ни один из совместно работающих с ним модулей. ля организации подпрограмм, допускающих любое количество операторов, используется подпрограмма-функция. Результат выполнения подпрограммы присваивается ее имени.

Для организации подпрограмм большинство ЭВМ используют аппаратно поддерживаемую структуру данных, называемую стеком. Стек - это структура данных, организованная по принципу: последним вошел - первым вышел, т.е. последние записанные в стек данные извлекаются из него первыми.

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

Динамическое распределение памяти осуществляется между программами в ходе самого вычислительного процесса. Динамическое распределение памяти позволяет математику-вычислителю считать, что в его распоряжении имеется большая оперативная память, количество ячеек которой ограничено только разрядностью адресной части команды ( если имеются ВЗУ - достаточной емкости) или емкостью ОЗУ и ВЗУ вместе. Такую память, предоставляемую программисту за счет работы управляющей программы, принято называть виртуальной ( кажущейся), так как в любой момент времени только часть информации, хранящейся в виртуальной памяти, может быть размещена в реальной оперативной памяти. Динамическое распределение памяти обычно осуществляется в результате применения сочетания двух подходов: аппаратного и программного. Динамическое распределение памяти требует сложной управляющей программной системы, но повышает эффективность использования процессора и значительно облегчает работу программиста. Динамическое распределение памяти состоит в назначении адресов для размещения данных в процессе исполнения программы. С этой целью транслятор включает в объектную программу специальные команды, обеспечивающие перераспределение памяти в ходе исполнения программы. Динамическое распределение памяти обеспечивает свободное перемещение массивов программ и данных. При этом каждая программа имеет в своем распоряжении большой непрерывный массив ячеек памяти независимо от участия в работе системы других программ. Вместе с тем в памяти ЭВМ исключается дублирование массивов, общих для всех программ. олностью динамическое распределение памяти позволяет иметь единственную сплошную область памяти для всех описанных и рабочих переменных, массивов и процедур программы, а также обеспечивает относительно простой способ обработки рекурсивных процедур. С другой стороны, современные машины обычно имеют несколько индексных регистров, которые существенно облегчают динамическое перераспределение памяти при исполнении программы. По этим причинам на современных машинах часто используют именно динамическое распределение памяти.

Наиболее эффективно динамическое распределение памяти осуществляется в системах виртуальной памяти со страничной или сегментной организацией.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]