Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SP_MET_1.DOC
Скачиваний:
2
Добавлен:
25.08.2019
Размер:
595.97 Кб
Скачать

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

Каждая программа на языке ассемблера содержит кроме команд процес­сора еще и специальные инструкции, указывающие самому ассемблеру, как организовывать различные секции программы, где располагаются данные, а где команды, позволяющие создавать макроопределения, вы­бирать тип используемого процессора, организовывать связи между процедурами и т. д. Эти инструкции условно разделяют на директивы и операторы. Разные ассемблеры используют раз­личные наборы директив. Ассемблер TASM поддерживает набор директив MASM наряду с несовмести­мым собственным, известным как Ideal Mode. Все рассматриваемые ниже примеры рассчитаны на режим MASM, то есть для их подготовки можно использовать оба ассемблера.

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

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

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

Все эти поля могут быть необязательными. Метка может быть любой комби­нацией букв английского алфавита, цифр и символов «_», «$», «@», «?», но цифра не может быть первым символом метки, а символы «$» и «?» иногда могут иметь специальные значения и обычно не рекомендуются к использованию. Большие и маленькие буквы по умолчанию не различаются, но различие обычно можно включить, задав определенную опцию в командной строке ассемблера. Во втором поле, поле команды, может располагаться команда процессора, которая будет транслирована в исполнимый код, или директива, которая не приводит к появлению нового кода, а управляет работой самого ассемблера. В поле операндов располагаются требуемые командой или директивой операнды (то есть нельзя указать операнды и не указать команду или директиву). И наконец, в поле комментариев, начало которого отмечается символом «;» (точка с запятой), можно написать любые символы, — текст от символа «;» до конца строки не анализируется ассемблером.

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

metka: mov ax,5

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

метка label тип

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

mov метка,0

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

call метка

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

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

метка equ выражение

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

truth equ 1

message1 equ ‘Try again$‘

var2 equ 4[si]

cmp ax,truth ; cmp ax,1

db message1 ; db 'Try again$'

mov ax,var2 ; mov ax, 4[si]

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

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

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

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

jmp $

выполняет безусловный переход на саму себя, так что создается вечный цикл из одной команды.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]