#include <stdio.h> #define n 8 // столбцов #define m 8 // строк __int16 a[n][m]= {{1,2,3,4,5,6,7,8}, {2,3,4,5,6,7,8,1}, {3,4,5,6,7,8,1,2}, {4,5,6,7,8,1,2,3}, {5,6,7,8,1,2,3,4}, {6,7,8,1,2,3,4,5}, {7,8,1,2,3,4,5,6}, {8,1,2,3,4,5,6,7}, }; // матрица __int16 c[m]= {-9,-8,-7,-6,-5,-4,-3,-2}; // вектор __int32 d[m], e[m]; // результат int i,j; main(){ for( i=1; i<=n; i++) for( j=1; j<=m;j++) //a[i][j]=rand()/512; for( i=1; i<=m; i++) //c[i]=rand()/512; for( i=1; i<=n; i++){ d[i]=0; for( j=1; j<=m; j++) d[i]+=a[i][j]*c[j]; } __asm{ mov eax,(m*n-m)*2 mov ecx,n l1: pxor mm0,mm0 mov edx,m*2 l2: movq mm1,[a+eax+edx-8] pmaddwd mm1,[c+edx-8] paddd mm0,mm1 sub edx,8 jnz l2 phaddd mm0,mm0 movd [e+ecx*4-4],mm0 sub eax,m*2 loop l1 } printf("\npascal\t\tasm\n"); for( i=1; i<=m; i++) printf("%d\t\t%d\n", d[i],e[i]); } |