دالة FastCharPos
#1
السلام عليكم ورحمة الله وبركاته
اليوم وجدت بعض الوقت , لذلك أحببت أن أتسلى قليلا مع الأسمبلي Smile
هذه دالة تعمل على جلب موقع char في سلسلة نصية :
البرامتر :
Str : السلسلة النصية التي تحتوي على المحرف المراد البحث عن مكانه
chr : المحرف الذي تريد البحث عنه ضمن السلسلة النصية
IgnoreCase :حساسية الأحرف , تكون True ان لم ترد التفريق بين المحرف الكبير و الصغير
مثلا : m=M , تكون False اذا أردت التفريق بين المحرف الكبير و الصغير
offset : مكان بدأ عمل الدالة في السلسلة النصية
Return Value :
اذا نجحت الدالة ستعود بقيمة لمكان تواجد المحرف في السلسلة النصية
اذا لم تنجح الدالة أو لم يتم العثور على المحرف فتعود بصفر

PHP كود :
///    <summary>
  ///      FastCharPos function developed by SMP3
  ///    </summary>
  ///    <param name="Str">
  ///      Is a*string* that contains the sequence to be found .
  ///    </param>
  ///    <param name="chr">
  ///      Is a character to be searched.
  ///    </param>
  ///    <param name="IgnoreCase">
  ///      Set to True if you wana ignore case
  /// <para> <c> Ex: </c> </para>
  /// <para> IF IgnoreCase is True  : 'M' and 'm' are the same char .</para>
  ///    <para> IF IgnoreCase is False : 'M' and 'm' are not the same char.</para>
  ///    </param>
  ///    <param name="offset">
  ///      Start from specific place or char .
  ///    </param>
  ///    <returns>
  ///      <para>
  ///        If the function succeeds, the return value is the char index in str.
  ///      </para>
  ///      <para>
  ///        If the function fails, the return value is zero.
  ///      </para>
  ///    </returns>
 
function TForm1.FastCharPos(Str:String;const chr :char;const IgnoreCase:BOOL;const offset :integer=0 ):Integer;assembler;
 
asm
    PUSH EBX
    PUSH ESI
    MOV ESI
,DWORD PTR SS:[ebp+7]
    
ROR ESI,8
    PUSH ESI
  
{$IFDEF UNICODE}
    
IMUL ESI,2
  
{$ENDIF}
    
ADD EAX,ESI
    POP ESI
    
XOR EDI,EDI
    TEST EAX
,EAX
    JE 
@RFALSE
 
@LOOP:
    
MOV BL,BYTE PTR DS:[EAX]
    
CMP BL,DL
    JE 
@EQU
    TEST ECX
,ECX
    JNE 
@IGNORECASE
    JMP 
@CASE
 @
IGNORECASE:
    
MOV BH,BL
    CMP BH
,DL
    JLE 
@LESS
    SUB BH
,DL
    JMP 
@GREAT
 
@LESS:
    
PUSH EDX
    SUB DL
,BH
    MOV BH
,DL
    POP EDX
 
@GREAT:
    
CMP BH,32
    JE 
@EQU
 
@CASE:
    
INC ESI
  
{$IFDEF UNICODE}
    
ADD EAX,2
  
{$ELSE}
    
INC EAX
  
{$ENDIF}
    
TEST BL,BL
    JNE 
@LOOP
    JMP 
@RFALSE
 
@EQU:
    
MOV EAX,ESI
    JMP 
@FIN
 
@RFALSE:
    
MOV EAX ,-1
 
@FIN:
    
INC EAX
    POP ESI
    POP EBX
 end
; 

مثال للاستعمال :


PHP كود :
ShowMessage(IntToStr(FastCharPos('Assembly','S',True)));
ShowMessage(IntToStr(FastCharPos('Assembly','S',False)));
ShowMessage(IntToStr(FastCharPos('Assembly','s',False,2))); 
الرد


الردود في هذا الموضوع
دالة FastCharPos - بواسطة SMP3 - 15-03-2013, 05:19 PM
دالة FastCharPos - بواسطة syscall - 16-03-2013, 02:56 AM
دالة FastCharPos - بواسطة SMP3 - 16-03-2013, 10:11 AM

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم