Найти

Методические указания по Организации ЭВМ и систем

Лабораторная работа 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.
Рейтинг SIMPLETOP.NET
Rambler's Top100 Powered byCeleron©
Бесплатный хостинг от EOMY.NET