| « Поставить закладку » « Сделать стартовой » | |||
|
|||
| Статьи:: MS-DOS :: Содержимое PSP: Ячейки 05h-09h описание действий для вызова функций DOS в стиле CP/M
Содержимое PSP: Ячейки 05h-09h описание действий для вызова функций DOS в стиле CP/MВ операционной системе CP/M программисты для вызова функций DOS использовали близкий CALL: по смещению 5 в PSP каждойпрограммы находится команда CALL FAR seg:off, которая теоретически позволяет вызвать DOS выполнением команды CALL 0005, точно так же, как в CP/M. Однако это поле обычно содержит команду, подобную, скажем, CALL FAR F5C2:A496. Она указывает на ячейку памяти, которая, как кажется, либо принадлежит BIOS, либо находится в несуществующей области памяти. Команды же по этому адресу обычно представляют собой просто мусор. В результате, большинство программистов просто игнорирует этот способ, хотя он и был тщательно документирован с первых же версий MS-DOS. Дело же здесь в том, что адрес, содержащийся в PSP, несет в себе еще одну, дополнительную нагрузку и поэтому не совсем корректен с точки зрения его истинного предназначения. Содержимое второго и третьего байтов, кроме того, что является вроде бы смещением адреса, по которому происходит переход при выполнении CALL, означает количество свободных байтов в сегменте программы. Поэтому перед использованием этот адрес должен быть слегка подкорректирован: выравнен вверх до ближайшего параграфа. Используя предыдущий пример, получаем CALL FAR F5C2:A4A0. Если взглянуть на команду, находящуюся по этому адресу, можно увидеть ту же самую инструкцию, что находится в векторе прерывания 30h и которая указывает на альтернативный обработчик прерывания 21h. Таким образом, сохранив в стеке необходимые данные в требуемом порядке и, воспользовавшись откорректированным адресом (сформировав, например, команду JMP FAR с этим адресом), можно попасть в DOS обходным путем, не генерируя прерывание 21h. Вместе с тем, откорректировав адрес, содержащийся в PSP, можно вызывать функции DOS и в стандартном для CP/M стиле: выполнением команды CALL 0005, с указанием номера вызываемой функции в регистре CL. Может показаться, что такой способ не обеспечивает корректного возврата в программу, однако это не так. Благодаря первым командам альтернативного обработчика прерывания 21h все проходит прекрасно. Рассмотрим этот процесс более детально. Выполнение команды CALL 0005 заносит в стек корректный адрес возврата, то есть адрес следующей команды. Затем выполняется далекий CALL в PSP. Выполнение его заносит в стек значение кодового сегмента программы, а затем еще один адрес возврата. Однако, он уже указывает на ячейку памяти со смещением 0Ah в PSP. Тем не менее, возврат происходит куда следует, потому что первое, что делает этот обработчик прерывания - это удаляет второй адрес возврата командой POP AX. Затем он извлекает из стека два других значения и снова заносит их туда, но уже в порядке, необходимом для команды IRET: сначала регистр флагов, затем сегмент и, наконец, смещение адреса возврата. В результате по выполнении вызванной функции DOS команда IRET заносит в CS:IP корректные значения. Осталось только понять, почему по откорректированному адресу находится такая же команда, что и в векторе прерывания 30h. Для этого нужно вспомнить, что память в IBM PC построена по принципу кольца и за самым старшим адресом снова следует самый младший (сказанное относится только к реальному режиму микропроцессоров 80286 и 80386). И поэтому адрес в PSP F5C2:A4A0 на самом деле переходит в 0:00C0 : смещение A4A0=сегмент 0A4A, и сегмент F5C2 плюс сегмент A4A есть сегмент 1000C, что по правилам кольца становится сегментом 000C или, что то же самое, адресом 0:00C0. Таким образом, откорректированный адрес в PSP на самом деле указывает на вектор прерывания 30h. Рубрика: MS-DOS
Google Developer Day 2008 в Москве.
Дата проведения: 28 октября 2008 г.; Место проведения: Амбер Плаза, Москва, Россия. Конференция для веб-разработчиков и разработчиков мобильных приложений в Москве. Узнайте, как наилучшим образом использовать инструменты разработки и API от Google, чтобы создавать социальные, мобильные и картографические приложения, как использовать AJAX/JavaScript инструменты и библиотеки от Google и многое другое из первых уст.
Подробнее... |
Рубрика: Мероприятия
| Добавлено: 05.09.2008
ТОП 10 самых раздражающих факторов для программиста.
Совсем недавно наткнулся в интернете на забавный "хит-парад" наиболее раздражающих вещей для программиста. Поскольку он был на английском — решил перевести текст и несколько адаптировать к нашим реалиям…
Подробнее... |
Рубрика: Разное
| Добавлено: 03.09.2008
Windows Server 7, 8 и 9.
Подробнее... |
Рубрика: Windows Server 2003
| Добавлено: 03.09.2008
Остальные статьи:
jQuery для JavaScript-программистов
Инновационный веб-броузер Google Chrome стартует уже сегодня
Windows 7: подход к производительности системы
Trac + Subversion @ Ubuntu: Revisited
[g]Vim в режиме Python: Рекомпиляция в Windows
Java + JSON. Пути к дружбе
Драйвер SQL Server 2005 для PHP
Типы данных в MySQL (сжатый справочник для PHP программиста)
PHP класс для работы с Яндекс.XML
Ошибки начинающих PHP разработчиков
Наследование шаблонов в Smarty
Особенности хранения сессий PHP в memcached
Internet Explorer 8 beta 2
9 правил для начинающего Ajax-разработчика
ExtJS 2.2 - полная поддержка Firefox 3, новые виджеты и другие нововведения
Windows 7: под покровом тайны |
Цитата дня (все,добавить):
|
Realcoding.NET
© 2003-2008 |
Контакты |
Реклама на сайте
|