۰۶-اردیبهشت-۱۳۹۱, ۱۴:۰۱:۳۰
فیلهای COM تنها شامل یک سگمنت هستند که بر اساس محدودیت 64 کیلوبایتی سگمنت ها، نمی توانند محتویاتی
بیش از این 64 کیلوبایت باشند. کد برنامه و داده ها و پشته مورد استفاده بصورت کامل در همین تک سگمنت خواهد بود.
اولین نتیجه ای که از این مقدمه می گیریم اینه که فایلهای COM بصورت عمومی در مقایسه با فایلهای EXE ساده تر و
و معمولا کوچکتر هستند.
حسن فایلهای COM در اینه که چون فقط یک سگمنت دارند، نیازی به آدرس دهی سگمنت آفست نیست و در کد آنها
تنها قسمت آفست ذخیره میشه و بنابراین می تونیم یک فایل COM رو در هر سگمنتی که دوست داشته باشیم اجرا کنیم.
همچنین چون عملیات اضافه ای برای فراخوانی شون انجام نمیشه فایلهای COM سرعت فراخوانی بالایی دارند.
اگه بخوام بصورت دقیق فراخوانی و نحوه اجرا شدن یک فایل COM رو توسط سیستم عامل DOS تشریح کنم :
سیستم عامل محتویات کامل فایل COM رو می خونه و اونو از آفست 100h به بعد یک سگمنت قرار می ده و کنترل اجرا را
به اولین دستور زبان ماشین که در آفست 100h قرار داره میسپاره. به همین سادگی.
اما فایلهای EXE حداقل سه سگمنت دارند، یک سگمنت برای کد و یک سگمنت برای داده و یک سگمنت برای پشته،
در ضمن می توانند برای هر کدام از این سه قسمت، شما سگمنت های بیشتری هم باشند.
پس حسن اصلی فایلهای EXE در اینه که دیگه محدودیت 64 کیلوبایتی فایلهای COM رو ندارند.
اما فراخوانی یک فایل EXE برخلاف فایلهای COM اصلا ساده نیست، چون فقط با آفست به تنهایی فقط میشه 64 کیلوبایت
رو آدرس دهی کرد و برای افزایش این فضای آدرس دهی باید سگمنت هم به کد برنامه اضافه شوند.
اما مشکل اصلی اینجاست، حافظه سیستم همیشه یکسری سگمنت آزاد داره و یکسری سگمنت که از قبل اشغال
شده اند و آزاد نیستند.
حالا فرض کنیم که ما یک برنامه اجرایی EXE داریم که برای سگمنتی نوشته شده که اکنون آزاد نیست. پس چطور اجراش کنیم؟
راه حلی که برای این منظور پیاده سازی شده اینه که سگمنت داخل کد اجرایی را نسبی تعیین می کنند و نه مطلق.
هر وقت که فایل اجرایی فراخوانی میشه، تمامی آن سگمنت های نسبی داخل کد اجرایی دونه دونه با یک مقدار
جمع می شوند تا به آدرس مطلق تبدیل بشوند و بتونیم برنامه را اجرا کنیم.
این عملیات اضافی سرعت فراخوانی فایلهای EXE رو کند می کنه و همچنین حجم فایل اجرایی رو از دو جهت افزایش می ده :
اول اینکه باید اطلاعات سگمنت آدرسها رو در کنار آفست ذخیره کنیم.
ثانیا باید جدولی در ابتدای فایل اجرایی وجود داشته باشه که مشخص کنه این سگمنتها در کجای برنامه هستند، برای هر
کدوم از سگمنت ها باید یک خونه به این جدول اضافه بشه.
این جدول در هنگام کامپایل کردن برنامه اجرایی توسط کامپایلر ایجاد میشه، چون فقط کامپایلر می تونه این سگمنت ها را در
میان هزاران کد و داده برنامه تشخیص بده.
بیش از این 64 کیلوبایت باشند. کد برنامه و داده ها و پشته مورد استفاده بصورت کامل در همین تک سگمنت خواهد بود.
اولین نتیجه ای که از این مقدمه می گیریم اینه که فایلهای COM بصورت عمومی در مقایسه با فایلهای EXE ساده تر و
و معمولا کوچکتر هستند.
حسن فایلهای COM در اینه که چون فقط یک سگمنت دارند، نیازی به آدرس دهی سگمنت آفست نیست و در کد آنها
تنها قسمت آفست ذخیره میشه و بنابراین می تونیم یک فایل COM رو در هر سگمنتی که دوست داشته باشیم اجرا کنیم.
همچنین چون عملیات اضافه ای برای فراخوانی شون انجام نمیشه فایلهای COM سرعت فراخوانی بالایی دارند.
اگه بخوام بصورت دقیق فراخوانی و نحوه اجرا شدن یک فایل COM رو توسط سیستم عامل DOS تشریح کنم :
سیستم عامل محتویات کامل فایل COM رو می خونه و اونو از آفست 100h به بعد یک سگمنت قرار می ده و کنترل اجرا را
به اولین دستور زبان ماشین که در آفست 100h قرار داره میسپاره. به همین سادگی.
اما فایلهای EXE حداقل سه سگمنت دارند، یک سگمنت برای کد و یک سگمنت برای داده و یک سگمنت برای پشته،
در ضمن می توانند برای هر کدام از این سه قسمت، شما سگمنت های بیشتری هم باشند.
پس حسن اصلی فایلهای EXE در اینه که دیگه محدودیت 64 کیلوبایتی فایلهای COM رو ندارند.
اما فراخوانی یک فایل EXE برخلاف فایلهای COM اصلا ساده نیست، چون فقط با آفست به تنهایی فقط میشه 64 کیلوبایت
رو آدرس دهی کرد و برای افزایش این فضای آدرس دهی باید سگمنت هم به کد برنامه اضافه شوند.
اما مشکل اصلی اینجاست، حافظه سیستم همیشه یکسری سگمنت آزاد داره و یکسری سگمنت که از قبل اشغال
شده اند و آزاد نیستند.
حالا فرض کنیم که ما یک برنامه اجرایی EXE داریم که برای سگمنتی نوشته شده که اکنون آزاد نیست. پس چطور اجراش کنیم؟
راه حلی که برای این منظور پیاده سازی شده اینه که سگمنت داخل کد اجرایی را نسبی تعیین می کنند و نه مطلق.
هر وقت که فایل اجرایی فراخوانی میشه، تمامی آن سگمنت های نسبی داخل کد اجرایی دونه دونه با یک مقدار
جمع می شوند تا به آدرس مطلق تبدیل بشوند و بتونیم برنامه را اجرا کنیم.
این عملیات اضافی سرعت فراخوانی فایلهای EXE رو کند می کنه و همچنین حجم فایل اجرایی رو از دو جهت افزایش می ده :
اول اینکه باید اطلاعات سگمنت آدرسها رو در کنار آفست ذخیره کنیم.
ثانیا باید جدولی در ابتدای فایل اجرایی وجود داشته باشه که مشخص کنه این سگمنتها در کجای برنامه هستند، برای هر
کدوم از سگمنت ها باید یک خونه به این جدول اضافه بشه.
این جدول در هنگام کامپایل کردن برنامه اجرایی توسط کامپایلر ایجاد میشه، چون فقط کامپایلر می تونه این سگمنت ها را در
میان هزاران کد و داده برنامه تشخیص بده.