Web Programming C++ SQL Server پایگاه داده ساختمان داده   صفحه اصلی
  زبان اسمبلي > حافظه  
 
 

حافظه


حافظه مکان ذخیره برنامه ها و داده ها با امکان دسترسی مجدد به آنها است. در این بخش شرح مختصری پیرامون حافظه، ساختار و نحوه آدرس دهی صحبت می شود.

واحد های اطلاعاتی
آدرس دهی
endian
مدهای اجرا
مد حقیقی
مد مسطح


واحد های اطلاعاتی

هر رقم در یک عدد باینری یک بیت (bit) نامیده می شود. بیت کوچکترین واحد اطلاعاتی در کامپیوتر است. بیت ها به صورت گروه های بزرگتری سازماندهی می شوند؛ در کامپیوترهای امروزی هر هشت بیت یک بایت (Byte) درنظر گرفته می شود که کوچکترین مکان آدرس پذیر حافظه است که می تواند از حافظه واکشی شود. یک بایت می تواند حاوی یک دستورالعمل ماشین، یک کاراکتر، یا یک عدد باشد. هر بایت به دو نیبل (nibble) تقسیم می شود هر نیبل چهار بیت است.

واحد بزرگتر ذخیره سازی یک کلمه (word) است که روی پردازنده های اینتل 2 بایت (16 بیت) است. کامیپوترهای شخصی اولیه با پردازنده های اینتل دارای عملوندهای 16 بیتی بودند به همین دلیل کلمه به صورت 16 بیتی تعریف شد. در پردازنده های دیگر طول کلمه الزاما 2 بایت نیست.

Byte, Word, Double Word

یک کلمه مضاعف (doubleword) چهار بایت یا 32 بیت طول دارد و یک کلمه چهارگانه (quadword) دارای هشت بایت یا 64 بیت است.

اصطلاحاندازه (بایت)
Byte1
Word2
Double word4
Quad word8
Ten Byte10
Paragraph 16
(almost never used)Page, or page frame256
Segment65,536

آدرس دهی

حافظه اصلی از دید برنامه نویس از تعدادی بیت تشکیل شده است. مکانیسم دسترسی به اطلاعات درون حافظه آدرس دهی است. بیت هائی که دارای آدرس یکسان هستند را سلول حافظه (cell) می نامند. تعداد بیت های سلول، یا طول سلول، در ریز کامپیوترها برابر با هشت بیت است یا یک بایت است. خاصیت مهم سلول آدرس پذیری است، یعنی هر سلول دارای یک آدرس منحصر بفرد است. بنابراین هر بایت درحافظه نیز دارای یک آدرس منحصر بفرد است. بایت کوچکترین واحد حافظه است که توسط پردازنده می تواند دسترسی شود. بنابراین اگر پردازنده بخواهد 4 بیت را بخواند باید هشت بیت را بخواند بعد 4 بیت اضافه آنرا ندید بگیرد.

پردازنده 8086 گذرگاه داده 8 بیتی دارد یعنی CPU هر بار 8 بیت را منتقل می کند. چون هر آدرس حافظه به یک بایت داده شده است به نظر می رسد این بهترین ترتیب ممکن از دید سخت افزاری است.

مثال. برای خواندن بایت حافظه با آدرس 125 پردازنده آدرس 125 را روی گذرگاه آدرس قرار می دهد و خط read را صفر می کند سپس داده را از روی گذرگاه داده می خواند.

Memory Read

آدرس های حافظه از عدد صفر شروع می شوند. اگر حافظه ای دارای n سلول باشد آدرس های حافظه از 0 تا n-1 خواهد بود. تعداد بیت های آدرس تعداد سلول های قابل دسترس حافظه را نشان می دهد. پردازنده های x86 قادرند تا 2m محل مختلف را آدرس دهی کنند. m تعداد خطوط گذرگاه آدرس یا طول آدرس است. بیشترین میزان حافظه است که یک پردازنده می تواند آدرس دهی کند را فضای آدرسی می گویند که ازدید برنامه نویسی به صورت آرایه ای از بایت ها تصور می شود. آدرس اولین بایت صفر و آدرس آخرین بایت حافظه 2m-1 است.

مثال. در پردازنده 8086 که گذرگاه آدرس 20 بیت است آدرس های حافظه از صفر تا 1048575 است.

اغلب حافظه ها در اندازه های بزرگتراز بایت نظیر کیلوبایت (1KB=210=1,024 bytes)، مگابایت (1MB=220= 1,048,576 bytes ) و گیگابایت (1GB=230=1,073,741,824 bytes) بیان می شوند. یک کامپیوتر با 32 مگابایت حافظه قادر است تقریبا 32 میلیون بایت از اطلاعات را نگهداری کند.

برای بیان آدرس مبنای هگز به کار برده می شود.

endian

یک نکته مهم هنگام برنامه نویسی اسمبلی برای کارکردن با داده های از نوع کلمه یا کلمه مضاعف ترتیب قرار گیری بایت ها در حافظه است. endian ترتیب قرار گیری بایت ها در حافظه را برای داده های چندبایتی معین می کند. باوجودیکه پردازنده به طور نامحسوس endian را استفاده می کند برای دسترسی به داده های چندبایتی حافظه و کارکردن با هر بایت بطور جداگانه دانستن endian مهم است.

پردازنده های مختلف راه حل های متفاوتی دارند برای داده های چندبایتی دارند. خانواده x86 این مسئله را به این صورت حل می کنند که بایت با ارزش کمتر در آدرس پایین تر حافظه که مشخص شده قرار می گیرد و بقیه بایت ها در آدرس بعدی قرار می گیرند. این روش Little Endian نام دارد. بنابراین آدرس یک کلمه که از دو بایت تشکیل شده است در واقع آدرس بایت پایین آن است.

مثال. یک داده چهار بایتی که در آدرس 192 ذخیره شده است و یک داده دو بایتی که از آدرس 188 ذخیره شده است.

Memory Data

دقت کنید احتمال اینکه مقادیر کلمه و کلمه مضاعف در حافظه روی هم بیفتد وجود دارد. برای مثال در شکل فوق می توانید یک کلمه داشته باشید با آدرس شروع 193 و یک کلمه مضاعف که از آدرس 192 شروع شده باشد. این دو متغیر روی هم میافتند (Overlap).

مدهای اجرا

مد حقیقی (Real Mode)

پردازنده های 8086 دارای گذرگاه 20 بیتی بودند، بنابراین می توانستند تا 1 مگابایت حافظه را آدرس بدهند (از آدرس 00000 تا 1MB=1048575=FFFFF). این آدرس ها به یک عدد 20 بیتی احتیاج دارند. البته یک عدد 20 بیتی را نمی توان در ثبات های 16 بیتی 8086 جا داد بنابراین این مشکل را با آدرس دهی سگمنتی (Segment Addressing) حل کردند. برای بیان یک آدرس 20 بیتی از دو ثبات 16 بیتی استفاده شد: آدرس سگمنت در یک ثبات 16 بیتی و آدرس آفست در یک ثبات 16 بیتی دیگر. سگمنت یک تکه از حافظه با اندازه 64 کیلوبایت است. در آدرس دهی سگمنتی محل یک بایت خاص در فضای یک مگابایتی حافظه به صورت زیر محاسبه می شود: آدرس شروع سگمنت و آدرس آفست که فاصله بایت تا شروع سگمنت است. این دو قسمت اصطلاحا آدرس منطقی (Logical Address) یا موثر(Effective Address) نامیده می شوند.

آدرس سگمنتی به صورت آفست:سگمنت در مبنای هگز نوشته می شود.

هر بایت از حافظه که در برنامه قابل دسترس است درون یک سگمنت قرار می گیرد. آدرس سگمنت به سگمنتی در حافظه اشاره می کند که حاوی بایت مورد نظر است. اندازه هر سگمنت می تواند از یک تا 64KB متغیر باشد.

هر سگمنت از یک پاراگراف می تواند شروع شود. هر آدرس که بر 16 بخش پذیر باشد یک پاراگراف حافظه خوانده می شود. اولین پاراگراف از آدرس 00000 شروع می شود. دومین پاراگراف آدرس 00010h است(معادل عدد 16 است) پاراگراف بعدی آدرس 00020h است و الی آخر. با یک مگابایت حافظه 64K محدوده پاراگراف مختلف می توان داشت که می توانند شروع سگمنت باشند. هر محدوده پاراگراف با یک آدرس شروع می شود که همان آدرس سگمنت است. چون آدرس شروع هر سگمنت از سمت راست به صفر ختم می شود از آن صرفنظر می شود. بنابراین آدرس سگمنت همیشه به صورت یک عدد 16 بیتی یا 4 رقمی هگز نوشته می شود.

آفست(Offset) فاصله بایت مورد نظر از ابتدای سگمنت را مشخص می کند. با توجه به اینکه هر سگمنت 64KB حافظه دارد، آفست می تواند بین صفر تا 65535 (FFFFh) باشد. بنابراین آفست نیز همیشه یک عدد 4 رقمی هگز است.

Segment Offset Memory

مثال. آدرس فیزیکی 18A3:5B27 به بایتی در سگمنت 18A30 اشاره دارد که از ابتدای این سگمنت 5B27 بایت فاصله دارد.
مثال. آدرس فیزیکی 0002D می تواند توسط 0001:001D رجوع شود.

همانطور که گفته شد آدرس های سگمنت-آفست یک آدرس منطقی را تعیین می کنند. برای ساختن آدرس فیزیکی 20 بیتی طبق فرمول زیر محتوای آدرس سگمنت را در 16 ضرب کرده با آدرس آفست جمع می کنیم:

16× segment + offset

نکته. برای ضرب در 16 آسان است در مبنای هگز کافی است یک صفر در سمت راست عدد گذاشته شود.

مثال. آدرس فیزیکی رجوع شده توسط 047C:0048 برابر است با:

047C0+0048=04808

سگمنت ها روی هم می توانند قرار بگیرند بنابراین یک بایت، با داشتن آدرس فیزیکی منحصر بفرد در حافظه، می تواند از طریق چندین ترکیب سگمنت:آفست بدست می آید.

مثال. آدرس فیزیکی 0002D می تواند توسط 0002:000D، 0001:001D یا 0000:002D رجوع شود.

Segment Offset Memory Overlap

نکته. در مد حقیقی هیچ محافظتی درون سگمنت وجود ندارد. و سگمنتها می توانند روی هم بیفتند.
نکته. پاراگراف تقریبا هیچوقت استفاده نمی شود مگر برای تعیین محل شروع یک سگمنت.

هر برنامه اسمبلی می تواند تا چند سگمنت از انواع زیر داشته باشد:

سگمنت کد. شامل دستورالعمل های زبان ماشین برنامه است. اولین دستور اجرائی برنامه در ابتدای این سگمنت قرار دارد و سیستم عامل CPU را برای اجرای برنامه به این محل ارجاع می دهد.
سگمنت داده. شامل داده های سراسری تعریف شده و ناحیه کاری که برنامه نیاز دارد.
سگمنت پشته. شامل آدرس های برگشتی از زیربرنامه ها و داده های متغیرهای محلی زیربرنامه است .

آدرس هر سگمنت فعال برنامه باید در یکی از شش ثبات سگمنت CS، DS، SS، ES، FS و GS قرار داده شود. در کلیه پردازنده های x86 اندازه ثبات های سگمنت 16 بیتی هستند.

• CS. آدرس سگمنت دستورالعمل جاری که در حال اجراست در CS قرار دارد.
• DS. متغیرها و داده ها درون سگمنت داده قرار دارند. چندین سگمنت داده ممکن است وجود داشته باشد اما با قرار دادن آدرس سگمنت درون ثبات DS پردازنده در هر لحظه فقط یکی را استفاده می کند.
• SS. پشته یکی از اجزای مهم CPU است که برای ذخیره موقت داده و آدرسها استفاده می شود. پشته یک آدرس سگمنت دارد که در ثبات SS قرار می گیرد.
• ES. سگمنت اضافه یک سگمنت یدکی است که برای مشخص کردن محلی در حافظه می تواند استفاده شود. آدرس شروع این سگمنت یدکی در ES قرار دارد.
• FS و GS. مشابه ES هستند. تنها در پردازنده های بعد از 386 وجود دارند.

ES، FS و GS می توانند برای ذخیره کد و داده بکار برده شوند.

ثبات های همه منظوره و اشاره گر می توانند آدرس آفست را نگهدارند و با ثبات های سگمنت جفت شوند تا محل داده را مشخص کنند. برای مثال دستورالعمل بعدی که باید اجرا شود از جفت ثبات CS:IP بدست می آید. آدرس بالای پشته را جفت ثبات SS:SP مشخص می کنند.

Segmented Mode

نکته. مد حقیقی روی MS-DOS و Windows 9x اجرا می شد.
نکته. مد حقیقی امکان داشتن ساختمان داده های بزرگتر از 64K را برای برنامه نویسان غیر ممکن می کند. چون آفست نمی تواند از 16 بیت بیشترباشد و داده ای بزرگتر از 64K نمی توانید داشته باشید.
نکته. فضای آدرسی در مد حقیقی از 00000h تا 0FFFFF است.
نکته. سگمنت ها می توانند روی همدیگر بیافتند. در بعضی مواقع که برنامه کوتاه است سگمنت داده می تواند از داخل سگمنت کد شروع شود.
نکته. برنامه و داده در هر سگمنتی از حافظه می توانند قرار گیرند، فقط آدرس شروع سگمنتها توسط ثبات های سگمنت باید برای CPU تعریف شده باشد. این آدرس ها اغلب درطول اجرای برنامه ثابت باقی می مانند و در عمل هنگام برنامه نویسی تنها از آدرس 4 رقمی آفست استفاده می شود.

مد مسطح (Flat mode)

روی پردازنده های 32 بیتی ویندوز و لینوکس مدل حافظه ای بنام مسطح استفاده می شود. در حالت مسطح کل فضای آدرسی توسط یک سگمنت 32 بیتی مشخص می شود که 232=4GB فضا دارد. برنامه به صورت تئوری می تواند به 4 گیگابایت حافظه فیزیکی یا مجازی دسترسی پیدا کند. کد، داده و پشته همگی در یک سگمنت قرار می گیرند و کلیه ثبات های سگمنت یک مقدار دارند.

مد مسطح تنها یک مقدار آدرس را به یک محل فیزیکی حافظه اصلی ربط می دهد. برای نمونه EIP اشاره گر دستورالعمل 32 بیتی است می تواند به هر دستورالعملی درون 4BG حافظه اشاره کند. ثبات های سگمنت نشان می دهند کدام 4GB از حافظه قابل دسترس برنامه در حافظه مجازی یا فیزیکی مستقر می شود. ثبات های سگمنت قسمتی از سیستم عامل درنظر گرفته می شوند و نمی توانید مستقیما آنها را بخوانید یا تغییر بدهید.

flat Mode

راه ساده برای نوشتن برنامه های اسمبلی در مد مسطح تحت ویندوز ایجاد برنامه های کنسول (Console Application) است. برنامه های کنسول برنامه های هستند که در پنجره متن ویندوز بنام کنسول اجرا می شوند که مشابه واسطه کاربری خط فرمان MS-DOS است. برنامه های کنسول مد مسطح محافظت شده را بکار می برند.

مد مسطح حقیقی

در این مد تنها یک مگابایت حافظه در دسترس است. برنامه و کلیه داده هایش در یک سگمنت 64 کیلو بایتی قرار دارند. آدرس 20 بیتی از دو آدرس 16 بیتی آفست:سگمنت ساخته می شود. کلیه ثبات های سگمنت به ابتدای این سگمنت اشاره می کنند. سگمنت در طول اجرای برنامه تغییر نمی کند. این مد مشابه مد محافظت شده مسطح روی سیستم های Linux و Windows XP/Vista است.

flat Real Mode

پردازنده های 8086، 8088 تنها در مد حقیقی کار می کردند. در مد حقیقی پردازنده مانند 8086 عمل می کند. یعنی تنها یه یک مگابایت حافظه دسترسی دارند و کلیه ارجاعات به حافظه توسط آدرس منطقی آفست:سگمنت تعیین می شود. آدرس منطقی طبق فرمول آفست + 16×سگمنت به آدرس فیزیکی 20بیتی تبدیل می شود. در این حالت یک برنامه به هر آدرسی از حافظه دسترسی دارد حتی حافظه برنامه های دیگر که باعث می شود اشکالزدائی و امنیت بسیار دشوار شود. احتمال سقط شدن برنامه های دیگر یا سیستم عامل وجود دارد.

در پردازنده های 80286 به بعد مد محافظت شده (protected mode) اضافه شد. در مد محافظت شده پردازنده می تواند از قابلیت های خود در گذرگاه های آدرس و داده به طور کامل استفاده کنند. در این مد می تواند حافظه بیشتری را آدرس دهی کند و برنامه ها را از دسترسی حافظه های یکدیگر محافظت می کرد.

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

نکته. بخاطر سازگاری کلیه این پردازنده ها قابلیت سوییچ کردن به مد حقیقی و تبدیل شدن به یک تراشه 8086 را دارند.
نکته. روی سیستم های اینتل 32 و 64 بیتی مدل مسطح استفاده می شود. مدل سگمنتی روی سیستم های 16 بیتی ترجیح داده می شود.


دانلود PDF این درس


 


 

صفحه اصلی| درباره| تماس