[Pascal+ASM] función ExtractMemString

Iniciado por WarZ0n3, 11 Mayo 2013, 23:47 PM

0 Miembros y 1 Visitante están viendo este tema.

WarZ0n3

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

Código (pascal) [Seleccionar]

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.