delphi4arab منتديات دلفي للعرب
FastReverseString x86-x64 - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : دروس دلفي للمبتدئين (https://delphi4arab.net/forum/forumdisplay.php?fid=13)
+--- الموضوع : FastReverseString x86-x64 (/showthread.php?tid=5100)



FastReverseString x86-x64 - SMP3 - 02-04-2013

السلام عليكم ورحمة الله و بركاته

دالة FastReverseString تدعم اليونيكود + 64 بت و 32 بت

PHP كود :
// BY SMP3  
{$IFDEF CPUX64 }
 function 
FastReverseString(Str:String):String;
asm

     TEST RCX
,RCX
     JE 
@NULL
     PUSH RSI
     PUSH RDX
     PUSH RBX
     PUSH RCX
     PUSH RDI

     MOV RAX
,RCX
     MOV RDI
,RCX
     MOV R8
,0
     PUSH RDX
     MOV EDX
,[RDX-4]
     
SHL EDX,1
     MOV  EBX 
,EDX
     CALL System
.@LStrSetLength
     POP RDX
     
XOR ESI,ESI
     DEC EBX
     DEC EBX

@NEXT:
//     XOR RAX,RAX
     
MOV AX,[RDX+RBX]
     
MOV [RCX+RSI],AX
     ADD ESI
,2
     SUB EBX
,2
     JNE 
@NEXT
     MOV AX
,[RDX]
     
MOV [RCX+RSI],AX
     MOV RDI
,[RCX]
@
END:
     
POP RDI
     POP RCX
     POP RBX
     POP RDX
     POP RSI
@NULL:
end;

 function 
FastReverseStringA(Str:AnsiString):AnsiString;
asm

     TEST RCX
,RCX
     JE 
@NULL
     PUSH RSI
     PUSH RDX
     PUSH RBX
     PUSH RCX
     PUSH RDI

     MOV RAX
,RCX
     MOV RDI
,RCX
     MOV R8
,0
     PUSH RDX
     MOV EDX
,[RDX-4]

     
MOV  EBX ,EDX
     CALL System
.@LStrSetLength
     POP RDX
     
XOR ESI,ESI
     DEC EBX

@NEXT:

     
MOV AL,[RDX+RBX]
     
MOV [RCX+RSI],AL
     INC ESI
     DEC EBX
     JNE 
@NEXT
     MOV AL
,[RDX]
     
MOV [RCX+RSI],AL
     MOV RDI
,[RCX]
@
END:
     
POP RDI
     POP RCX
     POP RBX
     POP RDX
     POP RSI
@NULL:
end;

{
$ELSE}

function 
FastReverseString(Str:String):String;assembler;
asm
     TEST EAX
,EAX
     JE 
@NULL
     PUSH ESI
     PUSH EDX
     PUSH EBX
     PUSH ECX
     PUSH EDI

     MOV ESI
,EAX
     MOV EBX
,[EAX-4]
     
MOV EAX,EDX
     MOV EDI
,EDX
     
XOR ECX,ECX
     MOV EDX
,EBX
  
{$IFDEF UNICODE}
     
SHL EDX,1
  
{$ENDIF}
     
MOV  EBX ,EDX

     CALL System
.@LStrSetLength
     MOV EDI
,[EDI]
     
XCHG EAX,ESI
     
XOR ESI,ESI
     DEC EBX
  
{$IFDEF UNICODE}
     
DEC EBX
  
{$ENDIF}
@
NEXT:
     XOR 
ECX,ECX
  
{$IFDEF UNICODE}
     
MOV CX,[EAX+EBX]
     
MOV [EDI+ESI],CX
     ADD ESI
,2
     SUB EBX
,2
     JNE 
@NEXT
     MOV CX
,[EAX]
     
MOV [EDI+ESI],CX
  
{$ELSE}
     
MOV CL,[EAX+EBX]
     
MOV [EDI+ESI],CL
     INC ESI
     DEC EBX
     JNE 
@NEXT
     MOV CL
,[EAX]
     
MOV [EDI+ESI],CL
  
{$ENDIF}
     
MOV EAX,[EDI]
@
END:
     
POP EDI
     POP ECX
     POP EBX
     POP EDX
     POP ESI
@NULL:
end;

function 
FastReverseStringA(Str:AnsiString):AnsiString;
asm
     TEST EAX
,EAX
     JE 
@NULL
     PUSH ESI
     PUSH EDX
     PUSH EBX
     PUSH ECX
     PUSH EDI

     MOV ESI
,EAX
     MOV EBX
,[EAX-4] {Str Length}
     
MOV EAX,EDX
     MOV EDI
,EDX
     
XOR ECX,ECX
     MOV EDX
,EBX

     MOV  EBX 
,EDX

     CALL System
.@LStrSetLength
     MOV EDI
,[EDI]
     
XCHG EAX,ESI
     
XOR ESI,ESI
     DEC EBX

@NEXT:
     XOR 
ECX,ECX

     MOV CL
,[EAX+EBX]
     
MOV [EDI+ESI],CL
     INC ESI
     DEC EBX
     JNE 
@NEXT
     MOV CL
,[EAX]
     
MOV [EDI+ESI],CL {Last Char}

     
MOV EAX,[EDI]
@
END:
     
POP EDI
     POP ECX
     POP EBX
     POP EDX
     POP ESI
@NULL:
end;

{
$ENDIF}