PDA

View Full Version : تفاوت برنامه های exe و com



samprp
پنج شنبه 03 آبان 1386, 11:12 صبح
سلام دوستان
تفاوت بین برنامه های exe و com را می خواستم .

xxxxx_xxxxx
شنبه 19 بهمن 1387, 01:37 صبح
گرچه تاپيك قديمي هست ولي...

در زمان كدنويسي برنامه هاي com و exe علاوه بر اين كه syntax شان فرق مي كند. تفاوت هاي ديگري هم وجود دارد كه دليلي هستند براي تفاوت syntax، كه به طور خلاصه به آنها اشاره اي مي كنيم:

زماني كه برنامه اي اجرا مي شود (چه com چه exe) تمام دستورات آن به حافظه منتقل مي شود، البته قبل از آن يك ناحيه 256 بايتي (100h) به نام psp در حافظه ايجاد ميشه كه دستورات برنامه همگي بعد از اين ناحيه قرار ميگيرند. و تفاوت ها از اينجا شروع مي شود:

1- در برنامه هاي exe ثبات هاي SS , DS , ES با آدرس شروع psp مقداردهي مي شوند و ثبات CD با آدرس اولين خانه حافظه بعد از psp مقداردهي مي شود (psp+100h). ولي در برنامه هاي com كليه ثبات هاي سگمنت با آدرس شروع psp مقداردهي مي شوند. به همين خاطر است كه در ابتداي برنامه هاي com از دستور ORG 100h استفاده مي كنيم تا كدسگمنت از آدرس 100h (بعد از psp) شروع شود.

2- در برنامه هاي com ثبات IP مقدار 100h و در برنامه هاي exe مقدار 0 مي گيرد.

تفاوت هاي ديگري هم وجود دارد كه من نمي دانم.
احتمالاً بايد بعد از اين ثبات SS با آدرس شروع پشته مقداردهي مي شود(در برنامه هاي exe)
و همينطور ثبات DS با آدرس شروع سگمنت داده مقداردهي مي شود،در برنامه هاي exe اين كار توسط برنامه نويس انجام ميشه.

اگر تفاوت ديگري هست دوستان بفرمايند.

Open-Source
شنبه 19 بهمن 1387, 18:41 عصر
فیلهای COM تنها شامل یک سگمنت هستند که بر اساس محدودیت 64 کیلوبایتی سگمنت ها، نمی توانند محتویاتی
بیش از این 64 کیلوبایت باشند. کد برنامه و داده ها و پشته مورد استفاده بصورت کامل در همین تک سگمنت خواهد بود.
اولین نتیجه ای که از این مقدمه می گیریم اینه که فایلهای COM بصورت عمومی در مقایسه با فایلهای EXE ساده تر و
و معمولا کوچکتر هستند.

حسن فایلهای COM در اینه که چون فقط یک سگمنت دارند، نیازی به آدرس دهی سگمنت آفست نیست و در کد آنها
تنها قسمت آفست ذخیره میشه و بنابراین می تونیم یک فایل COM رو در هر سگمنتی که دوست داشته باشیم اجرا کنیم.
همچنین چون عملیات اضافه ای برای فراخوانی شون انجام نمیشه فایلهای COM سرعت فراخوانی بالایی دارند.
اگه بخوام بصورت دقیق فراخوانی و نحوه اجرا شدن یک فایل COM رو توسط سیستم عامل DOS تشریح کنم :
سیستم عامل محتویات کامل فایل COM رو می خونه و اونو از آفست 100h به بعد یک سگمنت قرار می ده و کنترل اجرا را
به اولین دستور زبان ماشین که در آفست 100h قرار داره میسپاره. به همین سادگی.

اما فایلهای EXE حداقل سه سگمنت دارند، یک سگمنت برای کد و یک سگمنت برای داده و یک سگمنت برای پشته،
در ضمن می توانند برای هر کدام از این سه قسمت، شما سگمنت های بیشتری هم باشند.
پس حسن اصلی فایلهای EXE در اینه که دیگه محدودیت 64 کیلوبایتی فایلهای COM رو ندارند.
اما فراخوانی یک فایل EXE برخلاف فایلهای COM اصلا ساده نیست، چون فقط با آفست به تنهایی فقط میشه 64 کیلوبایت
رو آدرس دهی کرد و برای افزایش این فضای آدرس دهی باید سگمنت هم به کد برنامه اضافه شوند.

اما مشکل اصلی اینجاست، حافظه سیستم همیشه یکسری سگمنت آزاد داره و یکسری سگمنت که از قبل اشغال
شده اند و آزاد نیستند.
حالا فرض کنیم که ما یک برنامه اجرایی EXE داریم که برای سگمنتی نوشته شده که اکنون آزاد نیست. پس چطور اجراش کنیم؟
راه حلی که برای این منظور پیاده سازی شده اینه که سگمنت داخل کد اجرایی را نسبی تعیین می کنند و نه مطلق.
هر وقت که فایل اجرایی فراخوانی میشه، تمامی آن سگمنت های نسبی داخل کد اجرایی دونه دونه با یک مقدار
جمع می شوند تا به آدرس مطلق تبدیل بشوند و بتونیم برنامه را اجرا کنیم.

این عملیات اضافی سرعت فراخوانی فایلهای EXE رو کند می کنه و همچنین حجم فایل اجرایی رو از دو جهت افزایش می ده :
اول اینکه باید اطلاعات سگمنت آدرسها رو در کنار آفست ذخیره کنیم.
ثانیا باید جدولی در ابتدای فایل اجرایی وجود داشته باشه که مشخص کنه این سگمنتها در کجای برنامه هستند، برای هر
کدوم از سگمنت ها باید یک خونه به این جدول اضافه بشه.
این جدول در هنگام کامپایل کردن برنامه اجرایی توسط کامپایلر ایجاد میشه، چون فقط کامپایلر می تونه این سگمنت ها را در
میان هزاران کد و داده برنامه تشخیص بده.

Open-Source
شنبه 19 بهمن 1387, 18:42 عصر
راستی منبع مطلب:
http://forum.majidonline.com/showthread.php?t=90272