Y con la gran ventaja que acepta strings, también he reducido más de 30 instrucciónes.
(*-------------------------------------------------------------------------
Autor : NvK
Descripción : Pos mejorada y optimizada (reducida más de 30 instrucciónes)
Fecha : 22-1-2014
---------------------------------------------------------------------------*)
program _ArachniTrace;
{$APPTYPE CONSOLE}
uses
SysUtils,
System,
WINDOWS;
function
ArachniTrace(StrBuffer, FindMemoryStr: String): PBoolean; assembler;
ASM
@@StartUp:
PUSH EDI
PUSH ESI
PUSH EBX
OR EAX, EAX
JE @@_XOR
OR EDX, EDX
JE @@_XOR
MOV EBX, EAX
MOV EDI, EDX
XOR AL, AL
MOV ECX, 0FFFFFFFFH
REPNE SCASB
NOT ECX
DEC ECX
JE @@_XOR
MOV ESI, ECX
MOV EDI, EBX
MOV ECX, 0FFFFFFFFH
REPNE SCASB
NOT ECX
SUB ECX, ESI
JBE @@_XOR
MOV EDI, EBX
LEA EBX, [ESI-$1]
@@FIND:
MOV ESI, EDX
LODSB
REPNE SCASB
JNE @@_XOR
MOV EAX, ECX
PUSH EDI
MOV ECX, EBX
REPE CMPSB
POP EDI
MOV ECX, EAX
JNE @@FIND
LEA EAX, [EDI-$1]
JMP @@RETURN
@@_XOR:
XOR EAX, EAX
@@RETURN:
POP EBX
POP ESI
POP EDI
END;
Y aca algunos ejemplos:
var
S : String;
FStr : String;
begin
S:= 'ewerter567tPALABRAbtyu23xxx';
FStr:= 'PALABRA';
(* Algunos ejemplos *)
if (@ArachniTrace(S, 'PALABRA')^<>nil) then
WRITELN(FSTR);
if PBoolean(@ArachniTrace(S, 'PALABRA')^)<>nil then
WRITELN(FSTR);
if Assigned( PBoolean(@ArachniTrace(S, 'PALABRA')^) ) then
WRITELN(FSTR);
if Assigned( @ArachniTrace(S, 'PALABRA')^ ) then
WRITELN(FSTR);
ReadLn;
end.