delphi4arab منتديات دلفي للعرب
أسرع طريقة للحصول على طول سلسلة نصية FastStrLen - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : دروس دلفي للمبتدئين (https://delphi4arab.net/forum/forumdisplay.php?fid=13)
+--- الموضوع : أسرع طريقة للحصول على طول سلسلة نصية FastStrLen (/showthread.php?tid=5054)



أسرع طريقة للحصول على طول سلسلة نصية FastStrLen - SMP3 - 24-03-2013

السلام عليكم و رحمة الله وبركاته

كنت قد كتبت قبل أيام دالة تقوم بجلب طول سلسلة نصية 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; 



أسرع طريقة للحصول على طول سلسلة نصية FastStrLen - DeadC0der - 24-03-2013

أكيد ستكون باأسمبلي أسرع لأن الدوال الاخرى تفوم بمجموعة نت التحققات و المقارنات و لكن يمكن القول ان درجة السرعة طفيفة أما عن الطريقة الثانية فهذه تعمل فقط مع النوع String لأن هذا النوع مختلف عن Pchar حيث يتم تخزين الطول في [Address -4[ و الدلفي في حد ذاته يستعمل هذه الطريقة لجلب طول اي نص :p


أسرع طريقة للحصول على طول سلسلة نصية FastStrLen - SMP3 - 24-03-2013

DeadC0der كتب :مختلف عن Pchar حيث يتم تخزين الطول في [Address -4[ و الدلفي ...

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