Иллюстрированный самоучитель по Assembler

Макросредства ассемблера

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

Макроязык позволяет выполнять или не выполнять трансляцию отдельных участков программы в зависимости от некоторого нами же определяемого условия (условная трансляция); осуществлять размножение участка исходного текста программы, в том числе, с модификацией каждого повторения (блоки повторения); включать в программу написанные отдельно фрагменты с настройкой их текста в соответствии с заданными параметрами (макрокоманды).

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

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

Блоки повторения

Блоки повторения заставляют транслятор повторить заданный блок исходного текста указанное число раз. Повторяемый блок может состоять из директив описания данных (и тогда он включается в состав сегмента данных) или из команд процессора (и тогда он описывается в программном сегменте). Например, следующий фрагмент сегмента данных позволяет образовать массив, состоящий из кодов ASCII прописных русских букв:

sym='A'; Начальное значение временной переменной
symbols:; Имя массива для ссылок на него
rept 32; Повторять столько раз
db sym; Повторяемая директива
sym=sym+1; Изменение переменной
endm; Конец блока повторения

Как видно из приведенного фрагмента, блок повторения начинается с директивы ассемблера rept (от repetition, повторение), а заканчивается директивой endm (end macro, конец макроса). Реально в сегменте данных выделяется 32 байт, заполненных числами от 81h до 9Fh, которые предполагается рассматривать, как последовательность русских букв. Того же результата можно было достигнуть с помощью следующего предложения:

symbols db "А", "Б", "В", "Г", и т.д. до буквы Я

Или проще, хотя и менее наглядно:

symbols db 128.129.130.131, и т.д. до числа 159.

Макрос повторения несколько сокращает время, требуемое для описания в тексте программы требуемого массива, хотя, возможно, снижает наглядность этого описания.

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

in AL,300h; Первое обращение к оборудованию
jmp a; Задержка на время
a: jmp b; выполнения
b: jmp с; трех команд jmp
c: in AL,301h; Следующее обращение к оборудованию

Для того, чтобы не создавать много ненужных, в сущности, меток, такого рода предложения часто записывают следующим образом:

in AL, 300h; Первое обращение к оборудованию
jmp $+2; Задержка на время
jmp $+2; выполнения
jmp $+2; трех команд jmp
in AL,301h; Следующее обращение к оборудованию

Здесь используется обозначение счетчика текущего адреса S. При трансляции любой команды в счетчике текущего адреса содержится адрес этой команды (смещение ее первого байта). Команда короткого перехода занимает 2 байт, поэтому команда jmp $+2 осуществляет переход на команду, идущую следом.

Часто в подобных случаях ограничиваются одной командой jmp, которая создает необходимую задержку в доли микросекунды. В тех случаях, однако, когда устройство сопряжения с оборудованием работает заметно медленнее процессора, приходится включать между командами обращения к портам 5-6 команд jmp. Такой фрагмент можно оформить в виде блока повторения:

rept 6 jmp $+2 endm

Это, пожалуй, проще, чем писать 6 команд jmp.

Макросы повторения имеют несколько разновидностей, которые мы не будем здесь рассматривать.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.