logo
Методичка (НСиНК) - лабораторные работы

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 – каталог, в котором содержатся необходимые макробиблиотеки.