[ главная ]   [ рейтинг статей ]   [ справочник радиолюбителя ]   [ новости мира ИТ ]



Ответов: 0
25-02-12 07:01







   Web - программирование
PHP


ASP






XML



CSS

SSI





   Программирование под ОС











   Web - технологии








   Базы Данных









   Графика






Данные
psp купить




Операционные системы / Разное /

Содержимое 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.




Комментарии

 Ваш комментарий к данному материалу будет интересен нам и нашим читателям!



Последние статьи: Операционные системы / Разное /

Содержимое PSP: Ячейки 05h-09h описание действий для вызова функций DOS в стиле CP/M
15-02-2010   

В операционной системе CP/M программисты для вызова функций DOS использовали близкий CALL: по смещению 5 в PSP каждойпрограммы находится команда CALL FAR seg:off, которая теоретически позволяет вызвать DOS выполнением команды CALL 0005, точно так же, как в CP/M... подробнее

Кол. просмотров: общее - 3032 сегодня - 2

Альтернативный обработчик прерывания int 21h
15-02-2010   

Альтернативный обработчик прерывания 21h предъявляет другие требования к входным параметрам, чем обычный вызов INT 21h. Его использование требует некоторых специальных действий и понимания того, что он позволяет... подробнее

Кол. просмотров: общее - 2915 сегодня - 1

Функция 13h прерывания 21h. Недокументированные возможности
15-02-2010   

Функция 13h прерывания 21h относится к серии функций, выполняющих операции с файлами с использованием FCB. Она удаляет файл или группу файлов... подробнее

Кол. просмотров: общее - 2871 сегодня - 1

Прерывания 30h и 31h
15-02-2010   

Прерывания 30h и 31h не используются в DOS и о них ничего не говорится в обычных руководствах программиста по DOS. Строго говоря, их вообще нельзя назвать прерываниями и тем более пытаться их выполнить. Ни к чему хорошему это не приведет, поскольку ячейки памяти, зарезервированные для векторов этих двух прерываний (0:00C0 - 0:00C7) не содержат, как обычно, адресов процедур, выполняющих обработку прерываний... подробнее

Кол. просмотров: общее - 2610 сегодня - 2

Эксперименты с QNX
26-01-2009   

Эта инфа была написана в первую очередь для тех, у кого проблемы с жестким диском, а также для тех, кто с минимальной конфигурацией хочет выбраться в интернет... подробнее

Кол. просмотров: общее - 2745 сегодня - 2



  WWW.COMPROG.RU - 2009-2012 | Designed and Powered by Zaipov Renat | Projects