دالة FastStrPosEx
#1
السلام عليكم ورحمة الله وبركاته

لقد بدأت العمل على مشروع جديد FastFunctions
FastFunctions :
المشروع عبارة عن اعادة كتابة دوال بالاسمبلي سريعة وتدعم اليونيكود .. حاليا لقد كتبت عدة دوال متوافقة مع x86 لكنها تحتاج الى الاختبار
أنوي دعم x64 لكن ليس في الوقت الراهن ..
المشروع بترخيص MPL Big Grin
الباب مفتوح لم أراد التطوير

أرجـــوا منكم تجربة هذه الدوال واعلامي بأي Bug

PHP كود :
function  _FastCharPos(Str:String;const chr :char;const IgnoreCase:BOOLEAN;const offset :integer=0 ):Integer;assembler;
function  
FastCharPos(Str:String;const chr :char;const IgnoreCase:BOOLEAN ):Integer;assembler;
function  
FastCharPosEx(Str:String;const chr :char;const IgnoreCase:BOOLEAN;const offset :integer=0 ):Integer;assembler;
function  
FastStrPos(Str:String;SubStr:String;const IgnoreCase:Boolean=False):Integer;assembler;
function  
FastStrPosEx(Str:String;SubStr:String;const IgnoreCase:Boolean=False;offset:integer=0):Integer;assembler;


//-------------> BY SMP3 <------------------------

function _FastCharPos(Str:String;const chr :char;
const 
IgnoreCase:BOOLEAN;
const 
offset :integer=0 ):Integer;assembler;
 
asm
     
{EAX =Str}
     {
EDX =chr}
     {
ECX =IgnoreCase}
     
PUSH EBX
     PUSH ESI
     MOV ESI
,DWORD PTR SS:[ebp+7]
     
ROR ESI,8 {offset}
     
PUSH ESI
  
{$IFDEF UNICODE}
     
SHL ESI,1
  
{$ENDIF}
     
ADD EAX,ESI
     POP ESI
     
XOR EDI,EDI
     TEST EAX
,EAX
     JE 
@RFALSE
@LOOP:
     
MOV BL,BYTE PTR DS:[EAX]
     
CMP BL,DL
     JE 
@EQU
     TEST ECX
,ECX
     JNE 
@IGNORECASE
     JMP 
@CASE
@
IGNORECASE:
     
MOV BH,BL
     CMP BH
,DL
     JLE 
@LESS
     SUB BH
,DL
     JMP 
@GREAT
@LESS:
     
PUSH EDX
     SUB DL
,BH
     MOV BH
,DL
     POP EDX
@GREAT:
     
CMP BH,32
     JE 
@EQU
@CASE:
     
INC ESI
  
{$IFDEF UNICODE}
     
ADD EAX,2
  
{$ELSE}
     
INC EAX
  
{$ENDIF}
     
TEST BL,BL
     JNE 
@LOOP
     JMP 
@RFALSE
@EQU:
     
MOV EAX,ESI
     JMP 
@FIN
@RFALSE:
     
MOV EAX ,-1
@FIN:
     
INC EAX
     POP ESI
     POP EBX
end
;

function 
FastCharPos(Str:String;const chr :char;const IgnoreCase:BOOLEAN ):Integer;assembler;
asm
     
{EAX =Str}
     {
EDX =chr}
     {
ECX =IgnoreCase}
     
PUSH EDX
     PUSH EBX
     PUSH ESI
     PUSH EDI
     
XOR EDI,EDI
     
XOR ESI,ESI
     TEST EAX
,EAX
     JE 
@RFALSE
@LOOP:
     
MOV BL,BYTE PTR DS:[EAX]
     
CMP BL,DL
     JE 
@EQU
     TEST ECX
,ECX
     JNE 
@IGNORECASE
     JMP 
@CASE
@
IGNORECASE:
     
MOV BH,BL
     CMP BH
,DL
     JLE 
@LESS
     SUB BH
,DL
     JMP 
@GREAT
@LESS:
     
PUSH EDX
     SUB DL
,BH
     MOV BH
,DL
     POP EDX
@GREAT:
     
CMP BH,32
     JE 
@EQU
@CASE:
     
INC ESI
  
{$IFDEF UNICODE}
     
ADD EAX,2
  
{$ELSE}
     
INC EAX
  
{$ENDIF}
     
TEST BL,BL
     JNE 
@LOOP
     JMP 
@RFALSE
@EQU:
     
MOV EAX,ESI
     JMP 
@FIN
@RFALSE:
     
MOV EAX ,-1
@FIN:
     
INC EAX
     POP EDI
     POP ESI
     POP EBX
     POP EDX
end
;

function 
FastCharPosEx(Str:String;const chr :char;const IgnoreCase:BOOLEAN;const offset :integer=0 ):Integer;assembler;
asm
     TEST EAX
,EAX
     JE 
@NULL
     PUSH EDX
     PUSH ESI
     MOV ESI
,DWORD PTR SS:[EBP+8]  {offset}
     
PUSH ESI
  
{$IFDEF UNICODE}
     
SHL ESI,1
  
{$ENDIF}
     
ADD EAX,ESI
     POP ESI
     PUSH ESI
     CALL FastCharPos
     TEST EAX
,EAX
     JE  
@FIN
     ADD EAX
,ESI
@Fin:

     
POP ESI
     POP ESI
     POP EDX

@NULL:
end;

function 
FastStrPos(Str:String;SubStr:String;const IgnoreCase:Boolean=False):Integer;assembler;
asm


     PUSH EBX
     PUSH EDX
     PUSH EDI
     PUSH ESI
     PUSH ECX
     MOV ESI
,[EDX-4]
     
CMP ESI,1
     JE 
@@@FastCharPos
     JMP 
@@@FastStrPos
@@@FastCharPos : {Length(SubStr)=1 => Is Char}
     
MOV DX,[EDX]
     
CALL FastCharPos
     JMP  
@FIN
@@@FastStrPos:
     
MOV EBX,EAX
     
XOR EDI,EDI
     MOV EAX
,EBX
     MOV ESI
,EDX

@NEXT:

     
POP ECX
     MOV EAX
,EBX
     PUSH EDX
     MOV DX
,[EDX]
     
TEST EDI,EDI
     JNE 
@SUBONE
     JMP 
@NSUBONE
@SUBONE:
     
DEC EDI
@NSUBONE:
     
PUSH EDI
     CALL FastCharPosEx
     TEST EDI
,EDI
     JNE 
@ADDONE
     JMP 
@NADDONE
@ADDONE:
     
INC EDI
@NADDONE:

     
POP EDX
     PUSH ECX
     TEST EAX
,EAX
     JE 
@NOTFOUND
     DEC EAX
     TEST EDI
,EDI
     JE 
@FIRST
     CMP EAX
,EDI
     JNE 
@TRYAGAIN
@FIRST:
     
MOV EDI,EAX
     INC EDI
     JMP 
@NOTFIRST
@TRYAGAIN: {Get Next Index }

     
MOV EDX,ESI
  
{$IFDEF UNICODE}
     
SUB EDX,2
  
{$ELSE}
     
DEC EDX
  
{$ENDIF}
     
MOV EDI,EAX

@NOTFIRST:

  {
$IFDEF UNICODE}
     
ADD EDX,2
  
{$ELSE}
     
INC EDX
  
{$ENDIF}
     
POP ECX
     PUSH ECX
     MOV CX
,[EDX]
     
TEST CX,CX
     JNE 
@NEXT
     JMP 
@RTRUE
@NOTFOUND:
     
JMP @RFALSE
@RTRUE:
     
ADD EAX,2
     SUB EAX
,[ESI-4]
     
JMP @FIN
@RFALSE:
     
MOV EAX,0
@FIN:

     
POP ECX
     POP ESI
     POP EDI
     POP EDX
     POP EBX
end
;
function 
FastStrPosEx(Str:String;SubStr:String;const IgnoreCase:Boolean=False;offset:integer=0):Integer;assembler;
asm
     TEST EAX
,EAX
     JE 
@NULL
     TEST EDX
,EDX
     JE 
@NULL
     PUSH ESI
     MOV ESI
,DWORD PTR SS:[ebp+8] {offset}
     
PUSH ESI
 
{$IFDEF UNICODE}
     
IMUL ESI,2
 
{$ENDIF}
     
ADD EAX,ESI
     POP ESI
     CALL FastStrPos
     ADD EAX
,ESI
     POP ESI
@NULL:

end; 
الرد


الردود في هذا الموضوع
دالة FastStrPosEx - بواسطة SMP3 - 26-03-2013, 10:06 AM

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم