15-03-2013, 05:19 PM
السلام عليكم ورحمة الله وبركاته
اليوم وجدت بعض الوقت , لذلك أحببت أن أتسلى قليلا مع الأسمبلي
هذه دالة تعمل على جلب موقع 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)));