[Назад] [Далее]

4.2. Программа типа ЕХЕ

ЕХЕ-программы немного сложнее в исполнении, но для них отсутствует ограничение размера в 64 килобайта, так что все достаточно большие программы используют именно этот формат. Конечно, ассемблер позволяет уместить и в 64 килобайтах весьма сложные и большие алгоритмы, а все данные хранить в отдельных файлах, но ограничение размера все равно очень серьезно, и даже чисто ассемблерные программы могут с ним сталкиваться.

; hello-2.asm
; Выводит на экран сообщение "Hello World!" и завершается
        .model     small             ; модель памяти, используемая для ЕХЕ
        .stack     100h              ; сегмент стека размером в 256 байт
        .code
start:  mov        ax,DGROUP         ; сегментный адрес строки message
        mov        ds,ax             ; помещается в DS
        mov        dx,offset message
        mov        ah,9
        int        21h               ; функция DOS "вывод строки"
        mov        ax,4C00h
        int        21h               ; функция DOS "завершить программу"
        .data
message db         "Hello World!",0Dh,0Ah,'$'
        end        start

В этом примере определяются три сегмента — сегмент стека директивой .STACK размером в 256 байт, сегмент кода, начинающийся с директивы .CODE, и сегмент данных, начинающийся с .DATA и содержащий строку. При запуске ЕХE-программы регистр DS уже не содержит адреса сегмента со строкой message (он указывает на сегмент, содержащий блок данных PSP), а для вызова используемой функции DOS этот регистр должен иметь сегментный адрес строки. Команда MOV AX,DGROUP загружает в АХ сегментный адрес группы сегментов данных DGROUP, a MOV DS,AX копирует его в DS. Для ассемблеров MASM и TASM можно использовать вместо DGROUP предопределенную метку «@data», но единственная модель памяти, в которой группа сегментов данных называется иначе, — FLAT (ей мы пока пользоваться не будем). И наконец, программы типа ЕХЕ должны завершаться системным вызовом DOS 4Ch: в регистр АН помещается значение 4Ch, в регистр AL помещается код возврата (в данном примере код возврата 0 и регистры АН и AL загружаются одной командой MOV AX,4C00h), после чего вызывается прерывание 21h.

Компиляция hello-2.asm:

Для TASM:

tasm hello-2.asm
tlink /x hello-2.obj

Размер получаемого файла hello-2.exe — 559 байт.

Для MASM:

ml /с hello-2.asm
link hello-2.obj

Размер получаемого файла hello-2.exe — 545 байт.

Для WASM:

wasm hello-2.asm
wlink file hello-2.obj form DOS

Размер получаемого файла hello-2.exe — 81 байт.

Расхождения в размерах файлов вызваны различными соглашениями о выравнивании сегментов программы по умолчанию. Все примеры программ для DOS в этой книге рассчитаны на компиляцию в СОМ-файлы, так как идеология работы с памятью в них во многом совпадает с идеологией, применяемой при программировании под расширители DOS, DPMI и Windows.


п»ї
"target=_blank><\/a>") //-->