Найти

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

Лабораторная работа 13.

Пример решения в системе программирования Delphi (файл проекта *.dpr):

{Массон А.В. гр 22-7  9.12.2003
Лабораторная работа №11 в-9}

program laba11;  {A*B*C*D}    {У меня не работает через F9, а через F8 работает}
{$APPTYPE CONSOLE}
uses
  SysUtils;
Type
  TMatrix=array [0..3,0..3] of single;
procedure ReadMat(var X:TMatrix);
var
  i,j:byte;
begin
  Randomize;
  For i:=0 to 3 do
     for j:=0 to 3 do
      X[i,j]:=random(4);
end;
procedure WriteMatr(X:TMatrix);
var
  i,j:byte;
begin
  for i:=0 to 3 do
    begin
      for j:=0 to 3 do
        write(X[i,j]:7:1);
      writeln;
    end;
end;
procedure Mult(X,Y:TMatrix; var Matr:TMatrix);
var
  Buff,Trans:TMatrix;
  s:array [0..3] of single;
begin
  asm
    {Сначало транспонируем}
     mov eax,dword ptr[Y]
     mov dword ptr[Trans],eax
     mov eax,dword ptr[Y+16]
     mov dword ptr[Trans+4],eax
     mov eax,dword ptr[Y+32]
     mov dword ptr[Trans+8],eax
     mov eax,dword ptr[Y+48]
     mov dword ptr[Trans+12],eax

     mov eax,dword ptr[Y+4]
     mov dword ptr[Trans+16],eax
     mov eax,dword ptr[Y+20]
     mov dword ptr[Trans+20],eax
     mov eax,dword ptr[Y+36]
     mov dword ptr[Trans+24],eax
     mov eax,dword ptr[Y+52]
     mov dword ptr[Trans+28],eax

     mov eax,dword ptr[Y+8]
     mov dword ptr[Trans+32],eax
     mov eax,dword ptr[Y+24]
     mov dword ptr[Trans+36],eax
     mov eax,dword ptr[Y+40]
     mov dword ptr[Trans+40],eax
     mov eax,dword ptr[Y+56]
     mov dword ptr[Trans+44],eax

     mov eax,dword ptr[Y+12]
     mov dword ptr[Trans+48],eax
     mov eax,dword ptr[Y+28]
     mov dword ptr[Trans+52],eax
     mov eax,dword ptr[Y+44]
     mov dword ptr[Trans+56],eax
     mov eax,dword ptr[Y+60]
     mov dword ptr[Trans+60],eax
    {Конец транспонирования}
     pushad
     xor esi,esi
  @1:movups xmm0,dqword ptr[X+esi]{начало подсчета Buff[esi,0]}
     movups xmm1,dqword ptr[Trans]
     mulps xmm1,xmm0
     movups [s],xmm1

     fld dword ptr[s]
     fld dword ptr[s+4]
     fld dword ptr[s+8]
     fld dword ptr[s+12]
     fadd
     fadd
     fadd
     fstp dword ptr[Buff+esi]{начало подсчета Buff[esi,0]}

     movups xmm1,dqword ptr[Trans+16]{начало подсчета Buff[esi,1]}
     mulps xmm1,xmm0
     movups [s],xmm1

     fld dword ptr[s]
     fld dword ptr[s+4]
     fld dword ptr[s+8]
     fld dword ptr[s+12]
     fadd
     fadd
     fadd
     fstp dword ptr[Buff+esi+4]{начало подсчета Buff[esi,1]}

     movups xmm1,dqword ptr[Trans+32]{начало подсчета Buff[esi,2]}
     mulps xmm1,xmm0
     movups [s],xmm1

     fld dword ptr[s]
     fld dword ptr[s+4]
     fld dword ptr[s+8]
     fld dword ptr[s+12]
     fadd
     fadd
     fadd
     fstp dword ptr[Buff+esi+8]{начало подсчета Buff[esi,2]}

     movups xmm1,dqword ptr[Trans+48]{начало подсчета Buff[esi,3]}
     mulps xmm1,xmm0
     movups [s],xmm1

     fld dword ptr[s]
     fld dword ptr[s+4]
     fld dword ptr[s+8]
     fld dword ptr[s+12]
     fadd
     fadd
     fadd
     fstp dword ptr[Buff+esi+12]{начало подсчета Buff[esi,3]}

     add esi,16
     cmp esi,64
     jne @1
     popad
  end;
  Matr:=Buff;
end;
{----------------------------}
var
  A,B,C,D:TMatrix;
  i,j:byte;
begin
  ReadMat(A);
  ReadMat(B);
  ReadMat(C);
  ReadMat(D);
  writeln('A=');
  WriteMatr(A);
  writeln('B=');
  WriteMatr(B);
  writeln('C=');
  WriteMatr(C);
  writeln('D=');
  WriteMatr(D);
  Mult(A,B,B);     {Умножаем A на B и записываем ответ в B}
  Mult(B,C,C);
  Mult(C,D,D);
  writeln('A*B*C*D=');
  WriteMatr(D);
  readln;
end.
Рейтинг SIMPLETOP.NET
Rambler's Top100 Powered byCeleron©
Бесплатный хостинг от EOMY.NET