русс | укр

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

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

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

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


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

Управление стеком для передачи управления


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


Поскольку управление стеком различается для 16-разрядных и 32-разрядных команд CALL и RET, размер операнда в команде RET должен соответствовать размеру операнда в команде CALL. (Смотри Рисунок 24-1). 16-разрядная команда CALL заносит в стек содержимое 16-разрядного регистра IP и (для вызовов между разными уровнями привилегированности) 16-разрядного регистра SP. Соответствующая команда RET также должна использовать 16-разрядный операнд для выборки этого 16-разрядного значения из стека в 16-разрядный регистр. 32-разрядная команда CALL заносит в стек содержимое 32-разрядного регистра EIP и (для внутриуровневых вызовов) 32-разрядного регистра ЕSP. Соответствующая команда RET также должна использовать 32-разрядный операнд для выборки этого 16-разрядного значения из стека в 32-разрядный регистр. Если две части командной пары CALL /RET имеют операнды различной длины, взаимодействие со стеком будет некорректным, и значения указателя команды и указателя стека не будут корректно восстановлены.

+-----------------------------------------------------------------------+| БЕЗ ПЕРЕНОСА ПРИВИЛЕГИРОВАННОСТИ || || После 16-разрядного вызова После 32-разрядного вызова || 31 0 31 0 || +---------------------| +---------------------| ||направление |/////////////////////| |/////////////////////| || заполнения +---------------------| +---------------------| || | PARM2 | PARM1 | | PARM2 | || | +----------+----------| +---------------------| || | | CS | IP |<-- SP | PARM1 | || | +----------+----------| +---------------------| || | | | |//////////| CS | || V +----------+----------| +---------------------| || | | ESP -->| EIP | || +----------+----------| +---------------------| || || || С ПЕРЕНОСОМ ПРИВИЛЕГИРОВАННОСТИ || || После 16-разрядного вызова После 32-разрядного вызова || 31 0 31 0 || +---------------------| +---------------------| ||направление | SS | SP | |//////////| SS | || заполнения +----------+----------| +---------------------| || | PARM2 | PARM1 | | ESP | || | +----------+----------| +---------------------| || | | CS | IP |<-- SP | PARM2 | || | +----------+----------| +---------------------| || | | | | PARM1 | || V +---------------------| +---------------------| || | | |//////////| CS | || +----------+----------| +---------------------| || | | ESP -->| EIP | || +----------+----------| +---------------------| |+-----------------------------------------------------------------------+ Рисунок 24-1. Стек после вызовов длинннх 16- и 32-разрядных указателей.

Когда команда CALL и соответствующая ей команда RET находятся в сегментах, имеющих одинаковые значения D-бита (т.е. обе по умолчанию 32-разрядные или обе по умолчанию 16-разрядные), могут быть использованы установки по умолчанию. Если же команда CALL и соответствующая ей команда RET находятся в сегментах имеющих различные значения D-бита , должны быть использованы префиксы размера операнда.



Существует три способа выполнения 32-разрядного вызова 16-разрядной процедурой:

  1. Использовать 16-разрядный вызов 32-разрядной интерфейсной процедуры, которая осуществит 32-разрядный вызов из заданного места.
  2. Осуществить вызов через 32-разрядный шлюз вызова.
  3. Изменить 16-разрядную процедуру, вставив перед вызовом префикс размер операнда, превращающий этот вызов в 32-разрядный.

Точно так же существует и три способа выполнения 16-разрядного вызова 32-разрядной процедурой:

  1. Использовать 32-разрядный вызов 32-разрядной интерфейсной процедуры, которая осуществит 16-разрядный вызов из заданного места.
  2. Осуществить вызов через 16-разрядный шлюз вызова.
  3. Изменить 32-разрядную процедуру, вставив перед вызовом префикс размера операнда, превращающий этот вызов в 16-разрядный. (Необходимо следить, чтобы возвращаемое смещение не превосходило 0FFFFH).

Программист может использовать любой из приведенных выше методов выполнения команды CALL в 16-разрядном сегменте, подобрав ей соответствующую команду RET в 32-разрядном сегменте, или выполнить команду CALL в 32-разрядном сегменте, подобрав ей соответствующую команду RET в 16-разрядном сегменте.



<== предыдущая лекция | следующая лекция ==>
Разделение данных между сегментами кода различной разрядности. | Управление размером операнда при вызовах


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


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

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

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


 


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

 
 

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

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