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

Немного сложнее в исполнении, но для них отсутствует огра­ничение размера в 64 Кб, так что все достаточно большие программы используют именно этот ассемблер позволяет уместить и в 64 Кб весьма

сложные и большие алгоритмы, а все данные хранить в отдельных файлах, но ог­раничение размера все равно очень серьезно, и даже чисто ассемблерные програм­мы могут с ним сталкиваться.

hello-2. asm

Выводит на экран

start:

сообщение "Hello World!

и завершается.

.model

small

 

Модель памяти, используемая для EXE.

.stack

lOOh

 

; Сегмент стека размером в 256 байт.

.code

 

 

 

mov

ax.DGROUP

 

Сегментный адрес строки message

mov

ds, ax

 

помещается в DS.

fflOV

dx,offset

message

 

mov

ah,9

 

 

int

21h

 

; Функция DOS  "вывод строки".

mov

ax,4C00h

 

 

int

21h

 

; Функция DOS  "завершить программу".

.data

 

 

 

 

db

'Hello World!'

".ODh.OAh, '$■

end

start

 

 

message

В этом примере определяются три сегмента - сегмент стека директивой размером в 256 байт; сегмент кода, начинающийся с директивы и сегмент

данных, начинающийся с .DATAh включающий строку. При запуске ЕХЕ-програм-мы регистр DS уже не содержит адреса сегмента со строкой message (он указывает на сегмент с блоком данных PSP), а для вызова используемой функции DOS этот регистр должен иметь сегментный адрес строки. Команда МОУ AX.DGROUP за­гружает в АХ сегментный адрес группы сегментов данных DGROUP, a MOV DS,AX копирует его в DS. Для ассемблеров MASM и TASM вместо DGROUP можно ис­пользовать предопределенную метку но единственная модель памяти, в ко­торой группа сегментов данных называется иначе, - FLAT (ей мы пока пользовать­ся не будем). И наконец, программы типа ЕХЕ должны завершаться системным вызовом DOS 4Ch: в регистр АН помещается значение 4Ch, в регистр AL - код воз­врата (в данном примере код возврата 0 и регистры АН и AL загружаются одной командой MOVAX,4COOh), послечего вызывается прерывание 21 h.

Компиляция 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 hello-2.asm

wlink file hello-2.obj form DOS

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

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