- •Вычислительные системы, сети и телекоммуникации: руководство к лабораторным и практическим занятиям
- •1. Арифметические команды
- •2. Логические команды
- •3. Сдвиговые команды
- •4. Команды передачи управления и управления флагами
- •5. Формат строк ассемблера. Метки и их использование
- •6. Директивы распределения памяти
- •7. Сегменты
- •8. Прерывания
- •9. Директивы порядка загрузки сегментов
- •10. Директивы управления программным счетчиком
- •11. Условия
- •12. Процедуры
- •13. Глобальные объявления
- •14. Макроопределения
- •15. Выражения
- •16. Директивы управления файлами
- •17. Резидентные программы
- •Библиографический список
- •Вычислительные системы, сети и телекоммуникации: руководство к лабораторным и практическим занятиям
- •400005, Волгоград, просп. Ленина, 28, корп.1
- •400005, Волгоград, ул. Советская, 35, корп.7
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, метка, указанная этой директивой, может быть переопределена.
метка = выражение.
