Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit Unit1;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls;
- type
- TForm1 = class(TForm)
- Button1: TButton;
- Edit1: TEdit;
- Edit2: TEdit;
- Edit3: TEdit;
- Edit4: TEdit;
- Edit5: TEdit;
- Edit6: TEdit;
- Edit7: TEdit;
- Edit8: TEdit;
- Edit9: TEdit;
- Edit10: TEdit;
- Edit11: TEdit;
- Edit12: TEdit;
- procedure FormActivate(Sender: TObject);
- procedure Button1Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- var
- Form1: TForm1;
- Edit: array [0..11] of TEdit;
- d: single;
- f: single;
- f0: single;
- f1: single;
- f2: single;
- fld0: single;
- fld1: single;
- implementation
- {$R *.dfm}
- type
- TMat = array [0..5] of single;
- procedure TForm1.FormActivate(Sender: TObject);
- var
- i: Integer;
- begin
- Edit[ 0] := Edit1;
- Edit[ 1] := Edit2;
- Edit[ 2] := Edit3;
- Edit[ 3] := Edit4;
- Edit[ 4] := Edit5;
- Edit[ 5] := Edit6;
- Edit[ 6] := Edit7;
- Edit[ 7] := Edit8;
- Edit[ 8] := Edit9;
- Edit[ 9] := Edit10;
- Edit[10] := Edit11;
- Edit[11] := Edit12;
- for i:=0 to 11 do
- Edit[i].Text := '0';
- fld0 := 0.0;
- fld1 := 1.0;
- end;
- function getDim:single; pascal;
- asm
- mov eax, [ebx+ecx*type single]
- end;
- procedure setDim; pascal;
- asm
- mov [ebx+ecx*type single], eax
- end;
- procedure divDim; pascal;
- asm
- cmp d, 0
- je @divDim_ext
- call getDim
- mov f, eax
- fld f
- fdiv d
- fstp f
- mov eax, f
- call setDim
- @divDim_ext:
- end;
- procedure elmDim; pascal;
- asm
- cmp ecx, 3
- jl @top
- call getDim
- mov f, eax
- fld f
- fmul d
- fstp f
- sub ecx, 3
- call getDim
- mov f1, eax
- fld f1
- fsub f
- fstp f1
- mov eax, f1
- call setDim
- add ecx, 3
- retn
- @top:
- call getDim
- mov f, eax
- fld f
- fmul d
- fstp f
- add ecx, 3
- call getDim
- mov f1, eax
- fld f1
- fsub f
- fstp f1
- mov eax, f1
- call setDim
- sub ecx, 3
- @end:
- end;
- procedure TForm1.Button1Click(Sender: TObject);
- var
- mat: TMat;
- i: Integer;
- begin
- for i:=0 to 5 do
- mat[i] := StrToFloat(Edit[i].Text);
- asm
- // Register sichern
- push ecx
- push ebx
- push edx
- lea ebx, mat
- xor ecx, ecx
- call getDim
- mov d, eax // d := mat[0];
- mov eax, fld1
- call setDim // mat[0] := 1.0;
- inc ecx
- call divDim // mat[1] := mat[1]/d;
- inc ecx
- call divDim // mat[2] := mat[2]/d;
- inc ecx
- call getDim
- mov d, eax // d := mat[3];
- mov eax, fld0
- call setDim // mat[3] := 0.0;
- mov ecx, 1
- call elmDim // mat[4] := mat[4] - ( d * mat[1] )
- inc ecx
- call elmDim // mat[5] := mat[5] - ( d * mat[2] )
- mov ecx, 4
- call getDim
- mov d, eax // d := mat[4];
- mov eax, fld1
- call setDim // mat[4] := 1.0;
- inc ecx
- call divDim // mat[5] := mat[5]/d;
- call getDim
- mov f0, eax
- mov ecx, 1
- call getDim
- mov f1, eax
- mov ecx, 2
- call getDim
- mov f2, eax
- fld f0
- fmul f1
- fstp f0
- fld f2
- fsub f0
- fstp f2
- mov eax, f2
- call setDim // mat[2] := mat[2] - ( mat[5] * mat[1] )
- mov eax, fld0
- mov ecx, 1
- call setDim
- pop ecx
- pop ebx
- pop edx
- end;
- for i:=0 to 5 do
- Edit[i+6].Text := FloatToStr(mat[i]);
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement