|
Методические указания по Организации ЭВМ и систем
Лабораторная работа 13.
Пример решения в системе программирования Delphi (файл проекта *.dpr):
program Lab_11; // This program was made by Doroshenko Igor
{$APPTYPE CONSOLE} // Date: 27 of October
{$Optimization off} // variant ¦ 1
Uses // A * (B + C) + D
SysUtils;
Const
n = 3;
Type
TMatrix = array[0..n, 0..n] of single;
Var
a,b,c,d:TMatrix;
i,j:integer;
//-------------------------------------------------------------------
Procedure WriteMas(m:TMatrix);
Var
i,j:integer;
begin
For i:=0 to n do
begin
Writeln;
for j:=0 to n do
Write(m[i,j]:8:1);
end;
Writeln;
end;
//-------------------------------------------------------------------
Procedure AddMatrix( x,y:Tmatrix; Var z:Tmatrix);
Var
zz:Tmatrix;
begin
Asm
pusha
movups xmm0, dqword ptr [x]
movups xmm1, dqword ptr [y]
movups xmm2, dqword ptr [x+16]
movups xmm3, dqword ptr [y+16]
movups xmm4, dqword ptr [x+32]
movups xmm5, dqword ptr [y+32]
movups xmm6, dqword ptr [x+48]
movups xmm7, dqword ptr [y+48]
addps xmm0, xmm1
addps xmm2, xmm3
addps xmm4, xmm5
addps xmm6, xmm7
movups dqword ptr [zz], xmm0
movups dqword ptr [zz+16], xmm2
movups dqword ptr [zz+32], xmm4
movups dqword ptr [zz+48], xmm6
popa
end;
z:=zz;
end;
//-------------------------------------------------------------------
Procedure MulMatrix( a,b:Tmatrix; Var z1:Tmatrix);
Var
c, temp : Tmatrix;
z : array[0..n] of single;
begin
Asm
pusha
mov eax, dword ptr [b] // transposition -- beginning
mov dword ptr [temp], eax
mov eax, dword ptr [b+16]
mov dword ptr [temp+4],eax
mov eax, dword ptr [b+32]
mov dword ptr [temp+8],eax
mov eax, dword ptr [b+48]
mov dword ptr [temp+12],eax
mov eax, dword ptr [b+4]
mov dword ptr [temp+16], eax
mov eax, dword ptr [b+4+16]
mov dword ptr [temp+16+4],eax
mov eax, dword ptr [b+4+32]
mov dword ptr [temp+16+8],eax
mov eax, dword ptr [b+4+48]
mov dword ptr [temp+16+12],eax
mov eax, dword ptr [b+8]
mov dword ptr [temp+32], eax
mov eax, dword ptr [b+8+16]
mov dword ptr [temp+32+4],eax
mov eax, dword ptr [b+8+32]
mov dword ptr [temp+32+8],eax
mov eax, dword ptr [b+8+48]
mov dword ptr [temp+32+12],eax
mov eax, dword ptr [b+12]
mov dword ptr [temp+48], eax
mov eax, dword ptr [b+12+16]
mov dword ptr [temp+48+4],eax
mov eax, dword ptr [b+12+32]
mov dword ptr [temp+48+8],eax
mov eax, dword ptr [b+12+48]
mov dword ptr [temp+48+12],eax // transposition -- end
xor esi, esi
@cycle:
// begin c[esi,0]
movups xmm0, dqword ptr [a+esi] // line1 * column2
movups xmm1, dqword ptr [temp]
mulps xmm1, xmm0
movups [z], xmm1
fld dword ptr [z]
fld dword ptr [z+4]
fld dword ptr [z+8]
fld dword ptr [z+12]
fadd
fadd
fadd
fstp dword ptr [c+esi]
// end c[esi,0]
// begin c[esi,1]
movups xmm1, dqword ptr [temp+16]
mulps xmm1, xmm0
movups [z], xmm1
fld dword ptr [z]
fld dword ptr [z+4]
fld dword ptr [z+8]
fld dword ptr [z+12]
fadd
fadd
fadd
fstp dword ptr [c+4+esi]
// end c[esi,1]
// begin c[esi,2]
movups xmm1, dqword ptr [temp+32]
mulps xmm1, xmm0
movups [z], xmm1
fld dword ptr [z]
fld dword ptr [z+4]
fld dword ptr [z+8]
fld dword ptr [z+12]
fadd
fadd
fadd
fstp dword ptr [c+8+esi]
// end c[esi,2]
// begin c[esi,3]
movups xmm1, dqword ptr [temp+48]
mulps xmm1, xmm0
movups [z], xmm1
fld dword ptr [z]
fld dword ptr [z+4]
fld dword ptr [z+8]
fld dword ptr [z+12]
fadd
fadd
fadd
fstp dword ptr [c+12+esi]
add esi, 16
cmp esi, 64
jne @cycle
// end c[esi,3]
popa
end;
z1:=c;
end;
//-------------------------------------------------------------------
begin
For i:=0 to n do
for j:=0 to n do
begin
a[i,j]:=i*10+j;
b[i,j]:=i*10+j;
c[i,j]:=i*10+j;
d[i,j]:=i*10+j;
end;
Writeln; Writeln;
Writeln('A,B,C,D = ');
WriteMas(b);
Addmatrix(b,c,c); // ( B + C ) = C
MulMatrix(a,c,c); // ( A * C ) = C
Addmatrix(d,c,c); // ( D + C ) = C
Writeln; Writeln;
Writeln(' A*(B+C)+D=');
WriteMas(c);
Writeln; Writeln;
Writeln('Press Enter');
Readln;
end.
|