Программа на языке ассемблера представляет собой последовательность операторов, описывающих выполняемые операции. Оператором (строкой) исходной программы может быть или команда, или псевдооператор (директива) ассемблера. Команды выполняются в процессе решения задачи на компьютере, а директивы – в процессе ассемблирования (трансляции) программы. Следовательно, в отличие от команд директивы сообщают ассемблеру (транслятору), что ему делать с командами и данными, которые вводятся в программе. Ниже в таблице 2 перечисляются наиболее часто используемые директивы ассемблера [5].
Таблица 2
Синтаксис и функции псевдооператоров (директив)
Псевдооператор | Формат и Функция |
Определения данных DB | [имя] DB выражение [,…….] определяет переменную или присваивает ячейке памяти начальное значение. Резервирует 1 или более байт (при наличии запятых) |
DW | [имя] DW выражение [,…….] аналогично предыдущему резервирует двухбайтовые слова |
DD | [имя] DD выражение [,…….] Резервирует 4-х байтовые двойные слова |
Определения сегмента или процедуры SEGMENT | Имя_cer SEGMENT [тип_выравнивания (подгонки)] [тип_связи] [‘класс’] .... Имя_cer ENDS Определяет границы сегмента программы. Обязательно содержит начало описания Имя_cer SEGMENT и окончание описания Имя_cer ENDS |
ASSUME | ASSUME регистр_cer: Имя_cer [,…….] Или ASSUME регистр_cer: NOTHING Cообщает Ассемблеру, какой регистр сегмента связан с соответствующим сегментом программы. Оператор ASSUME регистр_cer: NOTHING отменяет действие всех предыдущих операторов ASSUME для данного регистра |
Продолжение таблицы 2
PROC | Имя PROC [NEAR] или Имя PROC FAR .... .... RET имя ENDP Присваивает имя последовательности операторов. Должно иметь начало PROC и окончание ENDP |
Псевдооператор | Формат и Функция |
Управление трансляцией END | END [метка точки входа] Отмечает конец исходной программы |
Внешние ссылки PUBLIC | PUBLIC идентификатор Делает определенный ранее идентификатордоступным другим модулям программы, которые впоследствии должны быть присоединены к данному модулю |
EXTERN | EXTERN имя: тип [, ….] Указывает, что имя определено в другом модуле программы |
INCLUDE | INCLUDE файл вставляет содержимое указанного файла в текущий файл исходной программы |
Определение идентификаторов EQU | Имя EQU текст или Имя EQU числовое_выражение Постоянно присваивает идентификатору имя текст или числовое_выражение Имя = числовое_выражение Числовое_выражение присваивается идентификатору имя, но может быть переприсвоено |
Обязательные требования к структуре ASM -программы следующие [6]:
- программа может использовать четыре сегмента памяти, начальные адреса которых должны быть загружены в регистры микропроцессора CS,DS, ES, SS, а сами сегменты в явном виде определены в программе в виде операторных скобок
- имя_сегмента segment
-........
- имя_сегмента ends,
например,
DSEG SEGMENT PARA PUBLIC ‘DATA’
SOURCE DB 10,20,30,40
DEST DB 4 DUP(?)
DSEG ENDS;
- в программе должно быть указание, какие сегментные регистры закрепляются за используемыми именами регистров, например:
ASSUME CS:CSEG, DS:DSEG, SS:STACK.
При исполнении программы адреса сегментных регистров CS, SS, ESв соответствии с вышеприведенными указаниями загружаются автоматически;
- сегмент данных DS в EXE-программе не может быть загружен автоматически, поскольку он используется программой-загрузчиком LINK для формирования начального адреса служебной области памяти – префикса программного сегмента (PSP), непосредственно предшествующего любой исполняемой программе. PSP – это группа служебных слов в оперативной памяти, формируемая для каждой загружаемой программы пользователя и занимающая обычно 256 байт (100Н байт), именно адрес этой области записывается в регистр DS. Поэтому в самом начале исполняемой программы этот сегмент инициируется принудительно: сначала в стек записывается адрес возврата к служебной области в виде 2-ух слов – содержимого регистра DS и нулевого смещения; затем в регистр DS записывается адрес сегмента данных исполняемой программы, например, как показано ниже:
PUSH DS; поместить в стек адрес PSP
SUB AX,AX; обнулить регистр АХ
PUSH AX; поместить в стек смещение адреса возврата=0
MOV AX,DSEG; инициировать адрес сегмента данных
MOV DS,AX; загрузить адрес в регистр DS;
- в исходной программе обязательно должна быть определена метка для первой команды, с которой начнется выполнение программы. Это может быть собственно метка или имя процедуры, как показано в приведенной ниже программе. Имя этой метки обязательно должно быть указано в конце программы в качестве операнда директивы END, например,