русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Команды для языков с блочной структурой


Дата добавления: 2015-06-12; просмотров: 482; Нарушение авторских прав


Эти команды обеспечивают поддержку машинно-ориентированным языком языков с блочной структурой, таких, как Cи или Паскаль. Они включают в себя команды ENTER и LEAVE, которые упрощают вход в процедуру и выход из нее в созданном компилятором коде. Они поддерживают структуру указателей (пойнтеров) и локальных переменных в стеке, называемую кадром стека. ENTER (Вход в процедуру) создает кадр стека, совместимый с контекстными правилами языков с блочной структурой. В этих языках процедура имеет доступ к своим собственным переменным и некоторому количеству других переменных, определенных где-либо еще в программе. Контекстом процедуры называется множество переменных, к которым процедура имеет доступ. Правила контекста различны для разных языков; они могут основываться на вложенности процедур, на делении программы на отдельно скомпилированные файлы или на некоторых других схемах подразделения на модули. Команда ENTER имеет два операнда. Первый операнд указывает на количество байт, которое должно быть зарезервированно в стеке для динамического хранения данных в процедуре, в которую будет осуществлен вход. Динамическим хранением называется память, отведенная для переменных, создаваемых в тот момент, когда процедура вызвана, известных также, как автоматические переменные. Второй параметр является лексическим уровнем вложенности (от 0 до 31) процедуры. Уровень вложенности - это глубина процедуры в иерархии блочно-структурированной программы. Лексический уровень не имеет никакого отношения ни к уровню привилегированности защиты, ни к уровню привилегированности Ввода/Вывода. Лексический уровень вложенности определяет число указателей кадров стека, которые надо скопировать в новый кадр стека из предыдущего кадра. Указателем на кадр стека является двойное слово, используемое для доступа к переменным процедуры. Множество указателей на кадры стека, используемых процедурой для доступа к переменным других процедур, называется отображением (данных). Первое двойное слово в отображении является указателем на предыдущий кадр стек. Этот указатель используется командой LEAVЕ для аннулирования результата действий команды ENTER путем отмены текущего кадра стека.
Пример : ENTER 2048,3 .Зарезервировать 2Кбайт динамической памяти в стеке и установить указатели на два предыдущих кадра стека в кадре стека для этой процедуры.
После того, как команда ENTER создаст отображение для процедуры, она размещает динамические (автоматические) локальные переменные для данной процедуры путем уменьшения содержимого регистра ESP на количество байт, заданное в первом параметре. Это новое значение регистра ESP служит в качестве начального значения верхушки стека для всех операций PUSH и POP внутри процедуры. Для того, чтобы позволить процедуре адресовать (обращаться) к своему отображению, команда ENTER предоставляет регистру EBP указывать на первое двойное слово в отображении. Так как стеки увеличиваются вниз, это действительно двойное слово с самым старшим адресом в отображении. Команды работы с данными, которые указывают регистр EBP в качестве базового регистра, автоматически адресуют позиции внутри сегмента стека вместо сегмента данных. Команда ENTER может быть использована двумя способами: вложенным и не вложенным. Если лексический уровень равен 0, используется не вложенная форма. Не вложенная форма сохраняет содержимое регистра EBP в стеке, копирует содержимое регистра ESP в регистр EBP и вычитает первый операнд из содержимого регистра ESP, для того, чтобы разместить динамическую память. Не вложенная форма отличается от вложенной тем, что не копируются никакие указатели на кадры стека. Вложенная форма команды ENTER появляется тогда, когда второй параметр (лексический уровень) не равен нулю. Рисунок 3-15 показывает определения форматов команды ENTER. STORAGE - это количество байт динамической памяти для размещения локальных переменных, и LEVEL - это лексический уровень вложенности. Главная процедура (в которую вложены все остальные процедуры) работает на самом старшем лексическом уровне, уровне 1. Следующая процедура, которую она вызывает, работает на более глубоком лексическом уровне, уровне 2. Процедура уровня 2 может получать доступ к переменным главной процедуры, которые находятся в зафиксированном положении, указанном компилятором. В случае уровня 1 команда ENTER резервирует только запрошенную динамическую память в стеке, так как нет никаких предыдущих отображений, которые следовало бы скопировать.



+--------------------------------------------------------------+| || Сохранить EBP || Установить временное значение || FRAME_PTR равным ESP || IF LEVEL = 0, то || Повторять (LEVEL - 1) раз || EBP := EBP -4 || Сохранить в стеке двойное || слово, на которое указывает EBP || Конец повтора || Восстановить FRAME_PTR || END IF || EBP := FRAME_PTR || ESP := ESP - STORAGE || |+--------------------------------------------------------------+ Рисунок 3-15. Определение формата команды ENTER.

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

Команда ENTER интерпретирует реентерабельную процедуру как вызов процедуры на том же лексическом уровне. В этом случае каждая следующая итерация реентерабельной процедуры может адресоваться только к своим собственным переменным и переменным процедур, внутри которых она вложена. Реентерабельная процедура всегда может адресовать свои собственные переменные; ей не требуется для этого указателей на кадры стека предыдущих итераций. Путем копирования только указателей на кадры стека процедур на более высоких лексических уровнях команда ENTER добивается того, что процедуры получают доступ только к переменным более высоких лексических уровней, но не к переменным параллельных лексических уровней (смотри Рисунок 3-16).

+-------------------------------------------------------------+| || || +-----------------------------------------------------+ || | ГЛАВНАЯ ПРОГРАММА (УРОВЕНЬ 1) | || | +-----------------------------------------------+ | || | | ПРОЦЕДУРА А (УРОВЕНЬ 2) | | || | | +-------------------------------------------+ | | || | | | ПРОЦЕДУРА B (УРОВЕНЬ 3) | | | || | | +-------------------------------------------+ | | || | | | | || | | +-------------------------------------------+ | | || | | | ПРОЦЕДУРА C (УРОВЕНЬ 3) | | | || | | | +-------------------------------------+ | | | || | | | | ПРОЦЕДУРА D (УРОВЕНЬ 4) | | | | || | | | +-------------------------------------+ | | | || | | | | | | || | | +-------------------------------------------+ | | || | | | | || | +-----------------------------------------------+ | || | | || | | || +-----------------------------------------------------+ || || |+-------------------------------------------------------------+ Рисунок 3-16. Вложенные процедуры.

Языки программирования с блочной структурой могут использовать лексический уровень вложенности, определенный командой ENTER, для управления доступом к переменным вложенных процедур. На рисунке, например, если ПРОЦЕДУРА A вызывает ПРОЦЕДУРУ B, которая, в свою очередь, вызывает ПРОЦЕДУРУ C, тогда ПРОЦЕДУРА C получит доступ к переменным ГЛАВНОЙ ПРОГРАММЫ и ПРОЦЕДУРЫ A, но не к переменным ПРОЦЕДУРЫ C, так как они расположены ма одном и том же лексическом уровне. Следующее определение описывает доступ к переменным для вложенных процедур на Рисунок 3-16 :

  1. ГЛАВНАЯ ПРОГРАММА имеет переменные на фиксированных позициях.
  2. ПРОЦЕДУРА A может получать доступ к переменным только ГЛАВНОЙ ПРОГРАММЫ.
  3. ПРОЦЕДУРА B может получить доступ только к переменным ПРОЦЕДУРЫ A и ГЛАВНОЙ ПРОГРАММЫ. ПРОЦЕДУРА B не может получить доступ к переменным ПРОЦЕДУРЫ C или ПРОЦЕДУРЫ D.
  4. ПРОЦЕДУРА C может получить доступ только к переменным ПРОЦЕДУРЫ A и ГЛАВНОЙ ПРОГРАММЫ. ПРОЦЕДУРА C не может получить доступ к переменным ПРОЦЕДУРЫ B или ПРОЦЕДУРЫ D.
  5. ПРОЦЕДУРА D может получить доступ к переменным ПРОЦЕДУРЫ C, ПРОЦЕДУРЫ A и ГЛАВНОЙ ПРОЦЕДУРЫ. ПРОЦЕДУРА D не может получить доступ к переменным ПРОЦЕДУРЫ B.

На следующей диаграмме команда ENTER в начале ГЛАВНОЙ программы создает три двойных слова динамической памяти для ГЛАВНОЙ программы, но не копирует никаких указателей из других кадров стека (смотри Рисунок 3-17). Первое двойное слово в отображении содержит копию последнего значения регистра EBP перед тем, как была выполнена команда ENTER. Второе двойное слово (которое, так как стек растет вниз, хранится по младшему адресу) содержит копию содержимого регистра EBP следом за выполнением команды ENTER. После того, как команда была выполнена, регистр EBP указывает на первое двойное слово, сохраненное в стеке, и регистр ESP указывает на последнее двойное слово в кадре стека.

+-------------------------------------------------------------+| || || +----------------------------+ || +----------------------------| || +----------------------------| || +---| СТАРОЕ EBP |--EBP || ОТОБРАЖЕНИЕ | +----------------------------| || +---| EBP из ГЛАВНОЙ программы | || +----------------------------| || +---| | || ДИНАМИЧЕСКАЯ | +----------------------------| || ПАМЯТЬ | +----------------------------| || +---| |--ESP || +----------------------------| || +----------------------------| || +----------------------------+ || || |+-------------------------------------------------------------+ Рисунок 3-17. Стек данных после запуска ГЛАВНОЙ программы.

Когда ГЛАВНАЯ программа вызывает ПРОЦЕДУРУ А, команда ENTER создает новое отображение (смотри Рисунок 3-18). Первое двойное слово - последнее значение, содержавшееся в регистре EBP ГЛАВНОЙ программы. Второе двойное слово - указатель на кадр стека ГЛАВНОЙ программы, который скопирован из второго двойного слова отображения в ГЛАВНОЙ программе. Это слово в данной ситуации является другой копией последнего значения, содержавшегося в регистре EBP в ГЛАВНОЙ программе. ПРОЦЕДУРА А может получить доступ к переменным ГЛАВНОЙ программы, так как ГЛАВНАЯ программа находится на уровне 1. Более того, базовый адрес динамической памяти, используемой в ГЛАВНОЙ программе, является текущим адресом в регистре EBP плюс четыре байта дополнительно для сохраненного содержимого регистра EBP в ГЛАВНОЙ программе. Все динамические переменные для ГЛАВНОЙ программы находятся на фиксированном положительном смещении относительно этого значения.

+-------------------------------------------------------------+| || || +----------------------------+ || +----------------------------| || +----------------------------| || | СТАРОЕ EBP | || +----------------------------| || | EBP из ГЛАВНОЙ программы | || +----------------------------| || +----------------------------| || +----------------------------| || +----------------------------| || +---| EBP из ГЛАВНОЙ программы |--EBP || | +----------------------------| || ОТОБРАЖЕНИЕ | | EBP из ГЛАВНОЙ программы | || | +----------------------------| || +---| EBP из ПРОЦЕДУРЫ А | || +----------------------------| || +---| | || ДИНАМИЧЕСКАЯ | +----------------------------| || ПАМЯТЬ | +----------------------------| || +---| |--ESP || +----------------------------| || +----------------------------| || +----------------------------+ || || |+-------------------------------------------------------------+ Рисунок 3-18. Стек данных после запуска ПРОЦЕДУРЫ А

Когда ПРОЦЕДУРА А вызывает ПРОЦЕДУРУ B, команда ENTER создает новое отображение (смотри Рисунок 3-19). Первое двойное слово содержит копию последнего значения регистра EBP в ПРОЦЕДУРЕ А. Второе и третье двойные слова являются копиями двух указателей на кадр стека в отображении в ПРОЦЕДУРЕ А. ПРОЦЕДУРА B может получать доступ к переменным ПРОЦЕДУРЫ А и ГЛАВНОЙ программы путем использования указателей на кадры стека в своем отображении.

+-------------------------------------------------------------+| || || +----------------------------+ || +----------------------------| || +----------------------------| || | СТАРОЕ EBP | || +----------------------------| || | EBP из ГЛАВНОЙ программы | || +----------------------------| || +----------------------------| || +----------------------------| || +----------------------------| || | EBP из ГЛАВНОЙ программы | || +----------------------------| || | EBP из ГЛАВНОЙ программы | || +----------------------------| || | EBP из ПРОЦЕДУРЫ А | || +----------------------------| || +----------------------------| || +----------------------------| || +----------------------------| || +---| EBP из ПРОЦЕДУРЫ А |--EBP || | +----------------------------| || | | EBP из ГЛАВНОЙ программы | || ОТОБРАЖЕНИЕ | +----------------------------| || | | EBP из ПРОЦЕДУРЫ А | || | +----------------------------| || +---| EBP из ПРОЦЕДУРЫ B | || +----------------------------| || +---| | || ДИНАМИЧЕСКАЯ | +----------------------------| || ПАМЯТЬ | +----------------------------| || +---| |--ESP || +----------------------------| || +----------------------------| || +----------------------------+ || || |+-------------------------------------------------------------+ Рисунок 3-19. Стек данных после запуска ПРОЦЕДУРЫ B

Когда ПРОЦЕДУРА B вызывает ПРОЦЕДУРУ С, команда ENTER создает новое отображение для ПРОЦЕДУРЫ С (смотри Рисунок 3-20). Первое двойное слово содержит копию последнего значения регистра EBP в ПРОЦЕДУРЕ B. Оно будет использовано командой LEAVE для восстановления кадра стека ПРОЦЕДУРЫ B. Второе и третье двойные слова являются копиями указателей кадров стека в отображении ПРОЦЕДУРЫ А. Если ПРОЦЕДУРА С находится на лексическом уровне следующей глубины по отношению к ПРОЦЕДУРЕ B, четвертое двойное слово будет скопировано, и оно будет указателем на кадр стека для локальных переменных ПРОЦЕДУРЫ B.

+-------------------------------------------------------------+| || || +----------------------------+ || +----------------------------| || +----------------------------| || | СТАРОЕ EBP | || +----------------------------| || | EBP из ГЛАВНОЙ программы | || +----------------------------| || +----------------------------| || +----------------------------| || +----------------------------| || | EBP из ГЛАВНОЙ программы | || +----------------------------| || | EBP из ГЛАВНОЙ программы | || +----------------------------| || | EBP из ПРОЦЕДУРЫ А | || +----------------------------| || +----------------------------| || +----------------------------| || +----------------------------| || | EBP из ПРОЦЕДУРЫ А | || +----------------------------| || | EBP из ГЛАВНОЙ программы | || +----------------------------| || | EBP из ПРОЦЕДУРЫ А | || +----------------------------| || | EBP из ПРОЦЕДУРЫ B | || +----------------------------| || +----------------------------| || +----------------------------| || +----------------------------| || +---| EBP из ПРОЦЕДУРЫ B |--EBP || | +----------------------------| || | | EBP из ГЛАВНОЙ программы | || ОТОБРАЖЕНИЕ | +----------------------------| || | | EBP из ПРОЦЕДУРЫ А | || | +----------------------------| || +---| EBP из ПРОЦЕДУРЫ B | || +----------------------------| || +---| | || ДИНАМИЧЕСКАЯ | +----------------------------| || ПАМЯТЬ | +----------------------------| || +---| |--ESP || +----------------------------| || +----------------------------| || +----------------------------+ || || |+-------------------------------------------------------------+ Рисунок 3-20. Стек данных после запуска ПРОЦЕДУРЫ C

Обратите внимание, что ПРОЦЕДУРА B и ПРОЦЕДУРА С находятся на одном и том же уровне, поэтому для ПРОЦЕДУРЫ С не предполагается доступ к переменным ПРОЦЕДУРЫ B. Это не означает, что ПРОЦЕДУРА С полностью изолирована от ПРОЦЕДУРЫ B; ПРОЦЕДУРА С вызывается ПРОЦЕДУРОЙ B, поэтому указатель на возвращаемый кадр стека является указателем на кадр стека ПРОЦЕДУРЫ B. В дополнение к этому ПРОЦЕДУРА B может передавать параметры в ПРОЦЕДУРЫ С как через стек, так и через переменные, глобальные по отношению к обоим процедурам (т.е. переменные сферы действия обоих процедур).

LEAVE (Выйти из процедуры) противоположна по действию описанной перед ней команде ENTER. Команда LEAVE не имеет операндов. Команда LEAVE копирует содержимое регистра EBP в регистр ESP для того, чтобы освободить все стековое пространство, зарезервированное для процедуры. Затем команда LEAVE восстанавливает старое значение регистра EBP из стека. Одновременно восстанавливается исходное значение регистра ESP. Следующая команда RET затем может удалить любые аргументы и адреса возврата, сохраненные в стеке вызываемой программой для использования в процедуре.



<== предыдущая лекция | следующая лекция ==>
Команды работы со строками | Команды пересылки флага.


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.12 сек.