Итак, вот как будет выглядеть наша первая программа. Мы просто хотим вывести на экран MS-DOS
строку "Hello, world!" с помощью программы типа .com. Для вывода текста
мы будем использовать функцию 9 прерывания 21h. Функции DOS позволяют самой DOS обеспечить доступ к файловой системе. Прерывание — это сигнал, сообщающий процессору о наступлении какого-либо события, с помощью специальной инструкции. Например, прерывание 21h является прерыванием, через которое происходит обращение к основным функциям DOS.
Давайте рассмотрим это на примере:
mov ah,9 mov dx,offset helloworld int 21h Суть достаточно проста. а.
Командой mov ah,9 мы загружаем в регистра ah число 9. На языке "Бейсик"
это выглядело бы примерно так: LET A=9. Следует отметить в данном
случае, что ah предназначен "для служебного пользования" - в частности,
использования тех же функций. Также стоит отметить, что на самом деле ah
- это старший байт регистра ax, состоящего на самом деле из двух частей
- старшего байта (ah) и младшего (al). Аналогично работают и остальные
служебные регистры (bx, cx, dx). b. Командой mov dx,offset
helloworld мы загружаем фразу "Hello, world!". Однако вся фраза,
конечно, не поместится в регистр, поэтому мы используем приставку
"offset" - смещение. Грубо говоря, это адрес, указывающий компилятору,
где на самом деле находится эта фраза. Определим это в конце программы. c. int 21h - данной командой осуществляем прерывание, то есть собственно вывод текста на экран.
Узнаем об этом поподробнее. 1. Открываем файл "HELP.EXE". 2. Нажимаем любую клавишу. 3. Заходим в раздел "Указатель функций DOS/BIOS". 4. Заходим в раздел "Прерывания DOS". 5. Заходим в раздел "INT 21H".
Последовательность
1-5 в дальнейшем будет обозначена нами так: HELP.EXE -> Указатель
функций DOS/BIOS -> Прерывания DOS -> INT 21H
Как стало
видно из текста, мы действительно должны загрузить в регистр ah номер
желаемой функции (в нашем случае -"9"), и выполнить прерывание (int
21h). Всё просто. Однако, конечно, вышеприведённый текст - не вся
программа. Она будет иметь определённые признаки оформления, которые мы
будем использовать во всех примерах. Начинаться любая наша программа
будет так:
CSEG ends end begin В середине и будет располагаться наш текст, а чуть ниже него ещё два элемента:
- int 20h - завершающее программу прерывание, выход в DOS. Если его не указать, программа выполнит свою работу и "зависнет".
-
helloworld db 'Hello, world!$' - собственно определение переменной
helloworld. Директива db (define byte) определяет область памяти,
доступную побайтно. Фраза "Hello, world!" указана в одинарных кавычках, а
за знаком "!" указан знак "$" - конец строки. Почему так, поясним чуть
позже. Что ещё следует знать, что определяем переменные мы в самом
конце, чтобы при ассемблировании их не приняли за команды ассемблера.
Итак, полностью оформленный текст программы будет выглядеть чуть более обширно.
;Всё, что следует за значком ";" - это комментарий.
CSEG segment ;Даём имя сегменту, а
точнее определяем абсолютный ;сегмент в памяти программ по определённому адресу. ;Имя нашего сегмента будет CSEG.
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG ;Задаём сегментные регистры, которые будем использовать для ;вычисления действующего адреса для всех меток и переменных, опре- ;делённых для сегмента или группы сегментов с указанным именем. ;У нас их четыре, - CS, DS, ES, SS и они будут указывать на наш ;единственный сегмент (мы его назвали CSEG).
org 100h ;Устанавливаем счётчик инструкций в текущем сегменте в соот- ;ветствии с адресом, задаваемым "выражением". ;Сейчас этот счётчик равен 100h - используется для всех программ ;типа .com
begin: ;Метка начала программы.
;Выводим фразу, используя функцию 9 прерывания 21h. mov ah,9 ;Загружаем в регистр ah число 9 (указываем функцию). mov
dx,offset helloworld ;Указываем, что за фразу мы будем выводить. int 21h ;Выводим фразу.
int 20h ;Выходим в DOS.
helloworld db 'Hello, world!$' ;Определяем переменную helloworld, доступную побайтно, с фразой ;"Hello, world!". В одинарных кавычках, после знака "!" ставим ;знак "$".
CSEG ends ;Указываем на завершение сегмента CSEG. end begin ;Конец
программы.
В следующем уроке мы разберёмся с вами с десятичной и шестнадцатеричной системами счислений, а также с регистрами. И запустим нашу программу!
Совет: разберитесь со структурой файла помощи HELP.EXE!