Advertisement
payl

Copy string

Apr 29th, 2012
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 3.54 KB | None | 0 0
  1. program randtest;
  2.  
  3. {$mode objfpc}{$H+}
  4. {$apptype console}
  5.  
  6.  
  7. uses sysutils,CRT;
  8.  
  9.  
  10. type
  11.   TTestProc=function (str:ansistring;startPos:integer;count:integer):ansistring;
  12.  
  13.   function RDTSC(): int64;
  14.   var
  15.   TimeStamp: record case byte of
  16.     1: (Whole: int64);
  17.     2: (Lo, Hi: Longint);
  18.   end;
  19. begin
  20.   {$asmmode intel}
  21.   asm
  22.   db 00Fh,031h
  23.   mov [TimeStamp.Lo],EAX
  24.   mov [TimeStamp.Hi],EDX
  25.   end;
  26.   result:=TimeStamp.Whole;
  27. end;
  28. procedure IsFuncRight(f:TTestProc);
  29. var
  30.   i,j:integer;
  31.   s,ss:ansistring;
  32. begin
  33.   j:=50;
  34.   setlength(s,j);
  35.   for i:=1 to j do s[i]:=inttostr(i)[1];
  36.   asm
  37.     pushad
  38.     end;
  39.     ss:=f(s,0,j);
  40.     asm
  41.     popad
  42.     end;
  43.   if CompareByte(s[1],ss[1],j)=0 then writeln('Dzialanie: OK') else writeln('Dzialanie: FAIL');
  44. end;
  45.  
  46. procedure TestFunc(f:TTestProc;cnt:int64;str_len:integer;il_cnt:integer=5);
  47. var
  48.   i,j,m:integer;
  49.   n:int64;
  50.   s,ss:ansistring;
  51.   t1:int64;
  52.   r1:double;
  53. begin
  54.   r1:=0;
  55.   for m:=0 to il_cnt-1 do
  56.   begin
  57.  
  58.   setlength(s,str_len);
  59.   for i:=1 to str_len do s[i]:=chr(random(256));
  60.   t1:=RDTSC;
  61.   n:=0;
  62.   repeat
  63.     asm
  64.     pushad
  65.     end;
  66.     f(s,0,str_len);
  67.     asm
  68.     popad
  69.     end;
  70.     inc(n);
  71.   until n>=cnt;
  72.   r1:=r1+(RDTSC-t1);
  73.   end;
  74.   r1:=r1/il_cnt;
  75.  
  76.   writeln('Srednia ilosc taktow maszynowych: ',r1:0:2);
  77. end;
  78.  
  79.   function copy_str_1(str: string; startPos: integer; count: integer): string;
  80.   var
  81.     s: string;
  82.   begin
  83.     setLength(s, count);
  84.  
  85.   asm
  86.     mov ESI, str   {ustawiam sourceIndex}
  87.     add ESI, startPos  {ustawiam pozycję, od której kopiować}
  88.     mov EDI, s       {i dest index}
  89.  
  90.     mov ECX, count            {ustawiam ilość powtórzeń}
  91.  
  92.     rep movsb             {kopiuję bajt po bajcie}
  93.   end;
  94.  
  95.     result:=s;
  96.   end;
  97.  
  98. function copy_str_2(str: string; startPos: integer; count: integer): string;
  99. var
  100.   s: string;
  101. begin
  102.   setLength(s, count);
  103.  
  104. asm
  105.   mov ESI, str              {ustawiam sourceIndex}
  106.   add ESI, startPos       {ustawiam pozycję, od której kopiować}
  107.   mov EDI, s                {gdzie kopiować}
  108.   mov ECX, count         {ustawiam licznik - ilość pozostałych znaków}
  109.  
  110.   @check:
  111.     cmp ECX, 4             {jeśli zostało więcej niż 3 znaki, kopiuj po 4 bajty}
  112.     jae @b4
  113.  
  114.     cmp ECX, 2             {jeśli zostało więcej niż 1 znak, kopiuj po 2 bajty}
  115.     jae @b2
  116.  
  117.     cmp ECX, 0             {jeśli już wszystko skopiowano, zakończ}
  118.     je @end
  119.  
  120.   @b1:                        {kopiowanie ostatniego bajtu}
  121.     movsb
  122.     dec ECX;
  123.     jmp @end
  124.  
  125.   @b2:                        {kopiowanie dwóch bajtów}
  126.     movsw
  127.     sub ECX, 2
  128.     jmp @check
  129.  
  130.   @b4:                        {kopiowanie 4 bajtów}
  131.     movsd
  132.     sub ECX, 4
  133.     jmp @check
  134.  
  135.   @end:
  136. end;
  137.  
  138.   result:=s;
  139. end;
  140.  
  141.  
  142. function copy_str_123(str: ansistring; startPos: integer; count: integer): ansistring;
  143. var
  144.   p:pointer;
  145.   begin
  146.     setLength(result, count);
  147.     p:=@result[1];
  148.   {$ASMMODE INTEL}
  149.   asm
  150.     mov ESI, str
  151.     add ESI, startPos
  152.     mov ECX,count
  153.     mov EDI, p
  154.     shr ECX,2
  155.  
  156.     rep movsd
  157.  
  158.     mov EBX,count
  159.     and BL,03h
  160.  
  161.     test BL,BL
  162.     jz @end
  163.  
  164.     cmp BL,2
  165.     je @do2
  166.     cmp BL,1
  167.     je @do1
  168.  
  169.     @do3: movsw
  170.     @do1: movsb
  171.     jmp @end
  172.     @do2: movsw
  173.  
  174.     @end:
  175.   end;
  176.   end;
  177.  
  178. var
  179.   x,y:integer;
  180.  
  181. begin
  182.   randseed:=0;
  183.   writeln('1:');
  184.   IsFuncRight(@copy_str_1);
  185.   TestFunc(@copy_str_1,1000000,10000);
  186.  
  187.   randseed:=0;
  188.   writeln('2:');
  189.   IsFuncRight(@copy_str_2);
  190.   x:=WhereX; y:=WhereY;
  191.   writeln('Idz sobie odpocznij...');
  192.   gotoxy(x,y);
  193.   TestFunc(@copy_str_2,1000000,10000);
  194.  
  195.   randseed:=0;
  196.   writeln('123:');
  197.   IsFuncRight(@copy_str_123);
  198.   TestFunc(@copy_str_123,1000000,10000);
  199.   writeln;
  200.   writeln('Tests complete.');
  201.   readln;
  202. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement