Hace mucho que no hago nada en ASM y ya que hoy en la mañana tuve 2 horas libres y estaba aburrido, retome un pequeño manual de ASM que tenia y en 30 minutos me hice esto, demasiado simple pero muy útil en programación con sockets, espero les sirva.
Lo que hace esta función es extraer un string de otro string defectuoso, puede usarse por ejemplo, para guardar muchas listas defectuosas(en un TStringList claro esta) e ir limpiandolas.
Como explicaba esto es uno de los tantos usos que se le pueda dar, hace no mucho hice una función parecida... aquí la pueden encontrar: http://foro.elhacker.net/programacion_general/funcion_extractstring_pascal-t388927.0.html , solo que esta trabaja más a bajo nivel y con muchas mas rapidez y rendimiento.
Les dejo el código
program ExtractMemString;
{$APPTYPE CONSOLE}
uses
SysUtils,
Classes;
{/*******************************************\}
{ ExtractMemString @Por WARZ0N3 }
{ Explicacion: }
{ Extrae una palabra de un string defectuoso, }
{ muy util en programacion con Sockets. }
{ Pascal+ASM ejecuta el codigo mas optimo y }
{ mucho mas rapido... }
{/*******************************************\}
{ Uso: }
{ __ExtractMemString( }
{ 'Desde_char_a_remover', variable_defectuosa,}
{ 'Hasta_char_a_remover', Lista_strings); }
{\*******************************************/}
{ Ejemplo: }
{ __ExtractMemString('!', '&%!PALABRA-$@', '-', TStringList);}
{ devuelve: PALABRA }
{/*******************************************\}
function __ExtractMemString(from_s:Char; Param:pChar; to_s:Char; TsStrMem:TStringList):pChar;
var
tos, fms:integer;
lnStr:integer;
StrMem:pchar;
CpyStrMem:pchar;
allocStrMem:pchar;
lenStr:integer;
Delim:integer;
sPos:integer;
begin
StrNew(@StrMem);
StrMem:=Param; { palabra defectuosa }
lenStr:=StrLen(pChar(StrMem));
Delim:= LastDelimiter(from_s, StrMem); { desde }
sPos:=Pos(to_s, StrMem); { hasta }
asm
@@startup:
XOR EAX, EAX
MOV EAX, sPos
PUSH EAX
POP tos
DEC tos
CMP EAX, 00000000h
JZ @plSum
JMP @pSum
@plSum: ADD tos, EAX
@pSum:
XOR EBX, EBX
MOV EBX, lenStr
MOV lnStr, EBX
XOR ECX, ECX
MOV ECX, delim
MOV fms, ECX
SUB tos, ECX
end;
allocStrMem:=StrAlloc(lnStr);
StrLCopy(allocStrMem, fms+StrMem, tos); //-$00000003
TsStrMem.Add(allocStrMem);
StrDispose(allocStrMem);
end;
var TsStrMem:TStringList;
begin
TsStrMem:= TStringList.Create;
{*** Llamada a la funcion ***}
__ExtractMemString('!', '**-!PALABRA?**', '?', TsStrMem); { devuelve PALABRA }
WriteLn(TsStrMem[0]);
TsStrMem.Free;
sleep(3500);
end.