Формирование сигналов специальной формы. Применение подпрограмм. Директивы ассемблера, обеспечивающие связь программы и подпрограмм, страница 2

·  оганизацию масштабирования;

·  защиту от переполнения.

7.5. Изобразите алгоритм вычисления отсчёта синусоиды без использования многофункциональных инструкций.  Чем он хуже алгоритма с МФИ?

7.6. В модуле sine.dsp использована аппроксимация функции sin(px). Объясните, чем хуже использование функции sin(x).

7.7. Где и какие приёмы масштабирования применены в работе? Что получится, если не пользоваться ими?

7.8. Где в программе и для чего выполняется операция насыщения?

7.9. Как изменить аргумент программы  в ходе её выполнения?

7.10. Расскажите, чем обеспечивается  и как происходит взаимодействие двух модулей программы: основного и  подпрограммы

7.11. Роль директив EXTERN  и  GLOBAL в модулях программы.

7.12. Особенности трансляции и компоновки программы, состоящей из нескольких модулей.

ПРИЛОЖЕНИЕ

Программы к ЛР № 5

/*         ADSP-2181 Sine Subroutine                                                  файл  Sine.asm

Эта подпрограмма вычисляет значение функции синус  y = sin( x ),  используя полиномиальную аппроксимацию

y = sin(πx) = 3.140625x+0.02026367x2-5.325196x3+0.5446778x4+1.800293x5

в интервале  x = 0 .. 0.5.

Вызываемый параметр

AX0 = x   в формате 1.15

Возвращаемое значение

AR = y   в формате 1.15

    Изменяемые регистры

AY0, AF, AR, MY1, MX1, MF, MR, SR, I3

    Время выполнения  -  25 тактов

*/

.section/data   data1;   

.VAR    sin_coeff[5] = 0x3240, 0x0053, 0xAACC, 0x08B7, 0x1CCE;

// Масштабированные коэффициенты полинома

.section/pm  program;

.GLOBAL  sin;                                               // Описание метки sin как внешней

sin:                                                                  // Метка входа в подпрограмму

I3 = sin_coeff;                                   // Начальный адрес массива коэффициентов

M3 = 1;                                                          // Пост-модификация на 1

L3 = 0;                                                            // Буфер линейный

AY0 = 0x4000;                                               // Константа 01000000...

AR = AX0,  AF = AX0 AND AY0;               // Проверка x на 2-ой, 4-ый квадранты

IF NE AR= -AX0;                                          // Если да, то изменить знак x

AY0 = 0x7FFF;                                               // Константа 01111111...=1

AR = AR AND AY0;                                     // Удаление знакового разряда

MR=0x0000, MY1=AY0;                                          // y = 0, копирование 1

MF=AR*MY1(RND), MX1=DM( I3, M3 );             // z=x*1, чтение coef[1], k=k+1

CNTR = 4;                                                                  // Число проходов цикла

DO approx UNTIL CE;                                              // Цикл вычисления многочлена y

MR = MR+MX1*MF (SS);                                       // y = y + coef[k] * z

approx:  MF = AR*MF(RND),  MX1 = DM(I3,M3);           // z=x*z; чтение coef[k]; k=k+1

MR = MR+MX1*MF(SS);                                         // y = y + coef[последний] * z

SR = ASHIFT MR1 BY 3 (HI);                     // Масштабирование формата 4.12 в 1.15

SR = SR OR LSHIFT MR0 BY 3 (LO);        // то же для слова двойной длины

AR = PASS SR1;                                            // Получение признаков y }

IF LT AR = PASS AY0;                                // Насыщение, если y отрицательно

AF = PASS AX0;                                           // Получение признаков операнда  x

IF LT AR = -AR;                                            // Перемена знака y, если x отрицательно

RTS;                                                                // Возврат из подпрограммы

// Конец  модуля  Sine.asm

/*     ADSP-2181  Main Program                                                       файл  Main.asm

Главная программа, использующая подпрограмму sineдля вычисления одного значения sin(π/2).

*/

.EXTERN  sin;                                   // Директива описания  метки входа в подпрограмму

.section/pm interrupts;                                                           // Таблица векторов прерываний

_reset: JUMP start; NOP; NOP; NOP;                       // Прерывание по сбросу процессора

RTI; NOP; NOP; NOP;                       // Отсутствие других прерываний

RTI; NOP; NOP; NOP;

RTI; NOP; NOP; NOP;

RTI; NOP; NOP; NOP;

RTI; NOP; NOP; NOP;

RTI; NOP; NOP; NOP;

RTI; NOP; NOP; NOP;

RTI; NOP; NOP; NOP;

RTI; NOP; NOP; NOP;

RTI; NOP; NOP; NOP;

RTI; NOP; NOP; NOP;

.section/pm program;

start:    AX0 = 0x4000;                                               // Аргумент, соответствующий углу p/2

CALL  sin;                                          // Обращение к подпрограмме sine

IDLE;                                                  // Останов

// Конец  модуля  Main.asm