Не получается вызвать Simp_proc. "обнаружена недопустимая адресная привязка" Код | .model MEDIUM ;экспорторуемые данные PUBLIC MMX_proc,Simp_proc,OffsResMmx,OffsResSimp,NumResArray,ElemSize
STACK SEGMENT PARA stack 'STACK' db 400h dup (?) STACK ENDS
DATA SEGMENT PARA USE16 PUBLIC 'DATA' NumResArray DW ? ;количество элементов в результирующем массиве ElemSize DB 0FFh Result_mmx DD 40 DUP(?) ;место в памяти для записи результата вычислений процедуры с командами MMX Result_simp DD 40 DUP(?) ;место в памяти для записи результата вычислений процедуры без команд MMX OffsResMmx DW Result_mmx ;смещение начала массива Result_mmx OffsResSimp DW Result_simp ;смещение начала массива Result_simp count DW ? DATA ENDS
CODE SEGMENT ASSUME cs:code, ds:data, ss:stack .586 .mmx ;*************************************************************************** ; Процедура вычисления суммы двух векторов с использ. MMX * ;*************************************************************************** MMX_proc proc far push bp mov bp,sp ;Возьмем в ecx размер вектора mov si,[bp+6] ;в si адрес вектора a_vector mov di,[bp+8] ;в di адрес вектора b_vector mov cx,[bp+10] ;в cx количество элементов векторов
;Поскольку мы обрабатываем по 4 компоненты, разделим кол-во компонент на 4 shr cx,2 ;Теперь нужно убедится, что мы захватили все компоненты, если это не так, ecx нужно увеличить на 1 ;Проверим на кратность 4м test cx,3 je itFull ;Увеличим счетчик цикла на 1 inc cx itFull: ;Обнуляем сумму и регистр mm7 pxor mm0,mm0 mov word ptr [Result_simp+si],0 movq mm7,mm0 loop2: ;Берем 4 компоненты вектора А movq mm0,[si] ;Берем 4 компоненты вектора B movq mm1,[di] ;Умножаем параллельно 4 копоненты векторов ;Сначала находятся 4 произведения компонентов векторов: ; dwmul1=vecA[0]*vecB[0] dwmul2=vecA[1]*vecB[1] dwmul3=vecA[2]*vecB[2] dwmul4=vecA[3]*vecB[3] ; Далее складываются первое и второе произведение и третье и четвертое: ; dwsum1=dwmul1+dwmul2 dwsum2=dwmul3+dwmul4 ; Получившиеся результаты умножения записываются в регистр mm0... pmaddwd mm0,mm1 ;... и прибавляются к регистру mm7 paddd mm7,mm0 ;Переходим к следующим 4м компонентам add si,8 add di,8 loop loop2 ;Берём результат сложения в mm0 movq mm0,mm7 ;Сдвигаем побитово вправо логически 32 раза psrlq mm7,32 ;Складываем paddd mm7,mm0 movd ax, mm7 mov word ptr [Result_simp+si],ax ;Завершение использования mmx emms mov NumResArray,40 ;результат - число (один элемент массива) mov ElemSize,1 ;размер элемента массива - двойное слово pop bp ret 6 ;выход с очисткой стека MMX_proc endp ;***************************************************************************** ; Процедура вычисления суммы двух векторов без использ. MMX * ;***************************************************************************** Simp_proc proc far push bp mov bp,sp mov si,[bp+6] mov di,[bp+8] mov cx,[bp+10]
;Обнуляем сумму mov word ptr [Result_simp+si],0 loop1: ;Берем компоненту вектора А movsx eax,word ptr [esi] ;Берем компоненту вектора B в ebx movsx ebx,word ptr [edi] ;Перемножаем компоненты edx:eax=eax*ebx mul ebx ;Прибавляем результат умножения к сумме (Отбросим старшую часть - edx) add word ptr [Result_simp+si],ax ;Переходим к следующему компоненту add si, 2 add di, 2 loop loop1 mov NumResArray,40 mov ElemSize,1 pop bp ret 6 Simp_proc endp
CODE ENDS END
|
|