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