// 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}