PDA

View Full Version : ادامه مبحث آیا اسمبلی سریعترین EXE ها را دارد؟؟؟



Best Programmer
دوشنبه 27 بهمن 1382, 16:28 عصر
سلام به دوستان.
ابتدای امر به اقای مهندس (دکتر) ایپرایز عزیز بگویم که ؛ من به شخصه بسیار خوشحال میشوم نظرات شما را در این باره بدونم چون شما با مطالعات وسیعی که دارید هر رقیبی را از صحنه به در میکنید و همگی میدانیم که شما با چنان دقتی به سوالات جواب میدهید که دیگر جای سوال چندانی باقی نمی ماند.
خوب ادامه بحث.
بحث دوستانه ما به اینجا کشید که درست عزیز اقای سیداف یه مقایسه کوچیک میان کامپایلر های Borland CB و VC6.0 وVC 7.0 و Intel C++ 8.0 کردند و گفتند که به ترتیب که بیان شد دازای بهینه سازی های بهتری هستند و یه سری اداد دادند که من یادم نیست . البته مرجع این اعداد و مقایسات اعلام نشد .
من جوابی که دادم این بود.
Intel C++8.0 یکی از بهترین کامپایلر های سی میباشد ولی بهترین نیست . من بر طبق مقایسه ایی که خودم در http://www.barnamenevis.org/forum/viewtopic.php?t=7006 قرار داده ام .البته دوست عزیز اقای ایپرایز گفتند که مقایسه نشده . بله اون مقایسه ایی که نمودار داشته باشد و بگوید کدام زبان سریعتر اجرا کرد نیست . این سایت مقایسه ایی (تا اونجا که من درک کردم) برای فیت شدن زبان های محتلف با ان کتابخانه هاست. ابلته در این کار بازم مایکروسافت تقلب کرده است و چون اکثر اعضای این گروه در میکزوسافت هستند بتابراین بهترین نتیچه را کسب کرده است.
ولی خوب مساله Intel C++ 8.0 . من اخرین نسخه ای که ازش پیدا کردم فاقد محیط IDE بود ولی دارای قابلیت های قوی همچون استفاده از SSE2 را دارد که VC6 فاقد این امکان میباشد. همچنین مورد دیگری که من دیدم حجم بسیار پایین فایل اجرایی میباشد. البته من در VC6 میتوانم فایلی که در ابتدا 156KB سایز دارد را به 1024Byte برسانم ان هم تنها با 1 خط اضافه کردن و یه منو بازی.
البته اگر در نوشته های من اشتباهی هست(که حتما هست) به بزرگی خود ان را علم نکنید و بزنید تو سر ما. ما هم آدم هستیم و دامنه علم ما infinite- هست.

Inprise
دوشنبه 27 بهمن 1382, 17:57 عصر
من مجددا" عذرخواهی میکنم :) دوستان علاقه مند هم لطف کنن و بحث رو همینجا ادامه بدن . حقیر هم خدمت خواهم رسید .

موفق باشید

Anti_Evil
سه شنبه 28 بهمن 1382, 00:48 صبح
فقط میتونم بگم متاسفم :(
مطالب بیان شده توسط آقای سیداف بسیار با ارزشمند بودند و خیلی حیف شد که همه مطالب یکجا از بین برود، میتوانست جوابگوی سوالهای بسیاری از افراد باشد ...

Best Programmer
سه شنبه 28 بهمن 1382, 08:20 صبح
سلام . میبینم که علاقه مندان به این بحث در حال افزایش می باشد . من پیشنهاد میدهم که ابتدا Manual های اینتل خوانده شود.البته خودم هنوز کامل نخوانده ام چون حدود 3000 صفحه می باشد .ان هم فقط برای CPU P4 . و این سایت هم دارای مطالب بسیار جالبی می باشد.
http://www.agner.org/assem
و یک کاری هم که گفتم برای کوچک شدن سایز فایل بدین شرح میباشد.
از منوی Create ایتم Active Configuration را انتخاب کنید و مود ان را بر حالب Realese قرار بدهید.(همین الان اگر کامپایل کنید میبینید چه قدر کوچک شد) سپس این خط را در ابتدای برنامه قرار بدهید.


#pragma comment(linker,"/ENTRY:main /FILEALIGN:0x200
/MERGE:.data=.text /MERGE:.rdata=.text
/SECTION:.text,EWR /IGNORE:4078")

توضیح برای کسانی که ممکن است چندان با مقوله PE File ها اشنا نباشند.
همان طور که همگی میدانیم در win32 بیشتر فابل های اجرایی از DLL گرفته تا EXE همگی فرمت PE دارند.البته من اینجا نمی خواهم این فرمت را درس بدهم فقط محض اشنایی.
بهطور ساده میتوان گفت که کد های ما و یا تمام دادههای انالیز شده یا نشده درون بخش هایی به اسم /Sections درون PE فایل قرار میگیرند. حالا به طور پیش فرض انداره این Section ها بزرگ هست و از این مقدار تنها بخشی استفاده میشود و بقیه صفر قرار دارد. اگر ما بتوانیم سایز این Sections را کم کنیم در نتیجه سایز پایانی کوچک تر خواهد شد./FILEALIGN:0x200 /IGNORE:4078
سپس ما میتوانیم این Section ها را Merge کنیم.کمی صبر. دوستان میدانند که Section های .data , .rdata در حالت معمولی فقط خواندنی هستند.
/SECTION:.text,EWR این خط به ما اجازه دسترسی به این Section ها را می دهد.
تمام. امیدوارم که مفید واقع شده باشد.
البته برای اسمبلی هم موارد زیادی هست که در زیر یک مثال کوچک میزنم.
تابع INVOKE :
این تابع برای فراخوانی توانع استفاده میشود.
بهتر هست از Call و Push استفاده شود. البته دوستانی که در این زبان کار میکنند میدانند باید چه کار کنند.