اتفاقيات الاستدعاء Calling Conventions مع المناهج
#4
إقتباس :هل تظن ان stdcall هي السبب ؟
لا أظن ذلك...
أعتقد أن الخطأ في اختيار طريقة التمرير الأحسن يسبب نتائج غير متوقعة أو خاطئة ولا يتسبب في الغالب في أخطاء...
أيضا التمرير بـ stdcall هو الأنسب في Win32 لأن الويندوز نفسه يستخدم هذا التمرير.

إقتباس :التى تدفع الى المكدس من اليسار الى اليمين .
بالضبط! كذلك تدفع إلى المكدس، وهذا هو المتفق عليه
غير أن الإتيان بها (أي البحث عن القيم التي ستخزن في السجلات eax, ebx, ecx) ولا أقصد تخزينها، يكون حسب ما لاحظت من اليمين إلى اليسار
أي هنا:
كود :
DefaultCall(1, 2, 3, getOne, getTwo);
سيقوم بتنفيذ getTwo قبل getOne
لاحظ المثال:
PHP كود :
{$APPTYPE CONSOLE}
function 
getTwo: Integer;
begin Write('Two '); Result := 2; end;
function 
getOne: Integer;
begin Write('One '); Result := 1; end;
function 
getThree: Integer;
begin Write('Three '); Result := 3; end;
procedure RegisterCall(eax, ebc, ecx: Integer); register;
begin end;
begin
  RegisterCall
(getOne, getTwo, getThree);
  
Readln;
end. 
[صورة: attachment.php?attachmentid=3070&stc=1&d=1320701641]
كيف تفسر النتائج؟


الملفات المرفقة
.jpg   RegisterCall.JPG (الحجم : 28.02 ك ب / التحميلات : 182)
الرد


الردود في هذا الموضوع
اتفاقيات الاستدعاء Calling Conventions مع المناهج - بواسطة kachwahed - 07-11-2011, 10:41 PM

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


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