![]() |
|
[تمرين] : عمل محاكاة للدالة rgb - نسخة قابلة للطباعة +- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum) +-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3) +--- قسم : تمارين دلفي وحلول (https://delphi4arab.net/forum/forumdisplay.php?fid=16) +--- الموضوع : [تمرين] : عمل محاكاة للدالة rgb (/showthread.php?tid=5172) |
[تمرين] : عمل محاكاة للدالة rgb - SMP3 - 01-05-2013 شيئ آخر أخي ALmuhhnad الدالة MakeRGB .. تعمل على 32 بت فقط !!! ان كنت تمتلك نظام 64 بت , فجرب أن تقوم بتحويلها . [تمرين] : عمل محاكاة للدالة rgb - ALmuhhnad - 01-05-2013 هههه .. عذراً على عدم تركيزي ... فانا ابرمج برنامج الآن P: PHP كود : function MakeRGB(R,G,B : Byte):Cardinal ;حل آخر لـ MakeRGB PHP كود : function MakeRGB(R,G,B : Byte):Cardinal ;أعتقدت ان هناك طريقة لتصغير كود الاسمبلي ... فانا لم اكتب دوال اسمبلي من قبل P: لذلك لم اعرف ان البار متراات تتوجه إلى المسجلات تلقائياً ... او بعمنى اصح لا اعرف اي المسجل يحتوب R او G أو B شكراً على التعديل ![]() ------ إقتباس :شيئ آخر أخي ALmuhhnad الدالة MakeRGB .. تعمل على 32 بت فقط !!!لا للاسف لا املك ... اضن ذلك يرجع لإختلاف الاوامر او سعة المسجلات في 64 [تمرين] : عمل محاكاة للدالة rgb - SMP3 - 01-05-2013 إقتباس :أعتقدت ان هناك طريقة لتصغير كود الاسمبلي ... فانا لم اكتب دوال اسمبلي من قبل P:[COLOR="Navy"]السرعة غير مرتبطة بطول الكود .. ممكن تجد أن كود أطول لكنه أسرع من كود صغير السرعة متعلقة بنوع التعليمات المستعملة على سبيل المثال تعليمة div تعتبر من أبطئ التعليمات على الاطلاق و لا ينصح باستخدامها في Loop الكبيرة .. هل تعلم أن الدالة : PHP كود : function GetBValueX(RGB:Cardinal):Byte;تجربة على السريع : PHP كود : varإقتباس :لذلك لم اعرف ان البار متراات تتوجه إلى المسجلات تلقائياً ... او بعمنى اصح لا اعرف اي المسجل يحتوب R او G أو Bلا , لا تدفع تلقائيا ... هذا على حسب ال calling convention المستعملة مع الدالة ال calling convention الافتراضية لدلفي هي register و لهذا يتم تمرير البرامتر داخل eax ثم edx ثم ecx على التوالي .. ألق نظرة على pascal calling convention (البرامتر يتم دفعها في المكدس و ليس الرجيستر) PHP كود : function MakeRGB(R,G,B : Byte):Cardinal ;pascal;[/COLOR] [تمرين] : عمل محاكاة للدالة rgb - SMP3 - 01-05-2013 إقتباس : اضن ذلك يرجع لإختلاف الاوامر او سعة المسجلات في 64التعليمات لا تختلف كثيرا ... الاختلاف في سعة المسجلات و عددها + في ال calling convention الافتراضية ب 64 بت (fastcall) ملاحظة : في بيئة 64 بت لا يمكن تغيير calling convention على غرار ال 32 بت [تمرين] : عمل محاكاة للدالة rgb - ALmuhhnad - 01-05-2013 معلومة جديدة حول التعليمة div ... حاولت استعمال الضرب ( ثابت بـ مسجل مع التعليمة MUL ) ... ولم انجح لذلك اتخذت ذلك الشكل بالكود ... ولم يطر على بالي التعليمة IMUL ... وذلك يرجع لعدم ممارستي اوامر التجميع ^^" ..إلخ هذا حل آخر على MakeRGB PHP كود : function MakeRGB(R,G,B : Byte):Cardinal;وتستتطيع تبيق هذه الطريقة على بقية الدوال GetRValue,GetBValue,GetGValue
[تمرين] : عمل محاكاة للدالة rgb - SMP3 - 01-05-2013 ALmuhhnad كتب :هذا حل آخر على MakeRGB[COLOR="Indigo"]عمل جد رائع ... هذه أحسن دالة تم وضعها لحد الآن لكن انتبه حجم Cardinal /COLORREF= 4bytes [/COLOR] PHP كود : function MakeRGB(R,G,B : Byte):Cardinal;[تمرين] : عمل محاكاة للدالة rgb - SMP3 - 01-05-2013 إقتباس :وتستتطيع تبيق هذه الطريقة على بقية الدوال GetRValue,GetBValue,GetGValueلم أنتبه لهذا.. لا , غير ممكن الا اذا أرسلت RGB كمؤشر Pointer , أو من خلال استخدام المكدس [تمرين] : عمل محاكاة للدالة rgb - ALmuhhnad - 01-05-2013 PHP كود : function GetRValueX(RGB : Cardinal):Byte;الخاصة بـ B هي التي تحتاج المكدس والمؤشرات
[تمرين] : عمل محاكاة للدالة rgb - SMP3 - 02-05-2013 إقتباس :[COLOR="Red"]الخاصة بـ B هي التي تحتاج المكدس والمؤشرات [COLOR="Purple"]و هل الطريقتين متماثلتان ؟ طبعا لا .. الحالة الأولى : تعاملنا مع ال Result على أساس مصفوفة أما الثانية : تعاملنا مع ال Result على أساس بايت هل اتضحت الصورة ؟[/COLOR] لماذا قمت بوضع قيمة AL في ال Result ؟ بعد أن تتم عملية ال link للدالة GetRValueX .. نحصل على : كود : MOV BYTE PTR DS:[Result],AL
mov al,[ebp-$01]PHP كود : function GetRValueX(RGB : Cardinal):Byte;عند تعاملك مع الأسمبلي .. انسى كل قواعد الباسكال (قم بحذف مصطلح Result من الدالة ) بالنسبة للدالة : كود : function GetBValueX(RGB : Cardinal):Byte;
asm
PUSH EAX
MOV CL,BYTE PTR DS:[ESP+2]
POP EAX
MOV AL,CL
end;قم بحفظ قيمة المسجل ECX ثم في النهاية قم باسترجاعها .. قد لا تظهر لك رسائل الخطأ في بعض الأحيان بسبب أن المسجل غير مستعمل من الكود الذي قبله أو الذي بعده .. لكن كن متيقنا أنك ستصادف رسائل خطأ بسبب عدم استرجاع قيمة المسجل المستخدم [تمرين] : عمل محاكاة للدالة rgb - ALmuhhnad - 02-05-2013 ما شاء الله.. معلم كما عدهتك اخي المبرمج SMP3 ... وشكراً لك على النصائح والمعلومات القيمة ... طريقة كتابة دالتين : PHP كود : function GetRValueX(RGB : Cardinal):Byte;مبهرة بحق ... لم افكر بها ... ما شاء الله عليك هذا تصحيح لما كتبت في GetBValueX PHP كود : function GetBValueX(RGB : Cardinal):Byte; |