أسرع طريقة للحصول على طول سلسلة نصية FastStrLen
#1
السلام عليكم و رحمة الله وبركاته

كنت قد كتبت قبل أيام دالة تقوم بجلب طول سلسلة نصية FastStrLen
PHP كود :
function FastStrLen(const _Str:String):Integer;assembler;
 
//---> BY SMP3 <---
asm
 
XOR EDI,EDI
 TEST EAX
,EAX
 JE 
@NUll
 
@Loop:
 
MOV CL,BYTE PTR [EAX]
 {
$IFDEF Unicode}
 
ADD EAX,2
 
{$ELSE}
 
INC EAX
 
{$ENDIF}
 
INC EDI
 TEST CL
,CL
 JNE 
@Loop
 JMP 
@FIN
 
@NUll:
 
INC EDI
 
@FIN:
 
PUSH EDI
 POP EAX
 DEC EAX
end
; 
.. لكن حين تنقيحي لبعض المشاريع ب Olly , اكتشفت أنه توجد طريقة أسهل و أسرع للحصول على الطول

.jpg   lengthasm.jpg (الحجم : 28.22 ك ب / التحميلات : 43)
لو رجعنا للوراء ب 4 بايت من موقع السلسلة سنشاهد طول السلسلة النصية بالهكس .

في هذا المثال :
Length('Sample Text')= $B = 11
الدالة تصبح بالشكل التالي :

PHP كود :
function FastStrLen (s:string):integer;assembler;
asm
 MOV EAX
,DWORD PTR DS :[EAX-4]
end; 
الرد
#2
أكيد ستكون باأسمبلي أسرع لأن الدوال الاخرى تفوم بمجموعة نت التحققات و المقارنات و لكن يمكن القول ان درجة السرعة طفيفة أما عن الطريقة الثانية فهذه تعمل فقط مع النوع String لأن هذا النوع مختلف عن Pchar حيث يتم تخزين الطول في [Address -4[ و الدلفي في حد ذاته يستعمل هذه الطريقة لجلب طول اي نص :p
الرد
#3
DeadC0der كتب :مختلف عن Pchar حيث يتم تخزين الطول في [Address -4[ و الدلفي ...

نعم .. هذا صحيح @+ أحب أن أضيف أن هذه الطريقة تصلح مع دلفي فقط !!
بالنسبة للأنواع الأخرى مثل PChar فيمكن استعمال الدالة الأولى Big Grin
الرد


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


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