Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11631
Последний выпуск: 19.06.2015

Недокументированные возможности MS-DOS - Содержимое 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.


[ Оглавление ]

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог