Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Эрни Каспер Программирование на языке Ассемблер...doc
Скачиваний:
120
Добавлен:
09.11.2019
Размер:
954.88 Кб
Скачать

2.6.Директивы подстановок

В Ассемблере могут использоваться подстановки, которые являются очень удобным средством программирования. При помощи директив подстановок программист создает поименованные объекты, которые могут быть использованы в тех или иных местах исходного текста.

Корректное использование подстановок существенно уменьшает влияние описок. Название языка Ассемблер (сборщик) связано не столько с воз- j можностями трансляции (трансляция осуществлялась уже в ЯСК — языке символического кодирования), сколько с возможностью сборки программ из отлаженных текстовых заготовок.

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

Синонимом этой директивы является DEFL. Числовая подстановка может переопределять имя, то есть этой директивой разрешается изменять числовое значение, приписанное имени.

Директива текстовой подстановки присваивает имени, указанному в поле метки, текстовое значение:

имя: .EQU текст

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

Еще одна директива текстовой подстановки позволяет программисту назначить произвольное имя регистру или адресуемому биту. Это имя может иметь до десяти символов и запоминается в отдельном буфере так, что таблица символов не содержит его, и оно не может быть проверено. Таблица регистров заполняется в следующем порядке:

1. Предопределенные имена регистров; 2. Назначенные программистом имена регистров; 3. Назначенные программистом имена битов. Назначение имени производится директивой

имя: .REG аргумент

Синонимом этой директивы является REGISTER. В качестве аргумента директивы могут использоваться предопределенные регистры или биты или ранее определенные имена регистров. Для обозначения бита в аргу­менте указывается имя регистра общего назначения или функционально­го регистра, а затем номер бита, отделяемый от имени регистра точкой. Максимальное количество назначенных имен равно 512.

Гораздо более эффективными являются сложные текстовые подста­новки. Обычно для такого рода конструкций языка используется термин

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

имя: .MACRO аргументы ;текст подстановки .ENDM

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

Говорят, что эта директива вызывает непосредственный выход из макро­са, хотя на самом деле прекращается подстановка текста с заданным именем. Все условно ассемблированные величины запоминаются тем же образом, что и при завершении макроса. В сложных текстовых подста­новках допускается использование меток. Уникальность используемых меток может обеспечиваться двумя способами: явным и неявным. Для явного способа программист должен записать их в определении сложной текстовой подстановки таким образом, чтобы в результате подстановки они были уникальными. В этом случае в состав метки можно включать аргумент. Признаком неявного способа служит символ # в конце имени. В процессе трансляции ассемблер вместо знака # подставляет состоящий из 3 цифр номера подстановки. В этом случае в тексте подстановки длина метки вместе с символом номера не должна превышать 30.

Транслятор хранит определение сложной текстовой подстановки и вставляет ее вместо того оператора исходного текста, в мнемокоде которого записано имя сложной текстовой подстановки. Операнды замещаемого оператора подставляются в текст подстановки вместо аргументов, заданных в определении сложной текстовой подстановки. Указанные в макроопре­делении аргументы являются его формальными параметрами. При вы­полнении подстановки формальные параметры заменяются на фактиче­ские значения, содержащиеся в операндах вызова сложной текстовой подстановки. После выполнения подстановки производится трансляция подставленного текста в машинный код.

Фактические значения аргументов сложной текстовой подстановки Могут иметь любой тип: прямые, косвенные, символьные строки или регистры. Пробелы в аргументах недопустимы, за исключением строк в кодах ASCII; в этом случае строка должна быть заключена в кавычки. Если имена формальных аргументов идентичны, то аргументы будут передаваться любым вложенным макросам. Вложение макросов ограни­чивается только объемом доступного транслятору пространства памяти. Если в качестве фактического значения необходимо использовать запятую, то в качестве разделителя фактических параметров можно использовать скобки. Для этого необходимо перед определением сложной текстовой подстановки использовать директиву .MACDELIM скобка

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

При подстановке может осуществляться замещение части текста] обозначенной как формальный параметр, на фактическое текстовое значение. Для этого аргумент должен отделяться от остального текста символом конкатенации строк, в качестве которого используется символ вертикальной черты (| — шестнадцатеричный код 7С). Выражения с операцией конкатенации (слияния строк) могут использоваться только внутри определения сложной текстовой подстановки. Для того чтобы отличить от числового значения текстовое обозначение числа, последнее записывается в угловых скобках <>, при этом пробел между символом конкатенации и открывающей угловой скобки недопустим.

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

.ARGCHK ON .ARGCHK OFF

Чтобы использовать в вызове подстановки меньшее количество парамет­ров, используется директива ARGCHK OFF. Первоначально проверка включена.

Для проверки наличия аргументов в операнде вызова сложной тек­стовой подстановки в ее определении можно использовать условную директиву

.IFMA выражение

По этой директиве транслятор вычисляет значение выражения и ищет в операнде вызова подстановки аргумент с полученным порядковым номером. При наличии аргумента для подстановки используется текст, предшествующий директиве ELSE, а при отсутствии — следующий за нею. Условие отсутствия аргументов может быть задано посредством условия <выражение>=0. В этом случае, если в строке вызова макроса никакие аргументы не присутствуют, то подставляется текст, предшест­вующий директиве ELSE, а при наличии — следующий за нею. Антонимом этой директивы является IFNMA.

При использовании рекурсивного вызова сложной текстовой подста­новки (использование в тексте подстановки своего собственного имени) для завершения подстановки после определенного количества вложений используется директива

. IFCLEAR

Данная директива не выполняется, если находится внутри ассемблерного блока, который не обрабатывается в силу ложности условия. Она может использоваться в рекурсивном макросе для обработки сбалансированных пар директив IF - ENDIF, позволяя завершиться рекурсивным вызовам подстановки. При рекурсии она выполняет ту же функцию, которую выполняет директива MACEXIT в случае отсутствия рекурсии.

Поскольку сложная текстовая подстановка производится по имени, записанному в поле мнемокода, программисту важно знать, в каком порядке транслятор производит поиск мнемонических описаний. В первую очередь производится поиск в таблице мнемонических обозначений, задающих команды микроконтроллера, затем в таблице макроопределений (сложных текстовых подстановок). После этого следует поиск в таблице директив ассемблера и в последнюю очередь в таблице имен секций. Для переопределения порядка поиска может быть использована директива .MACFIRST ON .MACFIRST OFF

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