آموزش Assembly-قسمت چهارم

در جلسات قبل راجع به این صحبت شد که چجوری یک محیط مناسب برای برنامه نویسی اسمبلی توی سیستم عامل های مختلف ایجاد کنیم و طرز کار کردن باهاشون رو هم با هم یاد گرفیتم.

آموزش اسبملی جلسه جهارم عکس1

توی جلسه پیش یک برنامه Hello World نوشتیم که سه تا قسمت داشت :

   1. Code

   Data .2

  Stack .3  

خب اگه توی برنامه ی بالا ( Hello World ) بجای کلمه ی کلیدی section از کلمه ی segment استفاده کنیم. باز هم نتیجه میگیریم. به قطعه کد زیر توجه کنید:

آموزش اسبملی جلسه جهارم عکس1

وقتی قطعه کد بالا رو کامپایل بشه خروجی مشابه و یکسان قطعه کد قبلی میده :

Hello, world!

Memory Segments

بخش بخش کردن حافظه یا همون memory segmentation یک مدل یا فرمی از تقسیم حافظه سیستم به گروه های مجزا که با pointer یا همون اشاره گر بهشون میشه دسترسی داشت که خود این اشاره گر ها در segment register ها ذخیره شدند.

هر segment برای یک نوع مشخص از داده استفاده میشه. مثلن ، یک سگمنت استفاده میشه برای ذخیره سازی  Code ، یکی دیگه برای ذخیره سازی المان های Data ( داده ) و سومی هم برای نگهداری stack برنامه ازش استفاده میشه.

اگه بخوایم segmentation رو توی کدمون ببینیم:

  • سگمنت داده ( Data Segment ) : با نماد .data  و .bss نمایش داده میشه. قسمت .data برای اعلان قسمت حافظه استفده میشه ، که المان های داده ای مورد استفاده در برنامه در این قسمت ذخیره میشه. ای قسمت بعد از اینکه المان ها اعلان و تعرثف بشن نمیتونه اندازش تغییر پبدا بکنه و گسترش پیدا بکنه و در طول اجرای برنامه ثابت میمونه.
    قسمت .bss  (Block Started by Symbol ) هم خصوصیات .data رو داره و طولش ثابت هست. ( در اصطلاح Static ) که شامل بافر برای داده هایی که بعدن می خوان تو برنامه اعلان و معرفی بشن میشه. که البته این حافظه بافری Zero-Filled هست یعنی تمام فضای تخصیص داده شده با این قسمت با 0 پر میشه.
  • سگمنت کد ( Code Segment ) : با نماد .text مشخص میشه. این قسمت به محدوده ای از حافظه که به کد برنامه تخصیص داده شده اشاره میکنه. که این قسمت هم مانند دو قسمت قبلی Static هست و اندازه اش حین اجرای برنامه غیر قابل تغییر.
  • سگمنت پشته ( Stack Segment ) : این سگمنت هم شامل مقادیر داده هایی میشه که به توابع (Function) و رویه ها (Procedure) درون برنامه پاس داده شده.  که این قسمت بر خلاف دو قسمت قبل قابلیت تغییر اندازه رو داره ، یعنی در صورت نیاز بزرگ یا کوچک میشه. البته اگه فضایی از حافظه موجود باشه برای رشد.

آموزش اسبملی جلسه جهارم عکس3

نکته : توی شکل بالا و خیلی از شکل هایی که توی اینترنت هست . بجز سه سگمنت ذکر شد ممکن هست سگمنت های دیگری هم مثل HEAP و ... وجود داشته باشه. برای این درس فعلن از اهمیت خاصی برخوردار نیستن و عمده ی کار ما با همین 3 تا سگمنت هست. و البته توجه داشته باشین که هر زبان برنامه نویسی ممکنه بخواد سیاست segmentation خودش رو پیش بگیره ولی در حال حاضر اکثر زبان های برنامه نویسی از این سیاست در segmentation استفاه میکنن.

 

تمرین :

   1 .درباره buffer ، استفاده و چگونگی کارکد و اینکه اگه نخوایم از buffer استفاده کنیم چه باید بکنیم. تحقیق کنید.

   2 . اندازه یا همون size ای که سگمنت های مختلف در برنامه در حافظه اشغال می کنن چقدر هست.؟؟( جواب یک عدد نیست . دلیلش رو تحقسق کنید )

   3 . اگه segmentation نبود . چی فرایندی رو حافظه اجرا میشد و شکل نقشه حافظه برای یه برنامه اسمبلی چجوری مشد؟

پیشنهاد : کتاب معماری کامپیوتر پوران یا هر کتابی که خودتون فک می کنید بهتره ، بعلاوه معماری ریز پردازنده 8086 و 8088 رو یه نگاه سطحی بکنید. این کار به برنامه نویسیتون دید میده و درک خیلی بهتری از اتفاقاتی که داره می افته بهتون میده.

دیگه همین.

 

" خود را برای غیر منتظره ها آماده کنید "

مراد امیدیار بیانگذار eBay

 

KEEP CALM AND CODE ASSEMBLY

برای درج نظر و یا طرح سوالات خود لطفا در سایت ثبت نام کنید و یا وارد سایت شوید

نظرات کاربران

برای این مطلب تاکنون نظری ارسال نشده است. شما اولین نفر باشید