Цитата(Leka @ Feb 8 2009, 13:37)

Включая таблицу?
Да. Байты таблицы следуют сразу за вызовом процедуры (их расположение ТИ не оговорила).
При вызове процедуры адрес возврата записывается в стек. Используя байтовую команду команду R+ldd четверка очередных байт таблицы считывается и .... Выход из процедуры осуществляется по модифицированному адресу возврата.
********
Это последнее
;* Purpose : Benchmark an FIR filter. The input values for the filter
;* is an array of 51 16-bit values. The order of the filter is * 17.
;const float COEFF[FIR_LENGTH] =
;{ -0.000091552734, 0.000305175781, 0.004608154297, 0.003356933594,
........0.000305175781, -0.000091552734};
Coeff: .word ….
;/* The following array simulates input A/D converted values */
;const unsigned int INPUT[] =
;{ 0x0000, … 0x0000, 0x0000,;....... 0x0C00, 0x0800, 0x0400};
Input=1000h
;void main(void)
;int i, y; /* Loop counters */
;volatile float OUTPUT[36],sum;
Output=1100h
mainM8:
_for ldl 36 st y LdB output ;;;;;;for(y = 0; y < 36; y++)
_do lddl 0 ctd sum ;;;;sum=0;
_for ldl 8 st i ;;;;;;for(i = 0; i < FIR_LENGTH/2; i++)
Ldwl coeff SpushR
ldwl input ldl 0 ld y adw drop pushB adwl 16 pushA
;;;;sum = sum+COEFF[i] * ( INPUT[y + 16 - i] + INPUT[y + i] );
_do @- ldwA @+ ldwB adw ldwR+ imulw add
_next I dec <сс>
_endo
;;;OUTPUT[y] = sum + (INPUT[y + FIR_LENGTH/2] * COEFF[FIR_LENGTH/2] );
ldwl input+8 ldl 0 ld y adw stwB ldwB ldwR+ imulw ldd Sum add
ldwl output ldl 0 ld y adw pushB stdB
_next y dec <cс>
_endo dropR ret ;;;;;return;
В МК FLOAT использую либо от лености, либо по незнанию вычислений с фиксированной точкой. Поэтому считаем, что не смтря на их 5-разрядный АЦП мы получаем 16-разрядные коды. Что бы сохранить погрешность на уровне младшего разряда, коэффициенты также принимаем 16-битными, МАК считаем 32-разрядным для предупреждения накопления ошибки вычислений.
Результаты TI MSP430 – 986;ARM thumb – 1528;8051 – 2056;PIC18 – 2006;Atmega8 – 1356.
M8 69(+-) байт кода (без таблицы коэффициентов, иначе + 34 байта) с точностью достаточной для практического применения 8-разрядного МК для решения задач ЦОС, например, звука. Из байт большая и самая запутанная часть ушла на вычисления адресов, а не самого фильтра.
Вывод. Надо срочно менять в системе команд механизмы доступа к данным. Надо отказываться от индесных регистров (содранных с АВР) и вводить другую. Может быть базовую, как в Ренесанс, может быть ... вариантов много. Какой выбрать?