Advertisement
Guest User

Untitled

a guest
Aug 17th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 3.75 KB | None | 0 0
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     Button1: TButton;
  12.     Edit1: TEdit;
  13.     Edit2: TEdit;
  14.     Edit3: TEdit;
  15.     Edit4: TEdit;
  16.     Edit5: TEdit;
  17.     Edit6: TEdit;
  18.     Edit7: TEdit;
  19.     Edit8: TEdit;
  20.     Edit9: TEdit;
  21.     Edit10: TEdit;
  22.     Edit11: TEdit;
  23.     Edit12: TEdit;
  24.     procedure FormActivate(Sender: TObject);
  25.     procedure Button1Click(Sender: TObject);
  26.   private
  27.     { Private declarations }
  28.   public
  29.     { Public declarations }
  30.   end;
  31.  
  32. var
  33.   Form1: TForm1;
  34.   Edit: array [0..11] of TEdit;
  35.   d: single;
  36.   f: single;
  37.   f0: single;
  38.   f1: single;
  39.   f2: single;
  40.  
  41.   fld0: single;
  42.   fld1: single;
  43.  
  44. implementation
  45.  
  46. {$R *.dfm}
  47.  
  48. type
  49.   TMat = array [0..5] of single;
  50.  
  51.  
  52. procedure TForm1.FormActivate(Sender: TObject);
  53. var
  54.   i: Integer;
  55. begin
  56.     Edit[ 0] := Edit1;
  57.     Edit[ 1] := Edit2;
  58.     Edit[ 2] := Edit3;
  59.     Edit[ 3] := Edit4;
  60.     Edit[ 4] := Edit5;
  61.     Edit[ 5] := Edit6;
  62.     Edit[ 6] := Edit7;
  63.     Edit[ 7] := Edit8;
  64.     Edit[ 8] := Edit9;
  65.     Edit[ 9] := Edit10;
  66.     Edit[10] := Edit11;
  67.     Edit[11] := Edit12;
  68.     for i:=0 to 11 do
  69.         Edit[i].Text := '0';
  70.  
  71.     fld0 := 0.0;
  72.     fld1 := 1.0;
  73. end;
  74.  
  75. function getDim:single; pascal;
  76. asm
  77.     mov eax, [ebx+ecx*type single]
  78. end;
  79.  
  80. procedure setDim; pascal;
  81. asm
  82.     mov [ebx+ecx*type single], eax
  83. end;
  84.  
  85. procedure divDim; pascal;
  86. asm
  87.    cmp d, 0
  88.    je @divDim_ext
  89.      call getDim
  90.      mov f, eax
  91.      fld f
  92.      fdiv d
  93.      fstp f
  94.      mov eax, f
  95.      call setDim
  96.    @divDim_ext:
  97. end;
  98.  
  99. procedure elmDim; pascal;
  100. asm
  101.    cmp ecx, 3
  102.    jl @top
  103.    call getDim
  104.    mov f, eax
  105.    fld f
  106.    fmul d
  107.    fstp f
  108.    sub ecx, 3
  109.    call getDim
  110.    mov f1, eax
  111.    fld f1
  112.    fsub f
  113.    fstp f1
  114.    mov eax, f1
  115.    call setDim
  116.    add ecx, 3
  117.    retn
  118.  @top:
  119.    call getDim
  120.    mov f, eax
  121.    fld f
  122.    fmul d
  123.    fstp f
  124.    add ecx, 3
  125.    call getDim
  126.    mov f1, eax
  127.    fld f1
  128.    fsub f
  129.    fstp f1
  130.    mov eax, f1
  131.    call setDim
  132.    sub ecx, 3
  133.  @end:
  134. end;
  135.  
  136. procedure TForm1.Button1Click(Sender: TObject);
  137. var
  138.   mat: TMat;
  139.   i: Integer;
  140. begin
  141.     for i:=0 to 5 do
  142.         mat[i] := StrToFloat(Edit[i].Text);
  143.  
  144.     asm
  145.         // Register sichern
  146.         push ecx
  147.         push ebx
  148.         push edx
  149.  
  150.         lea ebx, mat
  151.  
  152.         xor ecx, ecx
  153.         call getDim
  154.  
  155.         mov d, eax        // d := mat[0];
  156.         mov eax, fld1
  157.         call setDim       // mat[0] := 1.0;
  158.  
  159.         inc ecx
  160.         call divDim       // mat[1] := mat[1]/d;
  161.  
  162.         inc ecx
  163.         call divDim       // mat[2] := mat[2]/d;
  164.  
  165.         inc ecx
  166.         call getDim
  167.  
  168.         mov d, eax        // d := mat[3];
  169.         mov eax, fld0
  170.         call setDim       // mat[3] := 0.0;
  171.  
  172.         mov ecx, 1
  173.         call elmDim       // mat[4] := mat[4] - ( d * mat[1] )
  174.  
  175.         inc ecx
  176.         call elmDim       // mat[5] := mat[5] - ( d * mat[2] )
  177.  
  178.         mov ecx, 4
  179.         call getDim
  180.  
  181.         mov d, eax        // d := mat[4];
  182.         mov eax, fld1
  183.         call setDim       // mat[4] := 1.0;
  184.  
  185.         inc ecx
  186.         call divDim       // mat[5] := mat[5]/d;
  187.  
  188.         call getDim
  189.         mov f0, eax
  190.  
  191.         mov ecx, 1
  192.         call getDim
  193.         mov f1, eax
  194.  
  195.         mov ecx, 2
  196.         call getDim
  197.         mov f2, eax
  198.  
  199.         fld f0
  200.         fmul f1
  201.         fstp f0
  202.         fld f2
  203.         fsub f0
  204.         fstp f2
  205.  
  206.         mov eax, f2
  207.         call setDim      // mat[2] := mat[2] - ( mat[5] * mat[1] )
  208.  
  209.         mov eax, fld0
  210.         mov ecx, 1
  211.         call setDim
  212.  
  213.         pop ecx
  214.         pop ebx
  215.         pop edx
  216.     end;
  217.  
  218.     for i:=0 to 5 do
  219.         Edit[i+6].Text := FloatToStr(mat[i]);
  220. end;
  221.  
  222. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement