تفاوت فایل های exe و com ( تورو خدا بخونید )

سلام . خسته نباشید . من یه تحقیقی رو باید تا هفته دیگه تحویل استاد دانشگاه بدم . جای بهتری هم واسه سئوالم پیدا نکردم ، شرمنده :
می خواستم تفاوت فایلهای exe و com رو بگید . ممنون
 

the_king

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

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

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

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

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

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

the_king

مدیرکل انجمن
وقتی اینتل پردازنده های 8086 را می ساخت از معماری 16 بیتی برای محاسبه و آدرس دهی اون استفاده کرد و
در نتیجه محدوده آدرس دهی به 16 بیت محدود شد که برابر با 64 کیلو بایت است.
این حافظه کافی نبود و بایستی محدوده آدرس دهی انرا با حداقل هزینه ممکن افزایش می داد.
راه حلی که در آن زمان از نظر تکنیکی و اقتصادی به صرفه بود و مورد استفاده قرار گرفت شیوه آدرس دهی دو قسمتی بود.
بدین شکل که محدوده آدرس دهی را به 20 بیت افزایش دادند که از ترکیب دو قسمت سگمنت و آفست ایجاد می شه.
با استفاده از آدرس دهی 20 بیتی، محدوده حافظه به 1 مگابایت افزایش پیدا کرد.
سگمنت و آفست هر دو 16 بیتی هستند که با معماری پردازنده های اینتل سازگاری داشته باشند.
سگمنت از نظر مکانی 4 بیت بالاتر از آفست قرار می گیره و با ترکیبش با مقدار آفست یک آدرس 20 بیتی بوجود میاد.
ترکیب سگمنت و آفست خیلی ساده است، چهار تا بیت با مقدار صفر در سمت راست سگمنت 16 بیتی اضافه کرده
و حاصل را با مقدار آفست جمع می کنند.

عدد 100h یعنی 100 در مبنای 16 که h اختصاری Hexadecimal است یعنی مبنای 16.
برای اینکه از سیستم شمارش عادی مبنای 10 (ده دهی) متمایز باشه، کاراکتر h را به آخر عدد اضافه می کنند.
عدد 100h معادل 256 در مبنای ده دهی است و آدرس اولین خونه حافظه ای است که کد برنامه های COM از آنجا به بعد
نوشته می شوند.
 

emad_67

Member
سلام
بحث خیلی خوبی بود فقط یه خواهشی داشتم که اگه میشه یه تعریفی از این سگمنت و آفست بکن. چون من بازم درست نفهمیدم که اینا دقیقا چی هستند.
در نتیجه محدوده آدرس دهی به 16 بیت محدود شد که برابر با 64 کیلو بایت است.
یه سوال دیگه هم اینکه چه جوری این 64 کیلوبایت به دست میاد؟ یعنی طبق چه فرمولی؟
 

the_king

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

محاسبات پردازنده همواره با محدودیت مواجه است، محاسبات و آدرس دهی 16 بیتی به مفهوم کار با اعداد، متغیر ها،
رجیستر ها (متغیر های داخلی پردازنده که بسیار سریع، گران و از نظر تعداد محدود هستند) و آدرس های 16 بیتی است.

محدودیت 16 بیت را با یک مثال ساده تشریح می کنم. اگر به شما بگویم که شما باید یک عدد تک رقمی را حدس بزنید،
نتیجه خواهید گرفت که این عدد بین 0 الی 9 است یعنی 10 حالت مختلف، یا با مفاهیم ریاضی یعنی 10 به توان 1 حالت مختلف.
و اگر قرار است یک عدد سه رقمی را حدس بزنید، عدد بین 000 الی 999 خواهد بود یعنی 1000 حالت مختلف و یا به زبان ریاضی
یعنی 10 به توان 3.

اعداد 16 بیتی هم از 16 رقمی (بیت) تشکیل می شوند که فقط دو حالت دارند، صفر و یک، پس تعداد حالات آنها برابر است با
65536 حالت و به زبان ریاضی 2 به توان 16 که چون 65536 برابر 1024 * 64 است و 1024 مبنای واحد کیلو است،
معادل 64 کیلو است.

وقتی آدرس دهی ما 16 بیتی باشد، ما فقط می توانیم 65536 خونه متفاوت حافظه (بایت) را مشخص کنیم پس محدود به
64 کیلوبایت هستیم.
و وقتی آدرس دهی ما 20 بیتی باشد، قادر به مشخص کردن 2 به توان 20 خانه مختلف حافظه هستیم، که برابر است با
1048576 بایت یا 1024 کیلوبایت یا 1 مگابایت.

حالا فرض کنید که یک آدرس حافظه 20 بیتی داریم، خب یک عدد 20 بیتی که توسط پردازنده 16 بیتی قابل استفاده نیست.
پس اونو دو قسمت می کنیم، 16 بیت پایینی شو داخل آفست قرار می دهیم و 4 بیت بالایی را در سگمنت.
سگمنت هم مثل آفست 16 بیتی است پس غیر از آن چهار بیت بالایی، 12 بیت دیگرش با 12 بیت از آفست مشترک اند.
برای همین است که سگمنت را 4 بیت بالاتر از آفست قرار می دهند تا عددی 20 بیتی ایجاد شود.
سگمت و افست 16 بیتی درکنار هم یک سیستم آدرس دهی 20 بیتی را ایجاد می کنند.
 

emad_67

Member
با تشکر از جوابتون
یه سوال دیگه رام پیش اومد :
مثلا وقتی میگیم یه یه پردازنده 2Ghrz و 32 بیتی هست یعنی چی؟ منظورم اینه که در 1 ثانیه روی چه حجمی از اطلاعات میتونه پردازش انجام بده؟
 

the_king

مدیرکل انجمن
با تشکر از جوابتون
یه سوال دیگه رام پیش اومد :
مثلا وقتی میگیم یه یه پردازنده 2Ghrz و 32 بیتی هست یعنی چی؟ منظورم اینه که در 1 ثانیه روی چه حجمی از اطلاعات میتونه پردازش انجام بده؟
حقیقتا نه تعداد پالس (کلاک) 2 گیگاهرتزی و نه 32 بیتی بودن پردازنده هیچ ارتباط مستقیمی با حجم پردازش اطلاعاتی
که پردازنده انجام می ده نداره.
برای پی بردن به حجم اطلاعاتی که پردازنده پردازش می کنه بایستی پهنای باند گذرگاه (Bus) پردازنده و همینطور سرعت
حافظه RAM رو در نظر بگیرید، مشخصات و کیفیت مادربورد هم در این رابطه موثره، برای همین شاید برای رسیدن
به آمار دقیق نیاز به محک زدن در محیط واقعی باشه.
دقیقترین آمارها رو برنامه های ویژه Benchmark و ابزار های اشکال یابی مثل SiSoftware Sandra می توانند ارائه کنند
چون هم سازنده پردازنده و هم سازنده حافظه RAM مشخصاتی اسمی را ارائه خواهند کرد و نه مشخصات حقیقی.
 

the_king

مدیرکل انجمن
منظور اینه که این پردازنده در محاسبات عادی و آدرس دهی داخلی از اعداد 32 بیتی و یا 64 بیتی استفاده می کنه،
مثلا پردازنده 64 بیتی می تونه یک عدد 64 بیتی را با یک عدد 64 بیتی دیگه در یک فرمان ساده جمع کنه.
ولی پردازنده 32 بیتی برای انجام اینکار حداقل به دو دستور نیاز داره، چون متغیر های داخلی اش توانایی محاسبه
روی اعداد 64 بیتی را ندارند و باید آنرو توی دو حافظه 32 بیتی بشکونه.
 

جدیدترین ارسال ها

بالا