Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка (НСиНК) - лабораторные работы.doc
Скачиваний:
24
Добавлен:
15.04.2015
Размер:
356.35 Кб
Скачать

2.3. Использование меток в макросах

Использование меток в макросах имеет следующее ограничение: макрос, в теле которого содержится определение метки, может инстанцироваться только один раз, так как при последующих подстановках будет возникать ошибка повторного определения метки с тем же именем.

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

Например:

macro FEQ ( Res, Arg1, Arg2 )

extern FCmp :label;

own Cont :label;

ar5 = sp;

sp += 2;

[ ar5++ ] = Arg1;

[ ar5 ] = Arg2;

call FCmp;

if carry delayed skip Cont

with Res = false noflags;

sp -= 2;

// cond. skip Cont

if <>0 skip Cont;

Res++;

<Cont>

end FEQ;

Макрос FEQ(), использующий собственную метку Cont для организации внутреннего ветвления, может инстанцироваться более одного раза.

Использование спецификатора own при объявлении метки возможно только внутри тела макросов.

2.4. Импорт макросов из макробиблиотек

Возможность использования макросов из внешних макробиблиотечных файлов на уровне языка реализует директива

import from.

Объявление внешних макросов с помощью директивы импорта предписывает ассемблеру включить определения указанных макросов из некоторой внешней макробиблиотеки. Имя_библиотеки считается чистым именем файла макробиблиотеки; оно должно быть задано без пути и может быть задано без расширения, если расширение файла библиотеки не отличается от стандартного (.mlb).

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

Примеры объявлений внешних макросов:

import mode_constants from com_decl.mlb;

import mode_constants, irqtab_layout from

com_decl.mlb;

import from com_decl.mlb;

Здесь первая директива включает из библиотеки com_decl.mlb один указанный макрос, вторая - два макроса, третья - все макросы библиотеки.

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

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

3. Пример простейшей программы

Исходный текст примера содержится в файле step13а.asm в каталоге:

..\Tutorial\Step13а

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

Файл “macros1.asm” Макрос осуществляет копирование одного массива данных в другой.

macro AAA (Arg1, Arg2, Arg3)

own Loop: label;

gr1 = Arg3;

gr1--;

<Loop>

if > delayed goto Loop with gr1--;

gr2, ar2=[Arg1++];

[Arg2++]=ar2, gr2;

end AAA;

Файл “macros2.asm”

macro Push_Pop (Arg1)

.if Arg1 xor 1; // начало блока условной компиляции

push ar0, gr0;

push ar1, gr1;

push ar2, gr2;

.endif; // конец блока условной компиляции

.if Arg1; // начало блока условной компиляции

pop ar2, gr2;

pop ar1, gr1;

pop ar0, gr0;

.endif; // конец блока условной компиляции

end Push_Pop;

Комментарии к примеру

В макросе Push_Pop используются возможности условной компиляции. Если в качестве фактического параметра передается ноль, то регистровые пары сохраняются в стеке; если же передана единица, то происходит восстановление регистровых пар из стека. На этапе компиляции в каждом отдельном случае будет подставлен тот или иной фрагмент программного кода.

Блоки условной компиляции формируются с помощью директивы .if.

Создание библиотеки макросов

Для создания библиотеки, содержащей описания макросов AAA и Push_Pop, в командной строке требуется ввести сначала:

asm -mmacros.mlb macros1.asm .

Таким образом, создается библиотека macros.mlb, содержащая макрос ААА.

Для добавления в макробиблиотеку макроса Push_Pop в командной строке используется следующий вызов:

asm -mmacros.mlb -a macros2.asm .

После того как сформирована макробиблиотека, можно осуществлять подстановку макросов в программу.

Файл “main.cpp”

// функция Copy объявлена внешней с Си-связыванием

extern "C" void Copy( long *Src, long *Dst );

long A[16]; // массив исходных данных

long B[16]; // массив результатов

int main()

{

for (int i=0; i<16; i++)

A[i] = 0x0807060504030201*i;

Copy( A, B ); // вызов функции Copy

return 0;

}

Файл “step13a.asm”

global _Copy: label; // объявление глобальной метки _Copy

import from macros.mlb;

begin ".textAAA"

<_Copy>

ar5 = ar7 – 2;

Push_Pop(0); // подстановка макроса (сохранение регистров)

ar0 = [--ar5]; // в ar0 адрес исходного массива А

ar1 = [--ar5]; // в ar1 адрес массива результата В

AAA(ar0, ar1, 16); // подстановка макроса ААА

Push_Pop(1); // подстановка макроса (восстановление регистров)

return;

end ".textAAA";

Компиляция примера

Для компиляции примера необходимо в командной строке ввести команду:

nmcc -g -m Step15a.asm main.cpp –I..\Include -oStep15a.abs, где Include – каталог, в котором содержатся необходимые макробиблиотеки.