|
Методические указания по Организации ЭВМ и систем
Лабораторная работа 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.
|