На этом шаге мы рассмотрим правила описания и использования меток.
Начиная с этого и в последующих шагах мы рассмотрим те конструкции, которые мы уже использовали или будем использовать при создании программ.
Метка с двоеточием после имени определяет адрес следующей за меткой команды.
Директива LABEL позволяет определить явно тип метки. Значение же определенной таким образом метки равно адресу команды или данных, стоящих далее. Например:
LABEL L1 DWORD
Выражение <имя> PROC определяет метку, переход на которую обычно происходит по команде CALL. Блок кода, начинающийся с такой метки, называют процедурой. Впрочем, переход на такую метку можно осуществлять и с помощью JMP, как, впрочем, и команду CALL можно использовать для перехода на обычную метку.
В строке за меткой может стоять директива резервирования данных, например:
ERR DB 'Ошибка'
NUM DWORD 0
С точки зрения языка высокого уровня таким образом мы определяем глобальную переменную. С точки же зрения ассемблера нет никакой разницы между командой и данными, поэтому между меткой, определяющей команду, и меткой, определяющей данные, нет никакой разницы. Раз уж речь пошла о данных, перечислим их типы:
С помощью директивы EQU в терминах языков высокого уровня определяются константы. Например: MES EQU "ERROR!", LAB EQU 145H. С noмощью EQU значение данной метке может быть присвоено только один раз. С правой стороны от EQU может стоять выражение с использованием арифметических, логических и битовых операций. Вот эти операции: +, -, *, /, MOD - остаток от деления, AND, OR, NOT, XOR, SHR, SHL. Используются также операции сравнения: EQ, GE, GT, LE, LT, NE. Выражение с операцией сравнения считается логическим и принимает значение 0, если условие не выполняется, и 1 - если выполняется.
С помощью директивы - можно присваивать только целые значения, но зато производить переприсваивание. Заметим, что выражение может являться операндом команды: MOV EAX,16*16-1.
Метка $ всегда определяет текущий адрес.
В MASM метки, стоящие в процедуре, автоматически считаются локальными и, следовательно, имена меток в процедурах могут дублироваться. В TASM все метки по умолчанию считаются глобальными. Чтобы сделать метки, стоящие в процедуре локальными, они должны иметь префикс @@, а в начале программы следует указать директиву LOCALS.
На следующем шаге мы остановимся на структурах.