Assembler - язык неограниченных возможностей

         

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


Первые популярные 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) или скопировать позже. В комплект поставки расширителей часто входит специальная утилита, которая заменяет загрузчик, находящийся в начале такой программы, на свой.

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

Компиляция:

wasm lfbfire.asm

Компоновка с DOS/4GW (стандартный расширитель, распространяемый с Watcom С):

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

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

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

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

wlink file lfbfire.obj form os2 le op stub=zrdx.exe


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

wlink file lfbfire. 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, которые нам потребуются.


Содержание раздела