[an error occurred while processing this directive]
|
Не надо! Это шутка! Мы говорим только о конкретной подпрограмме. Алгоритм вычислений немного кривоват, извините, надо его выпрямлять. В связи с этим я и спрашивал Вас, ЧТО Вы должны делать с входным массивом, а не КАК. Как Вы это реализовали, я уже вижу, не здорово.
В среднем программа на ассемблере работает быстрее в 6-8 раз, чем программа на Си. Так что у Вас есть шанс добиться нужной производительности, возможно на пределе.
Общие принципы таковы. Избавляйтесь от каскадно вложенных циклов, избавляйтесь от передачи аргументов из программы высокого уровня (на Си) в программу низкого уровня (на ассемблере).
Теперь конкретно по оптимизации. Если у Вас массив Н всегда состоит из 5 элементов Н0,Н1,Н2,Н3,Н4, то предлагаю использовать другой массив такого вида Н0;Н1,Н0;Н2,Н1,Н0;Н3,Н2,Н1,Н0;Н4,Н3,Н2,Н1,Н0. Точками с запятой показаны границы для коэффициентов, используемых для вычисления сумм частных произведений. Далее давайте введем указатели hPtr и yPtr на новый массив коэффициентов Нi и входной массив Yi соответственно. Тогда алгоритм можно изобразить примерно так.
mac *hPtr+,*yPtr+,a ;первая частная сумма
;заметьте hPtr указывает на требуемый коэффициент для второй
;частной суммы, не надо ничего складывать или вычитать
mvmm ar1,yPtr ;выставим указатель снова на Y0
mac *hPtr+,*yPtr+,a
mac *hPtr+,*yPtr+,a ;вторая частная сумма
;здесь надо возвести содержимое ассА в квадрат и добавить к ассВ
;затем надо обнулить ассА для новой частной суммы
;hPtr указывает на требуемый коэффициент для третьей суммы
mvmm ar1,yPtr ;выставим указатель снова на Y0
mac *hPtr+,*yPtr+,a
mac *hPtr+,*yPtr+,a
mac *hPtr+,*yPtr+,a ;третья частная сумма
;hPtr указывает на требуемый коэффициент для четвертой суммы
mvmm ar1,yPtr ;выставим указатель снова на Y0
mac *hPtr+,*yPtr+,a
mac *hPtr+,*yPtr+,a
mac *hPtr+,*yPtr+,a
mac *hPtr+,*yPtr+,a ;четвертая частная сумма
;hPtr указывает на требуемый коэффициент для пятой суммы
mvmm ar1,yPtr ;выставим указатель снова на Y0
mac *hPtr+,*yPtr+,a
mac *hPtr+,*yPtr+,a
mac *hPtr+,*yPtr+,a
mac *hPtr+,*yPtr+,a
mac *hPtr+,*yPtr+,a ;пятая частная сумма
;в ассВ должен лежать готовый результат, его надо сохранить
;в массиве Y2(одна инструкция)
;заметьте yPtr указывает теперь на следующую пятерку
;в Вашем входном массиве БЕЗО ВСЯКИХ ДОПОЛНИТЕЛЬНЫХ арифметических
;действий, пожирающих циклы, как свинья апельсины...
Ну вот в итоге мы пришли-таки к одному циклу, что есть правильно.
Конечно, я дал Вам голую идею, хотя и весьма подробно, Вам надо ее
реализовать поточнее и практически. Если вы возьметесь за такую работу, то любопытно было бы узнать, сколько было циклов в исходном варианте и сколько в окончательном, и сравнить сие с циклами из Си.
Можно еще и дальше пофантазировать...
E-mail: info@telesys.ru