Phar Lap DOS-экстендер
В состав Phar Lap DOS-экстендера входят транслятор для языка Си hc386.exe, ассемблер 386asm.exe, редактор связей 386link.exe, отладчик minibug.exe и программа загрузки run386.exe.
С помощью транслятора языка Си или ассемблера получаются объектные модули, которые компонуются редактором связей 386link.exe в загрузочный модуль. Этот загрузочный модуль имеет расширение "exp" и запускается при помощи программы загрузки run386.exe. Полученный загрузочный модуль может работать только на процессорах i80386 или i80486. Версия 2.2 Phar Lap DOS-экстендера не поддерживает интерфейс DPMI, поэтому разработанные с использованием экстендера этой версии программы не будут работать на виртуальной машине WINDOWS в режиме "Enhanced 386 Mode".
Phar Lap DOS-экстендер предоставляет программе, которая получает управление сразу в защищённом режиме, возможность использовать документированные прерывания MS-DOS и BIOS. Кроме того, в рамках прерывания INT 21h DOS-экстендером реализуются дополнительные функции, связанные с работой в защищённом режиме.
Для того, чтобы у вас было представление о возможностях Phar Lap DOS-экстендера, приведём таблицу дополнительных функций, реализованных в рамках прерывания INT 21h:
Таблица 13. Функции Phar Lap DOS-экстендера.
Регистр AX | Выполняемая функция |
2501h | Установка в исходное состояние структур данных DOS-экстендера. |
2502h | Получить вектор прерывания защищённого режима. |
2503h | Получить вектор прерывания реального режима. |
2504h | Установить вектор прерывания защищённого режима. |
2505h | Установить вектор прерывания реального режима. |
2506h | Установить режим, при котором прерывание будет всегда обрабатываться в защищённом режиме. |
2507h | Установить вектора прерываний реального и защищённого режима. |
2508h | Установить линейный базовый адрес сегмента. |
2509h | Преобразовать линейный адрес в физический |
250Ah | Отобразить физическую память в конце сегмента. |
250Ch | Получить вектора аппаратных прерываний. |
250Dh | Получить информацию связи с реальным режимом. |
250Eh | Вызвать процедуру реального режима. |
250Fh | Преобразовать адрес защищённого режима в адрес реального режима. |
2510h | Вызвать процедуру реального режима с заданным содержимым регистров. |
2511h | Вызвать прерывание реального режима с заданным содержимым регистров. |
2512h | Загрузить программу для отладки. |
2513h | Создать алиасный дескриптор сегмента (т.е. для заданного дескриптора создаётся ещё один, указывающий на тот же сегмент). |
2514h | Изменить атрибуты сегмента. |
2515h | Получить атрибуты сегмента. |
2516h | Освободить всю память, распределённую при помощи LDT. |
2517h | Получить информацию о буферах данных DOS. |
2518h | Определить драйвер для обработки перемещения сегмента. |
2519h | Получить дополнительную информацию об ошибке памяти. |
251Ah | Зафиксировать страницы в памяти. |
251Bh | Расфиксировать страницы. |
251Ch | Освободить страницы физической памяти. |
251Dh | Прочитать элемент таблицы страниц. |
251Eh | Записать элемент таблицы страниц. |
251Fh | Обменять элементы таблицы страниц. |
2520h | Получить статистическую информацию о памяти. |
2521h | Максимальный размер доступной программам расширенной памяти. |
2522h | Определить альтернативный драйвер, обрабатывающей ситуацию отсутствия страницы в памяти. |
2525h | Максимальный размер доступной программам стандартной памяти. |
25C0h | Получить блок стандартной памяти MS-DOS. |
25C1h | Освободить блок стандартной памяти MS-DOS. |
25C2h | Изменить размер блока стандартной памяти MS-DOS. |
25C3h | Выполнить программу. |
Сравните это с функциями интерфейса DPMI, вы увидите что между этими интерфейсами есть много общего. Есть специальная функция, предназначенная для отладчиков - "Загрузить программу для отладки".
Программе доступны селекторы, облегчающие работу с наиболее часто используемыми областями данных. Например, таблица LDT содержит следующие селекторы, готовые для использования:
Таблица 14. Таблица LDT Phar Lap DOS-экстендера.
0008h | Сегмент кода программы. |
0010h | Сегмент данных программы. |
0018h | Сегмент видеопамяти для работы в текстовом режиме. |
0020h | PSP программы. |
0028h | Сегмент строк среды DOS (DOS environment). |
0030h | Сегмент данных для доступа к первому мегабайту памяти, доступен для записи. |
0038h | Сегмент для работы с сопроцессором Weitek 1167. В отличие от сопроцессора i80287/i80387 для обращения к сопроцессору Weitek 1167 используется определённая область адресов памяти. |
0040h | Сегмент видеопамяти для работы в графическом режиме. |
В качестве простейшего примера использования Phar Lap DOS-экстендера приведём следующую программу:
Листинг 20. Использование Phar Lap DOS-экстендера Файл pharlap.asm ----------------------------------------------------------- ; --------------------------------------------------- ; Сегмент данных ; --------------------------------------------------- _data segment para public use32 'data' hello db 'PHAR LAP 386/DOS EXTENDER', 0dh,0ah db 'Вызов DOS в защищенном режиме', 0dh,0ah db 0dh,0ah,'© Frolov A.V., 1992',0dh, 0ah db 0dh,0ah,'Для возврата в DOS нажмите любую клавишу','$' _data ends ; --------------------------------------------------- ; Сегмент стека ; --------------------------------------------------- _stack segment byte stack use32 'stack' db 8192 dup (?) _stack ends ; --------------------------------------------------- ; Сегмент кода ; --------------------------------------------------- assume cs:_text,ds:_data _text segment para public use32 'code' public _start_ _start_ proc near ; Выводим строку lea edx,hello mov ah,09h int 21h mov ah,8h int 21h mov ax,04c00h int 21h _start_ endp _text ends end _start_ Эта программа просто выводит сообщение на экран и завершает свою работу после того, как вы нажмёте любю клавишу.Особенность программы заключается в том, что она получает управление сразу в защищённом режиме. Запуск программы должен выполняться специальным загрузчиком, который входит в состав Phar Lap DOS-экстендера. Этот загрузчик находится в файле run386.exe.
Для трансляции программы и её запуска можно использовать следующий командный файл:
386asm pharlap 386link pharlap run386 pharlap Обратите внимание на то, что в приведённой выше программе не выполняется загрузка сегментного регистра DS. Так как программа стартует сразу в защищённом режиме, загрузчик run386 загружает сам все сегментные регистры. В частности, он загружает в регистр DS селектор сегмента данных.