Мегаобучалка Главная | О нас | Обратная связь


Макросредства языка Ассемблер



2018-07-06 545 Обсуждений (0)
Макросредства языка Ассемблер 0.00 из 5.00 0 оценок




Макросредства называют самым мощным средством программирования в Ассемблере. Они позволяют генерировать, модифицировать текст программы на Ассемблере на этапе компиляции программы.

К макросредствам относят: блоки повторений, макросы, директивы условной генерации.

Программы, написанные на макроязыке, компилируется в два этапа. I этап: Сначала она переводится на «чистый» язык Ассемблера, т.е. преобразуется к виду, в котором нет никаких макросредств, этот этап называют макрогенерацией. II этап:Затем выполняется ассемблирование - перевод в машинные коды. Макрогенерацию называют ещё препроцессорной обработкой.

Блоки повторения в процессе макрогенерации заменяются указанной последовательностью команд столько раз, сколько задано в заголовке блока, причем набор команд может повторяться в неизменном или модифицированном виде, в зависимости от вида заголовка блока. Набор команд повторяется nраз в том месте программы, где указан блок повторения.

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

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

INCLUDE<имя файла>.

Основное отличие макроса от процедуры заключается, во-первых, в том, что при обращении к ПП управление передаётся на участок памяти, в котором содержится описание ПП, а при обращении к макросу его тело (макроопределение) вставляется на место макрокоманды, т.е. сколько раз мы обратимся к макросу, сколько макрокоманд будет в программе, столько раз повторится макроопределение, вернее, макрорасширение. Макрос «размножается», увеличивая размер программы. Таким образом, применение процедур дает выигрыш по памяти, но использование макросов дает выигрыш по времени, т.к. нет необходимости передавать управление в ПП и обратно (CALL и RET), а также организовывать передачу параметров.

Рекомендация: если повторяются большие фрагменты программ, лучше использовать процедуры, если относительно небольшие, то макросы.

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

 

 

Общий вид блока повторений:

<заголовок>

<тело>

Endm

<тело> - любое количество любых операторов, предложений, в том числе и блоков повторений.

endm определяет конец тела блока. Количество повторений тела и способ модификаций тела блока зависит от заголовка.

Возможны следующие заголовки:

1)REPTn ;n - константное выражение

Оно может быть вычислено на этапе макрогенерации, в результате которого n копий тела блока записывается в данном месте программы на Ассемблере. Например:

В исходном тексте После макрогенерации на этом месте

NEQU 8NEQU 8

REPT N-6 DB 0,1

DB 0,1 DW ?

DW ?DB 0,1

ЕndmDW ?

Для создания массива с начальными значениями от 0 до OFFHдостаточно написать блок повторений:

n = 1

masDB 0 ;имя массива mas

Rept 255 ;начало блока

DB n

n= n + 1

Endm

2) Второй вид заголовка:

IRPP , <V1,V2,…Vk> ;< и > обязательные символы

<тело> ;тело повторяется k раз так, что в i-той копии

Еndm

формальный параметр Р замещается фактическим параметром Vi.

Формальный параметр Р - это локальное имя, не имеющеесмысла вне блока. Если оно совпадает с именем другого какого-либо объекта программы, то в теле блока это просто имя, а неэтот объект. Например:

После макрогенерации

1) IRPreg, <AX, BX, CX, SI>pushAX

Push reg push BX

Endm push CX

Push SI

2) IRP BX ,<5,7,9> add AX , 5

add AX, BX → add AX , 7

EndmaddAX , 9

Здесь ВХ - символическое имя, но не имя регистра ВХ.

Причём, замена формального параметра на фактический - это простотекстовые замены, один участок программы Р заменяется на другой – Vi , т.е. Р может обозначать любую часть предложения или все предложение, лишь бы после замены Р на Vi получилось правильное предложение языка Ассемблер.

3) IRPR , <decwordptr, L: incwordptr>

R W dec wordptr W

jmp M → jmp M

Endm L: inc word ptr W

JmpM

Здесь параметром является имя команды и тип операнда.

3)Видзаголовка:IRPC P , S1S2….SK

IRPCP , S1S2….SK

<тело>

Еndm

P - формальный параметр, Si –символы, любые, кроме пробелов и точки с запятой, если необходимо использовать здесь пробел или точку с запятой, то надо всю последовательность символов записать в угловых скобках. Встречая такой блок, макрогенератор заменяет его на k копий тела так, что в i-той копии параметр Р заменен на символ Si. Например:

IRPC A, 175P add AX , 1

add AX, A → add AX , 7

endm add AX , 5

addAX , P

Макрооператоры:

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

1) & - амперсанд – используется для того, чтобы указать границы формального параметра, выделить его из окружающего текста, при этом в текст программы он не записывается. Например:

а) IRPW, <1,5,7>var1 DW ?

VAR&WDW? → var5 DW ?

Endm var7 DW ?

б) IRPC A, ″ < DB ′A, ″, ″B′

DB ′A, &A, &A&B′ → DB ′A, <, <B’

Endm

Здесь параметры W и А заменяются на фактические параметры только в том месте, где они выделены макрооператором&.

Если знаков & рядом несколько, то макрогенератор удаляет за один проход только один из них, и это используется для организации вложенных блоков повторений и макросов. Например:

IRPCP1, ABIRPCP2, HLincAH

IRPC P2, HL inc A&P2 inc AL

inc P1&&P2 → endm → inc BH

endm IRPC P2, HL inc BL

endmincB&P2

endm

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

а) IPR V , <<1,2>,3> DB 1,2

DB V → DB 3

endm

б) IRPC S, <A; B> DB ´A´

DB ´S´ → DB ´ ; ´

endm DB ´B´

Если в примере б) скобок <> не будет, то символ В будетвосприниматься как комментарий после ;

3) Макрооператор ! - восклицательный знак используетсяаналогично угловым скобкам, но действует только на один следующий символ, так что, если этим символом является один из символов ограничения - запятая, угловая скобка и т.д., то он будет передаваться как параметр или часть параметра.

4)Макрооператор % - процент указывает на то, что следующий за ним текст является выражением, которое должно быть вычислено, и результат передается как параметр. Например:

K EQU 4

………… DW k+1

IRP A, <k+1, % k+1, W% k+1> DW 5

DWA → DWW5

Endm

5)Макрооператор ;; - две точки с запятой определяют начало макрокомментария. Текст макрокомментария не включается в макрорасширения и в листинг программы.

Макросы:

Описание макроса, макроопределение, имеет вид:

<имя макроса>Macro<формальные параметры>

LOCAL<список имен>

<тело>

Endm

Первая строка - это заголовок макроса, имя макроса будетиспользоваться для обращения к этому Макроопределению.Формальные параметры записываются через запятую, это локальныеимена, никак не связанные с объектами программы. КоличествоФормальных параметров не ограничено, но они должны умещаться в однойстроке. Поскольку на место каждой Макрокоманды записываетсяМакрорасширение, кроме того, одни и те же метки могут использоваться ив самой программе, чтобы не возникало ошибки «метка уже определена»,директива LOCAL<список имен> перечисляет через запятую имена меток,которые будут использоваться в теле макроса.

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

Макрокоманда – обращение к макросу:

<имя макроса><фактические параметры>

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

IFx … endif.

C помощью директивы

PURGE<имя макроса>

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

Примеры макросов

1)Использование макросов позволяет составлять программу в терминах более крупных операций. Опишем в виде макроса оператор IFx<ythenGOTOL.

IF_L MACRO x, y, L

Mov AX, x

Cmp AX, Y

JlL

Endm

Используя этот макрос, поиск минимального из 3-х чисел запишется так:

; DX = min (A,B,C)

Mov DX, A

IF_L A, B, M1

Mov DX, B

M1: IF_L DX, C, M2

Mov DX, C

M2: ----------------------

После макрогенерации в программе будет текст:

------------------------------

Mov DX, A

Mov AX, A

Cmp AX, B

Jl, M1

Mov DX, B

M1: mov AX, DX

Cmp AX, C

Jl M2

Mov DX, C

M2: ------------------------------

2) Обращение к процедурам будет нагляднее, если передачу параметров оформить как макрос.

Например: Вычислить CX = NOD(A,B) + NOD(C,D), если есть процедура вычисления NOD(x,y), и результат ее находится в АХ.

CALL_NOD MACRO x, y

Mov AX, x

Mov BX, y

call NOD ; (AX) = NOD(x, y)

Endm



2018-07-06 545 Обсуждений (0)
Макросредства языка Ассемблер 0.00 из 5.00 0 оценок









Обсуждение в статье: Макросредства языка Ассемблер

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...
Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы...
Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной...
Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (545)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.007 сек.)