6.4.1. Способы объединения программы с расширителем

Первые популярные DOS-расширители, такие как Start32, Raw32, System64, 386Power, PMODE и другие, распространялись в виде исходных текстов (Start32 и PMODE оказали решающее влияние на развитие DOS-расширителей в целом). Чтобы использовать такой расширитель, надо скомпилировать его любым ассем­блером в объектный файл, который необходимо скомпоновать вместе со своей

программой. В большинстве случаев нужно назвать точку входа своей програм­мы main или _main и закончить модуль директивой end без параметра, тогда DOS-

расширитель получит управление первым и передаст его на метку main после того, как будут настроены все сегменты для модели памяти flat.

Самым популярным из профессиональных компиляторов, поддерживающих расширители DOS, стал Watcom C/C++. Он использует модификацию коммер­ческого DOS-расширителя DOS4G, названную DOS/4GW. Дело в том, что ком­поновщик wlink.exe поддерживает, среди большого числа различных форматов вывода, формат линейных исполняемых файлов LE, применяющийся в опера­ционной системе OS/2 (а также, с небольшими модификациями, для драйверов в Windows). Достаточно дописать файл в формате OS/2 LE в конец загрузчика DOS-расширителя, написанного соответствующим образом, чтобы потом его за­пускать. Загрузчик расширителя можно указать прямо в командной строке wlink (командой op stub) или скопировать позже. В комплект поставки расширителей часто входит специальная утилита, которая заменяет загрузчик, находящийся в начале такой программы, своим.

Чтобы скомпилировать, например, программу Ifbfire.asm, которую мы рассмот­рим далее, нужно воспользоваться следующими командами: Компиляция:

wasm Ifbfire.asm

Компоновка с DOS/4GW расширитель, распространяемый с Wat-

com С):

wlink file Ifbfire.obj  form os2 le op stub=wstub. exe

Компоновка с (самый популярный из бесплатных расширителей):

wlink file Ifbfire.obj  form os2 le op stub=pmodew. exe

Компоновка с ZRDX (более строгий с точки зрения реализации):

wlink file Ifbfire.obj form os2 Is op stub=zrdx.exe

Компоновка с WDOSX (самый универсальный расширитель):

wlink file Ifbfire.obj form os2 le op stub=wdosxle. exe И так далее.

К сожалению, формат исполняемых файлов DOS (так называемый формат MZ), в котором по умолчанию создают программы другие компиляторы, очень не­удобен для объединения с расширителями, хотя универсальный расширитель

WDOSX способен обработать и такой файл, и даже просто файл с 32-битным

кодом без всяких заголовков (какой можно получить, создав СОМ-файл с дирек­тивой org 0), и файл в формате РЕ (см. главу 7), правда, не во всех случаях такие программы будут работать успешно.

И наконец, третий подход к объединению расширителя и программы можно видеть на примере DOS32, куда входит программа dlink.exe, являющаяся компо­новщиком, который вполне подойдет вместо link, tlink или wlink, чтобы получить исполняемый файл, работающий с этим расширителем.

Тем не менее популярность подхода, используемого в Watcom, настолько вы­сока, что подавляющее большинство программ, применяющих идею расширите­лей DOS, написано именно на Watcom С или на ассемблере для WASM.

Прежде чем мы сможем написать обещанный в разделе 4.5.2 пример програм­мы, работающей с линейным кадровым буфером SVGA, познакомимся еще с дву­мя группами функций DPMI, которые нам потребуются.

DOS