الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

سؤال للمتقدمين في السي

بدأه mandareka في 2 فبراير 2009 · 15 رد · 1,299 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

_cdecl

_fastcall

_stdcall

لماذا وأين تستخدم كل واحدة؟؟

دولة الخلافة الاسلامية في المخاض الاخير وميلادها قريب

حزب التحرير : التزم الطريق الصحيح الشرعي الوحيد لاعادة دولة الخلافة الاسلامية .

الامة الاسلامية متعطشة لقيادة مخلصة لتذوق حلاوة النصر ولن يكون ذلك الا بعودة الخلافة الاسلامية

الامة الاسلامية تحتاج لاحداث تسحقها سحقا وتمعسها معسا لتفكر تفكيرا جماعيا بالتغير لان وحدة المشاعر لوحدها لاتكفي وهذة الاحداث كلها خير

#3

كلها طرق مختلفة لإستدعاء الدوال

في __cdecl

1- إسم الداله يسبقه (_) أو underscore

مثال sum ==> _sum

2- يتم تمرير الparameters من اليمين إلى اليسار

3- يتم إرجاع النتيجة في AL/AX/EAX

أما بالنسبة ل__stdcall فهي خاصة بميكروسوفت

و تشبه __cdecl تماما بإختلاف كيفية تسمية الدالة

فيتم إتباعها ب@ متبوعا بعدد البايتات التي يتم تمريرها للداله

مثال

  1.  
  2. int sum(int, int);
  3.  

تتحول إلى

  1. _sum@8
  2.  

أما بالنسبة ل__fastcall

فيتم تمرير أول parameter في AL/AX/EAX على حسب حجمه

و يتم تمرير ثاني parameter في DL/DX/EDX على حسب حجمه أيضا

بينما يتم تمرير الباقي (إن وجد) عن طريق الstack من اليمين إلى اليسار أيضا

و يتم إرجاع قيمة الداله في AL/AX/EAX

إسم الداله يتحول بنفس الطريقة السابقه في __stdcall

#4
اقتباس
أما بالنسبة ل__fastcall

فيتم تمرير أول Parameter في AL/AX/EAX على حسب حجمه

و يتم تمرير ثاني Parameter في DL/DX/EDX على حسب حجمه أيضا

في مترجم مايكروسوفت :

ECX->EDX->Stack_right2left

في مترجم بورلاند :

EAX->ECX->EDX->Stack_left2right

في مترجم GCC : مثل مايكروسوفت .

يتم زيادة @ قبل اسم الروتين و @ بعد الاسم + عدد البارامترات .

في cdecl يكون الروتين غير مسؤول عن تصحيح مؤشر المكدس Stack قبل العودة للـCaller بينما في الطريقتين الثانيتين يكون الروتين هو المسؤول عن تصحيح مؤشر المكدس .

هناك انواع اخرى ايضا غير هذه .

تم تعديل هذه المشاركة بواسطة GamingMasteR في 2 فبراير 2009 في 20:37

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#5

مشكورين جدا اخواني الكرام

بالنسبة للإختيار الإفتراضي هو cdecl

ولكن لماذا يجب تعريف دالة WinMain كـ stdcall

??

دولة الخلافة الاسلامية في المخاض الاخير وميلادها قريب

حزب التحرير : التزم الطريق الصحيح الشرعي الوحيد لاعادة دولة الخلافة الاسلامية .

الامة الاسلامية متعطشة لقيادة مخلصة لتذوق حلاوة النصر ولن يكون ذلك الا بعودة الخلافة الاسلامية

الامة الاسلامية تحتاج لاحداث تسحقها سحقا وتمعسها معسا لتفكر تفكيرا جماعيا بالتغير لان وحدة المشاعر لوحدها لاتكفي وهذة الاحداث كلها خير

#6

أسأل مايكروسوفت :D .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#7

فعلا يا Gaming Master عندك حق مع إنها مش حتفرق كتير قوي :D

شكلي قريتها من مصدر غلط من غير ما أجربها ...

#8
اقتباس
يتم زيادة @ قبل اسم الروتين و @ بعد الاسم + عدد البارامترات

عدد البارامترات ولا حجمهم؟؟

دولة الخلافة الاسلامية في المخاض الاخير وميلادها قريب

حزب التحرير : التزم الطريق الصحيح الشرعي الوحيد لاعادة دولة الخلافة الاسلامية .

الامة الاسلامية متعطشة لقيادة مخلصة لتذوق حلاوة النصر ولن يكون ذلك الا بعودة الخلافة الاسلامية

الامة الاسلامية تحتاج لاحداث تسحقها سحقا وتمعسها معسا لتفكر تفكيرا جماعيا بالتغير لان وحدة المشاعر لوحدها لاتكفي وهذة الاحداث كلها خير

#9

حجمهم طبعاً , انا قلتها سهوا .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#10
اقتباس
أسأل مايكروسوفت .

هل هذا الفعل مضارع ولا أمر؟؟

دولة الخلافة الاسلامية في المخاض الاخير وميلادها قريب

حزب التحرير : التزم الطريق الصحيح الشرعي الوحيد لاعادة دولة الخلافة الاسلامية .

الامة الاسلامية متعطشة لقيادة مخلصة لتذوق حلاوة النصر ولن يكون ذلك الا بعودة الخلافة الاسلامية

الامة الاسلامية تحتاج لاحداث تسحقها سحقا وتمعسها معسا لتفكر تفكيرا جماعيا بالتغير لان وحدة المشاعر لوحدها لاتكفي وهذة الاحداث كلها خير

#11

أمر , انت اخذتها بجد ولا ايه ؟ :lol:

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#12
اقتباس
أمر , انت اخذتها بجد ولا ايه ؟

والله فكرتك بتحكي جد :lol: :lol: :lol:

دولة الخلافة الاسلامية في المخاض الاخير وميلادها قريب

حزب التحرير : التزم الطريق الصحيح الشرعي الوحيد لاعادة دولة الخلافة الاسلامية .

الامة الاسلامية متعطشة لقيادة مخلصة لتذوق حلاوة النصر ولن يكون ذلك الا بعودة الخلافة الاسلامية

الامة الاسلامية تحتاج لاحداث تسحقها سحقا وتمعسها معسا لتفكر تفكيرا جماعيا بالتغير لان وحدة المشاعر لوحدها لاتكفي وهذة الاحداث كلها خير

#13

لكن السؤال متى استخدمها ؟

استخدمها فقط عندما أريد تصدير الدالة إلى ملف dll .. ولا أعرف لماذا أقوم بهذا ؟

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#14

أخي الشمري يمكنك تصدير دوال تحت اي اسلوب من الثلاثة السابقة , لكن المهم ان لا يكون هناك conflict بين اسلوب الـCaller و الـCallee .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#15

أعتقد إن __cdecl هو الإفتراضي إن لم يستخدم أي معرف, ولكن البعض يضعها لمجرد زيادة الـ portability.

ما يهم في حالة الـ DLL هي import و export.

قد اكون مخطئاً بالكامل :D

#16

شكرا للرد والمعلومة,

أعدت النظر في مشروعي , لم أستخدم أي أسلوب , فقط import و export سادة :-) ... خصوصا أن العمل غالبا على مترجم واحد .

تم تعديل هذه المشاركة بواسطة الشمري في 3 فبراير 2009 في 21:37

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

مواضيع مشابهة