3.1. Структура программы

Программа на языке ассемблера состоит из строк, имеющих следующий вид:

метка    команда/директива операнды ; комментарий

Причем все эти поля необязательны. Mетка может быть любой комбинацией букв английского алфавита, цифр и символов _, $, @, ?, но цифра не может быть первым символом метки, а символы $ и ? иногда имеют специальные значения и обычно не рекомендуются к использованию. Большие и маленькие буквы по умолчанию не распознаются, но различие можно включить, задав ту или иную оп­цию в командной строке ассемблера. Во втором поле, поле команды, может рас­полагаться команда процессора, которая транслируется в исполняемый код, или директива, которая не приводит к появлению нового кода, а управляет работой

самого ассемблера. В поле операндов располагаются требуемые командой или ди­рективой операнды (то есть нельзя указать операнды и не указать команду или директиву). И наконец, в поле комментариев, начало которого отмечается симво­лом ; (точка с запятой), можно написать все что угодно - текст от символа ; до конца строки не анализируется ассемблером.

Для облегчения читаемости ассемблерных текстов принято, что метка начина­ется на первой позиции в строке, команда - на 17-й (две табуляции), операнды -

Структура программы на 25-й (три табуляции) и комментарии - на 41-й или 49-й. Если строка состоит только из комментария, его начинают с первой позиции.

Если метка располагается перед командой процессора, сразу после нее всегда ставится оператор : (двоеточие), который указывает ассемблеру, что надо создать переменную с этим именем, содержащую адрес текущей команды:

some_loop:

lodsw • ; Считать слово из строки,

сглр       ах, 7 ;   Если это 7 - выйти из цикла,

loopne some_loop

Когда метка стоит перед директивой ассемблера, она обычно оказывается од­ним из операндов этой директивы и двоеточие не ставится. Рассмотрим директи­вы, работающие напрямую с метками и их значениями, - LABEL, EQU и =.

метка     label тип

Директива LABEL определяет метку и задает ее тип: BYTE (байт), WORD (слово), DWORD (двойное слово), FWORD (6 байт), QWORD (учетверенное сло­во), TBYTE (10 байт), NEAR (ближняя метка), FAR (дальняя метка). Метка полу­чает значение, равное адресу следующей команды или следующих данных, и тип, указанный явно. В зависимости от типа команда

mov       метка,О

запишет в память байт (слово, двойное слово и т. д.), заполненный нулями, а ко­манда

call метка

выполнит ближний или дальний вызов подпрограммы.

С помощью директивы LABEL удобно организовывать доступ к одним и тем же данным, как к байтам, таки к словам, определив перед данными две метки с разны­ми типами.

equ выражение

Директива ЕСШ присваивает метке значение, которое определяется как ре­зультат целочисленного выражения в правой части. Результатом этого выражения может быть целое число, адрес или любая строка символов:

truth messagel

var2

crop

db

equ equ equ

ax, truth

messagel ax,var2 1

'Try again$'

4 [si]

;

;  db 'Tryagain$' mov ax, 4[si]

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

метка

mov

метка =. выражение

Директивы и операторы ассемблера

Директива = эквивалентна ЕС>и, но определяемая ею метка может принимать только целочисленные значения. Кроме того, метка, указанная этой директивой, может быть переопределена.

Каждый ассемблер предлагает целый набор специальных предопределенных меток - это может быть текущая дата (@сМе или ??сМе), тип процессора (@сри) или имя того или иного сегмента программы, но единственная предопределенная метка, поддерживаемая всеми рассматриваемыми нами ассемблерами, — $. Она всегда соответствует текущему адресу. Например, команда выполняет безусловный переход на саму себя, так что создается вечный цикл из одной команды.