Определение меток
Метки позволяют вам присваивать значения идентификаторам. Существует три способа определения меток:
использование операции :;
использование директивы LABEL;
использование операции :: (MASM 5.1).
Операция :
Операция : определяет ближнюю метку кода и имеет синтаксис:
имя:
где "имя" - это идентификатор, который вы не объявляли ранее в исходном коде. Ближние метки кода вы можете размещать на строке кода, где содержится только одна метка, или в начале строки перед инструкцией. Обычно ближние метки кода используются в качестве адреса перехода в инструкциях JMP и CALL в том же сегменте.
Если вы не используете директиву PUBLIC, чтобы метка была доступна из других файлов, она доступна только в текущем исходном файле.
Данная директива работает точно также, как при использовании директивы LABEL для определения ближней метки (NEAR). Например, A: эквивалентно A LABEL NEAR.
Приведем пример использования операции :
jne A ; пропустить следующую инструкцию inc si A: ; jne передает управление сюда
Директива LABEL
Директиву LABEL вы можете использовать для определения идентификатора заданного типа. Заметим, что синтаксис в режимах MASM и Ideal различен. В режиме Ideal задавайте:
LABEL имя сложный_тип
В режиме MASM используйте следующее:
имя LABEL сложный_тип
где "имя" - это идентификатор, который вы не определяли ранее в исходном файле. "Сложный_тип" описывает размер идентификатора и то, ссылается он на код или данные. См. эту главу, в которой можно найти дальнейшую информацию о сложных типах.
Если вы не используете директиву PUBLIC, чтобы метка была доступна из других файлов, она доступна только в текущем исходном файле.
Вы можете использовать директиву LABEL для доступа к элементам различного размера, которые содержатся в структуре данных. Этот принцип иллюстрируется следующим примером:
WORDS LABEL WORD ; доступ к "BYTES" как к ; WORDS BYTES DB 64 DUP (0) mov WORDS[2],1 ; запись в WORDS 1
Директива ::
Директива :: позволяет вам определить с областью действия, выходящей за рамки процедуры, в которой она находится. Это отличается от директивы : тем, что метки, определенные с помощью : имеют область действия только в текущей процедуре. Заметим, что :: отличается от : только когда вы задаете язык в операторе .MODEL. Приведем пример (файл DBLCOLON.ASM):
VERSION M510 .MODEL SMALL,C .CODE
A PROC NOP ASINGLE:NOP ADOUBLE::NOP NOP A ENDP
B PROC NOP JMP ASINGLE ; приведет к ошибке JMP ADOUBLE RET B ENDP END
1 2 3
8 8 8
|