Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВС сети и телекомм-практикум.doc
Скачиваний:
45
Добавлен:
01.07.2025
Размер:
614 Кб
Скачать
☆

5. Формат строк ассемблера. Метки и их использование

Итак, мы изучили основные команды ассемблера. Однако, знания одних лишь команд недостаточно для написания программ. Перед тем, как перейти к следующему этапу практической работы, следует изучить такие понятия как директивы, макросы, выражения и т.д. Этому и посвящен следующий раздел теоретического обзора.

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

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

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

Отметим, что все эти элементы не являются обязательными, что мы и увидим в дальнейшем.

Итак, метки. Кое-что о них мы уже знаем, но всегда надо помнить, что метка может состоять из любой комбинации букв и цифр английского алфавита, но цифра никогда не должна стоять на первом месте. Теоретически допустимо использование символов _, $, @, ?, но на практике советую их избегать. Дело в том, что $ и ? иногда имеют специальные значения, а остальные два символа просто не слишком удобны для восприятия. И, само собой, метка не может совпадать с любым словом, которое уже зарезервировано ассемблером.

После метки в строке располагается команда, которая транслируется в исполняемый код, или директива, которая не приводит к появлению нового кода, а управляет работой самого ассемблера. В поле операндов располагаются собственно операнды, требуемые командой или директивой для корректной работы.

Вернемся к особенностям меток. Если метка располагается перед командой процессора, сразу после нее всегда ставится символ «:». В этом случае метка по сути своей является указателем, на который мы переходим, выполняя одну из соответствующих команд.

Другое дело, если метка стоит перед директивой. Тогда она уже не указатель, а один из операндов этой самой директивы. Как правило, ее имя. В этом случае двоеточие не ставится.

Рассмотрение директив начнем с тех. которые напрямую работают с метками и их значениями. Таких директив три: – LABEL, EQU и =.

Директива LABEL определяет метку и задает ее тип. Иными словами, метка получает значение, равное адресу следующей команды или следующих данных, и явно указанный тип.

метка label тип

Тип может быть одним из следующих:

- BYTE (байт);

- WORD (слово);

- DWORD (двойное слово);

- FWORD (6 байт);

- QWORD (учетверенное слово);

- TBYTE (10 байт);

- NEAR (ближняя метка);

- FAR (дальняя метка).

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

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

метка EQU выражение ; общий формат строки

znach EQU 10 ; приравниваем метку к числу

msg EQU 'Privet' ; присваиваем метке строку символов

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

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