السلام عليكــم ورحمـة الله وبركاتــه ،،
الملل قاتل اليوم ولم اجد ما افعل فقلت اتسلى قليلا بسي و دلفي... على الاقل الواحد يجد ما يفعل
الفكرة بسيطة و ربما يعرفها الكثيرون لكن ربما تنفع احد الاخوة (لا تلوموني اذا لم تفدكم :D ).
ذكر iczelion في درسه الاول في القسم المتعلق بتمرير البراميتر (Parameter Passing Conventions under Win32) ما يلي :
بخصوص طريقة لغة السي في تمرير البارامترات...
اقتباسThe C calling convention passes parameters from right to left, that is , the rightmost parameter is pushed first. The caller is responsible for balancing the stack frame after the call
.
اما بخصوص طريقة الباسكال
اقتباسThe PASCAL calling convention is the reverse of the C calling convention. It passes parameters from left to right and the callee is responsible for the stack balancing after the call
.
لكن هذه الطريقتين لا تستعملان الان في انظمة الوين 32 (حسبما اعرف)...
.. stdcall و fastcall هي الاكثر استعمالا حسب ما اعرف (ارج وان يصحح لي اي شخص يظن انني مخطأ).
لذلك فقد رايت ان اجرب لارى هل دلفي و vc++ 9.0 يستعمل احدى الطريقتين..
قمت بكتابة برنامج بسيط بسي و دلفي يقوم بجمع متغيرين و يضعهما في واحد اخر.
سي:
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
void add(int a, int b);
int res, a,b;
int main(int argc, char *argv[]) {
a= 3;
b= 2;
add(a,b);
}
void add(int a, int b)
{
res = a+b;
}يمكن ان تحول main الى _tmain لكي تستطيع ان تقوم بتنقيح الكود على الفيجوال ستوديو
لا تهتم ب #include "stdafx.h" لان مترجم مكروسوفت يقوم بتضمين ذلك الملف اوتوماتيكيا
نفس البرنامج قمت بكتابته على دلفي 7.
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
var res,a,b:integer;
procedure add(a:integer;b:integer);
begin
res := a+b;
end;
begin
{ TODO -oUser -cConsole Main : Insert code here }
a:=3;
b:=2 ;
add(a,b);
end.قمت بتحميل برنامج الدلفي على اوللي
هل لاحظت العنوان
004011DE --call Project1.00401148
لنحاول ان نرى ما يحتويه
يقوم بجمع EDX+ EAX مباشرة دون اللجوء الى المكدس... هذه هي ال fastcall
ثم قمت بتحميل كود السي في منقح visual studio مباشرة لانه يعطي التنقيح + السورس كود
a= 3; 004113BE mov dword ptr [a (417144h)],3 b= 2; 004113C8 mov dword ptr [b (417140h)],2 add(a,b); 004113D2 mov eax,dword ptr [b (417140h)] 004113D7 push eax 004113D8 mov ecx,dword ptr [a (417144h)] 004113DE push ecx 004113DF call add (4110CDh) 004113E4 add esp,8
العكس تماما في السي مقارنة بدلفي
004113D7 push eax . . 004113DE push ecx 004113DF call add (4110CDh)
يتم نسخ المتغيرين الى المكدس... هذه هي ال stdcall
حسبما اعرف فان ال fastcall اسرع من stdcall...و هذا ما يفسر سرعة الدلفي... :D
التكنيك محفوظ لي :D :D لا تنسبوه لانفسكم في مواضيع اخرى و تقولو تكنيككم و الا فضحتكم ( يا حلاوة :D :D )

