4.1 .Программа типа СОМ

Традиционно первая программа для освоения нового языка программирования -программа, выводящая на экран текст Hello world!. He будет исключением и эта книга, поскольку такая программа всегда являлась отправной точкой для

дальнейшего освоения языка.

Итак, наберите в любом текстовом редакторе, который может записывать файлы как обычный текст (например: EDIT.COM в DOS, встроенный редактор в Norton Commander или аналогичной программе, NOTEPAD в Windows), следующий текст:

;

;  Выводит на экран сообщение "Hello World!" и завершается.

 

.model

tiny

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

 

. code

 

Начало сегмента кода.

 

org

100h

Начальное значение счетчика -

start:

mov

ah,9

Номер функции DOS - в АН.

 

mov

message

Адрес строки - в DX.

 

int

21h

Вызов системной функции DOS.

 

ret

 

; Завершение СОМ-программы.

message

 

db         "Hello World!

';ODh.,OAh, '$'  ;   Строка для вывода.

 

end

start

Конец программы.

и сохраните его как файл hello -1 .asm. Можно также использовать готовый файл с этим именем. (Все программы, рассмотренные в этой книге как примеры; вы мо­жете найти в Internet по адресу: http://www.dmk.ru.)

Для превращения программы в исполняемый файл сначала надо вызвать ас-, семблер, чтобы скомпилировать ее в объектный файл с именем Ье11о-1.оЬз,!набрав в командной строке следующую команду:

ДляТА5М: . tasm hello-1.asm

Для MASM:

ml /с hello-1.asm

Для WASM:

wasm

С ассемблерными программами также можно работать из интегрированных сред разработки, как обычно поступают с языками высокого уровня. Но в них, как правило, удобнее создавать ассемблерные процедуры, вызываемые из программ на языке, для которого предназначена среда, а создание полноценных программ на ассемблере требует некоторой перенастройки.

Формат объектных файлов, применяемых всеми тремя рассматриваемыми ас­семблерами по умолчанию (OMF-формат), совпадает, так что можно пользовать­ся ассемблером из одного пакета и компоновщиком из другого.

ДляТАЗМ:

tlink /t /x hello-l.obj

Для MASM (команда link должна вызывать 16-битную версию LINK.EXE): link hello-l.obj, ,NUL,,, exe2bin hello-1.exe hello-l.com

Для WASM:

wlink file hello-l.obj form DOS COM

Теперь получился файл HELLO-l.COM размером 23 байта. Если его выпол­нить, на экране появится строка Hello World! и программа завершится.

Рассмотрим исходный текст программы, чтобы понять, как она работает.

Первая строка определяет модель памяти TINY, в которой сегменты кода, дан­ных и стека объединены. Эта модель предназначена для создания файлов типа СОМ.

Директива начинает сегмент кода, который в нашем случае также дол-

жен содержать и данные.

ORG 100h устанавливает значение программного счетчика в 100h, потому что при загрузке СОМ-файла в память DOS занимает первые 256 байт (lOOh) бло­ком данных PSP и располагает код программы только после этого блока. Все про­граммы, которые компилируются в файлы типа СОМ, должны начинаться с этой директивы.

Метка START располагается перед первой командой в программе и будет исполь­зоваться в директиве END, чтобы указать, с какой команды начинается программа.

Команда M0VAH,9 помещает число 9 в регистр АН - номер функции DOS «вы­вод строки».

Команда MOV DX.OFFSET MESSAGE помещает в регистр DX смещение мет­ки MESSAGE относительно начала сегмента данных, который в нашем случае совпадает с сегментом кода.

Команда INT 21h вызывает системную функцию DOS. Эта команда - основ­ное средство взаимодействия программ с операционной системой. В нашем при­мере вызывается функция DOS номер 9 - вывести строку на экран. Эта функция выводит строку от начала, адрес которого задается в регистрах до первого

встреченного символа $. При запуске СОМ-файла регистр DS автоматически за­гружается сегментным адресом программы, а регистр DX был подготовлен пре­дыдущей командой.

Команда RET используется обычно для возвращения из процедуры. DOS вы­зывает так, что команда RET корректно завершает программу.

5 Assembler для DOSпри вызове помещает в стек сегментный адрес программы

и ноль, так что RETnepedaem управление на нулевой адрес текущего сегмен­та, то есть на первый байт PSP. Там находится код команды Ш20п,кото-рая и используется для возвращения управления в DOS. Можно сразу закан­чивать программу командой 1КГ20Ь,хотя это длиннее на 1 байт.

Следующая строка программы определяет строку данных, со-

держащую текст Hello World!, управляющий символ ASCII возврат каретки с ко­дом управляющий символ ASCII перевод строки с кодом и символ $, завершающий строку. Эти два управляющих символа переводят курсор на пер­вую позицию следующей строки точно так же, как в строках на языке С действует последовательность \п.

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