Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 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: 534; Нарушение авторских прав |