· оганизацию масштабирования;
· защиту от переполнения.
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
*/
.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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.