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 – каталог, в котором содержатся необходимые макробиблиотеки.
- Лабораторная работа № 1 Архитектура нейромикропроцессоров семейства NeuroMatrix® nm640х и их функциональные возможности
- 1. Описание и порядок пользования программой nmcalculator
- 1.1. Формирование векторной команды
- 1.2. Разбиение рабочей матрицы и запись весовых коэффициентов
- 1.3. Установка входных значений
- 1.4. Генератор кода
- 2. Порядок выполнения работы
- Лабораторная работа № 2
- 1. Указания к выполнению работы
- 2. Элементы языка ассемблера процессора nm6403
- 2.1. Формат ассемблерных инструкций
- 2.2. Векторные инструкции процессора
- 2.3. Регистры процессора
- 2.3.1. Основные регистры
- 3. Порядок выполнения работы
- 4. Контрольные вопросы
- Лабораторная работа № 3
- 2.3. Использование меток в макросах
- 2.4. Импорт макросов из макробиблиотек
- 3. Пример простейшей программы
- 4. Порядок выполнения работы
- Лабораторная работа № 4
- 1.2. Реализация алгоритма шифрования на процессоре nm6403
- Практическая часть
- 2.1. Реализация алгоритма гост 28147-89 на нейропроцессоре nm6403/6404
- 2.2. Реализация алгоритма гост 28147-89 на эмуляторе вектора векторных команд
- 2.3. Варианты заданий
- 2.4. Удаленный доступ к плате NeuroMatrix
- Библиографический список