Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Уроки ассемблеру. Быстро и просто. Урок 2


 

Доброго времени суток, дорогие друзья!

Итак, вот как будет выглядеть наша первая программа.
Мы просто хотим вывести на экран 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). Всё просто. Однако, конечно, вышеприведённый текст - не вся программа. Она будет иметь определённые признаки оформления, которые мы будем использовать во всех примерах. Начинаться любая наша программа будет так:

.286
CSEG segment
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
org 100h
begin:

А заканчиваться так:

CSEG ends
end begin

В середине и будет располагаться наш текст, а чуть ниже него ещё два элемента:

- int 20h - завершающее программу прерывание, выход в DOS. Если его не указать, программа выполнит свою работу и "зависнет".

- helloworld db 'Hello, world!$' - собственно определение переменной helloworld. Директива db (define byte) определяет область памяти, доступную побайтно. Фраза "Hello, world!" указана в одинарных кавычках, а за знаком "!" указан знак "$" - конец строки. Почему так, поясним чуть позже. Что ещё следует знать, что определяем переменные мы в самом конце, чтобы при ассемблировании их не приняли за команды ассемблера.

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

;Всё, что следует за значком ";" - это комментарий.

.286 ;Разрешает ассемблирование непривилегированных инструкций
;процессора 80286 (реальный режим) и инструкций арифметического
;сопроцессора 80287.

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!


В избранное