Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Директива LOCAL





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

М MACRO

...

L :...

...

ENDM

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

...

M à L :...

......

M à L :...

...

Как видно, в окончательном тексте программы появились две команды, помеченные одной и той же меткой L, а это ошибка. Почему так произошло? Дело в том, что имя L не является формальным параметром макроса и потому при макроподстановке ни на что не заменяется, а переносится в макрорасширение без всяких изменений. Вот и получается, что в окончательном тексте программы будет столько меток L, сколько было обращений к данному макросу. Как избежать этой ошибки? Возможный вариант - включить метку L в число параметров макроса и при обращении к макросу указывать различные фактические метки. Однако это плохое решение, поскольку метки, которыми метятся команды тела макроса, - это чисто внутреннее дело макроса, и для того, кто будет пользоваться этим макросом, нет никакого дела до этих меток, придумывать имена для таких внутренних меток - это лишняя работа. Учитывая это, в ЯА предложено иное, более удобное решение данной проблемы. Оно заключается в том, что после заголовка макроса (директивы МАСRО) надо указать специальную директиву макроязыка:

LOCAL v1,..., vk (k>=1),

где vi - имена, используемые в макроопределении (обычно это метки). Тогда при макроподстановке макрогенератор будет заменять эти имена на специальные имена вида??хххх, где хххх - четырехзначное шестнадцатеричное число, т. е. на имена??0000,??0001 и так далее до??РРРР. Правила такой замены следующие. Макрогенератор запоминает номер, который он использовал в последний раз; пусть это был номер n. Когда макрогенератор встречает обращение к макросу, в котором имеется директива LOCAL, то он ставит в соответствие именам, перечисленным в этой директиве, специмена с очередными номерами: специмя??(n+1) для v1, специмя??(n+2) для v2 и т. д., а затем при макроподстановке заменяет каждое вхождение vi на одно и то же специмя??(n+1). Когда макрогенератор встретит новое обращение к этому же или другому макросу, где есть директива LOCAL, то он будет уже использовать специмена с последующими номерами: n+k+1 и т. д. Поэтому в разных макрорасширениях появятся разные специмена, совпадений не будет. Рассмотрим конкретный пример. Опишем макрос, вычисляющий остаток от деления одного натурального числа на другое с помощью вычитания:

MD MACRO R1,R2;r1:=r1 mod r2 (r1,r2-регистры без знака)

LOCAL M, M1

M: CMP R1,R2;;while r1>=r2 do r1:=r1-r2

JMP M1

SUB R1,R2

JMP M

M1: ЕNDМ

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

R1→AX,R2→BX??0017: СМР АХ,ВХ

MD AX,BX ——————————> JB??0018

M→??0017, M1→??0018SUB AX,BX

JMP??0017

??0018:

R1→CX,R2→DX??0019: СМР СХ,DХ

MD CX,DX ——————————> JВ??001А

M→??0019, M1→??0010 SUB СХ,DХ

JMP??0019

??001А:

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

 

Date: 2015-10-21; view: 491; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию