|
| |
|
|
Ответов: 0
|
29-08-10 18:19
|
|
|
| |
|
|
Ответов: 2
|
16-08-10 16:10
|
|
|
| |
|
|
Ответов: 0
|
20-07-10 02:36
|
|
|
   Web - программирование
| |
|
|
|
   Программирование под ОС
| |
|
|
|
   Web - технологии
| |
|
|
|
   Базы Данных
| |
|
|
|
|
Операционные системы / Разное /
| |
| | |
Возможно вас заинтересует
|
|
Содержимое 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.
|
Последние статьи: Операционные системы / Разное /
| |
| | |
|
В операционной системе CP/M программисты для вызова функций DOS использовали близкий CALL: по смещению 5 в PSP каждойпрограммы находится команда CALL FAR seg:off, которая теоретически позволяет вызвать DOS выполнением команды CALL 0005, точно так же, как в CP/M... подробнее
|
|
Кол. просмотров: общее - 187 сегодня - 0
|
|
|
Альтернативный обработчик прерывания 21h предъявляет другие требования к входным параметрам, чем обычный вызов INT 21h. Его использование требует некоторых специальных действий и понимания того, что он позволяет... подробнее
|
|
Кол. просмотров: общее - 176 сегодня - 0
|
|
|
Функция 13h прерывания 21h относится к серии функций, выполняющих операции с файлами с использованием FCB. Она удаляет файл или группу файлов... подробнее
|
|
Кол. просмотров: общее - 167 сегодня - 0
|
|
|
Прерывания 30h и 31h не используются в DOS и о них ничего не говорится в обычных руководствах программиста по DOS. Строго говоря, их вообще нельзя назвать прерываниями и тем более пытаться их выполнить. Ни к чему хорошему это не приведет, поскольку ячейки памяти, зарезервированные для векторов этих двух прерываний (0:00C0 - 0:00C7) не содержат, как обычно, адресов процедур, выполняющих обработку прерываний... подробнее
|
|
Кол. просмотров: общее - 170 сегодня - 0
|
|
|
Эта инфа была написана в первую очередь для тех, у кого проблемы с жестким диском, а также для тех, кто с минимальной конфигурацией хочет выбраться в интернет... подробнее
|
|
Кол. просмотров: общее - 871 сегодня - 0
|
|
|
|