Основные понятия. Макрокоманды



Макрокоманды позволяют создавать собственные операции в рамках языка ассемблера. В действительности макрокоманда-это механизм для замены текста. Генератор макрокоманд (макропроцессор) позволяет определить новый код операции для микропроцессора. При этом ассемблеру также сообщается текст, соответствующий этому коду операции. Когда ассемблер встречает этот новый код операции, он возвращается к месту, где хранится определение макрокоманды. Ассемблер берет указанный текст из определения и помещает его в транслируемый участок программы. Часто повторяемую в программе последовательность команд можно определить в качестве макрокоманды. Всякий раз, когда нужно включить в программу эти команды, программист может воспользоваться макрокомандой.

Использование макрокоманды состоит из двух отдельных этапов. На первом этапе программа определяет макрокоманду. Имя и определением макрокоманды задаются программистом. Определение состоит из ассемблированных операций и команд, которые генерируются всякий раз, когда встречается имя макрокоманды. Второй этап включает вызов макрокоманды. Это происходит, когда ассемблер встречает имя макрокоманды, использованное в качестве кода операции. В этом случае ассемблер заменяет имя макрокоманды на ее «расширение» (команды, входящие в ее определение).

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

Формат макроопределения:

 

имя_макрокоманды MACRO [[ формальный параметр,...]]

              тело макроопределения

              EndM

 

Именем макроопределения считается имя, указанное в директиве MACRO. Оно должно быть уникальным в тексте программы.

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

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

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

Макроопределение само по себе никогда не ассемблируется.

Общий вид макровызовa:

 

имя_макрокоманды [[ фактический параметр,..]]

 

Имя должно быть именем ранее определенного в исходном файле макроопределения. Фактическим параметром может быть имя, число или другое значение. Допустимо любое число фактических параметров, но все они должны помещаться в одной строке, разделяясь запятыми, пробелами или TAB-символами.

Если фактических параметров макровызова больше, чем формальных параметров в макроопределении, лишние фактические параметры игнорируются. Если же фактические параметры заданы не все, то формальные параметры, для которых не заданы фактические, замещаются пустыми строками (пробелами). Для определения второго случая могут быть использованы директивы IFB, IFNB, .ERRB, .ERRNB, о которых будет сказано ниже.

В макросредствах имеется возможность передавать список значений в качестве одного параметра. Этот список должен быть заключен в угловые скобки < и >, а сами элементы списка - разделяться запятыми.

В макроопределении могут использоваться метки или имена полей данных. Директива LOCAL позволяет локализовать заданные имена в данном макрорасширении.

Формат

   LOCAL формальное-имя,...

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

??номер

Номер представляет собой 16-ричное число в пределах от 0000 до FFFF.

Директива LOCAL может использоваться только в макроопределении и должна следовать сразу после MACRO. Конец макроопределения обозначается директивой EndM, которая должна находиться в последней строке макроопределения. Выход из макроопределения до достижения директивы ENDM может выполнить директива EXITM, имеющая формат:

EXITM

Выход из макроопределения заключается в прекращении генерации текущего макрорасширения и возврате в точку вызова в исходной программе.

 

 


Дата добавления: 2019-02-12; просмотров: 253; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!