تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
دالة FastStrLen
#1
SMP3 كتب :  
السلام عليكم و رحمة الله وبركاته

كنت قد كتبت قبل أيام دالة تقوم بجلب طول سلسلة نصية FastStrLen
  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 , اكتشفت أنه توجد طريقة أسهل و أسرع للحصول على الطول

لو رجعنا للوراء ب 4 بايت من موقع السلسلة سنشاهد طول السلسلة النصية بالهكس .

في هذا المثال :
Length('Sample Text')= $B = 11
الدالة تصبح بالشكل التالي :
 
 function FastStrLen (s:string):integer;assembler;
asm
 MOV EAX,DWORD PTR DS :[EAX-4]
end;


rose
"   لَا تَسْتَحِ مِنْ إِعْطَاءِ الْقَلِيلِ فَإِنَّ الْحِرْمَانَ أَقَلُّ مِنْهُ  "
أعضاء أعجبوا بهذه المشاركة : the9am3 , MountLegacy , farfes , DarkDeath , adhem , d4rkm4n


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


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