Borna66
11-15-2010, 01:55 AM
پردازنده های 8086 دارای گذرگاه 20 بيتی هستند، بنابراين می تواند تا 1 مگابايت حافظه را آدرس دهد(از آدرس 00000 تا 1MB=1048575=FFFFF). اين آدرس ها به يک عدد 20 بيتی احتياج دارند. روشن است که يک عدد 20 بيتی را نمی توان در ثبات های 16 بيتی 8086 جا داد. اينتل اين مشکل را با آدرس دهی سگمنتی (segment addressing) حل کرد. سگمنت يک تکه از حافظه با اندازه 64 کيلوبايت است. يک محل از حافظه با يک آدرس سگمنت و يک آفست (offset) مشخص می شود که به صورت دو عدد 16 بيتی نشان داده می شوند. آدرس سگمنت به سگمنتی در حافظه اشاره می کند که حاوی محل مورد نظر است. هر سگمنت از يک پاراگراف می تواند شروع شود. هر پاراگراف 16 بايـت دارد، بنابراين سگمنت از آدرسی که مضربی از 16 است شروع می شود. يعنی سگمنت اول از آدرس 00000، سگمنت دوم از آدرس 00010، بعدی از آدرس 00020 و الی آخر شروع می شود. در نتيجه آدرس شروع هر سگمنت از سمت راست به صفر ختم می شود که از آن صرفنظر می شود. بنابراين آدرس سگمنت هميشه به صورت يک عدد 4 رقمی هگز نوشته می شود.
آفست فاصله بايت مورد نظر از ابتدای سگمنت را مشخص می کند. با توجه به اينکه هر سگمنت 64KB حافظه دارد، آفست می تواند بين 0000 تا ffff باشد. بنابراين آفست نيز هميشه يک عدد 4 رقمی هگز است.
http://hpkclasses.ir/Courses/Assembly/img0501.JPG
آدرس سگمنتی به صورت آفست:سگمنت نوشته می شود.
مثال 1. آدرس فيزيکی 18A3:5B27 به بايتی در سگمنت 18A30 اشاره دارد که از ابتدای اين سگمنت 5B27 بايت فاصله دارد.
مثال 2. آدرس فيزيکی 04808 می تواند توسط 047C:0048 رجوع شود.
آدرس های سگمنت-آفست يک آدرس منطقی را تعيين می کنند. برای ساختن آدرس فيزيکی 20 بيتی طبق فرمول زير محتوای آدرس سگمنت را در 16 ضرب کرده با آدرس آفست جمع می کنيم:
16× segment + offset
ضرب در 16 آسان است کافی است يک صفر در سمت راست عدد گذاشته شود.
مثال 3. آدرس فيزيکی رجوع شده توسط 047C:0048 برابر است با:
047C0+0048=04808
سگمنت ها روی هم می توانند قرار بگيرند بنابراين يک بايت، با داشتن آدرس فيزيکی منحصر بفرد در حافظه، می تواند از طريق چندين ترکيب سگمنت:آفست بدست می آيد.
مثال 4. آدرس فيزیکی 04808 می تواند توسط 047C:0048، 047D:0038، 047E:0028 يا 047B:0058 رجوع شود.
سگمنت های برنامه
سه ناحيه از سگمنت های حافظه که هر يک می توانند 64KB باشند برای يک برنامه در نظر گرفته می شوند:
1. سگمنت کد
• شامل دستورالعمل های زبان ماشين برنامه ای که دارد اجرا می شود. اولين دستور اجرائی برنامه در ابتدای اين سگمنت قرار دارد و سيستم عامل CPU را برای اجرای برنامه به اين محل ارجاع می دهد.
2. سگمنت داده
• شامل داده های تعريف شده و ناحيه کاری که برنامه نياز دارد.
3. سگمنت پشته
• شامل آدرس های برگشتی از زيربرنامه ها و داده های محلی است .
نکته 1. برنامه و داده در هر سگمنتی از حافظه می توانند قرار گيرند، فقط آدرس شروع سگمنت بايد برای CPU تعريف شده باشد. اين آدرس ها در ثبات های سگمنت ذخيره می شوند و اغلب درطول اجرای برنامه ثابت باقی می مانند. در عمل هنگام برنامه نويسی تنها از آدرس 4 رقمی آفست استفاده می شود.
نکته 2. سگمنت ها می توانند روی همديگر بيافتند. در بعضی مواقع که برنامه کوتاه است سگمنت داده می تواند از داخل سگمنت کد شروع شود به شرط اينکه تداخل رخ ندهد.
آفست فاصله بايت مورد نظر از ابتدای سگمنت را مشخص می کند. با توجه به اينکه هر سگمنت 64KB حافظه دارد، آفست می تواند بين 0000 تا ffff باشد. بنابراين آفست نيز هميشه يک عدد 4 رقمی هگز است.
http://hpkclasses.ir/Courses/Assembly/img0501.JPG
آدرس سگمنتی به صورت آفست:سگمنت نوشته می شود.
مثال 1. آدرس فيزيکی 18A3:5B27 به بايتی در سگمنت 18A30 اشاره دارد که از ابتدای اين سگمنت 5B27 بايت فاصله دارد.
مثال 2. آدرس فيزيکی 04808 می تواند توسط 047C:0048 رجوع شود.
آدرس های سگمنت-آفست يک آدرس منطقی را تعيين می کنند. برای ساختن آدرس فيزيکی 20 بيتی طبق فرمول زير محتوای آدرس سگمنت را در 16 ضرب کرده با آدرس آفست جمع می کنيم:
16× segment + offset
ضرب در 16 آسان است کافی است يک صفر در سمت راست عدد گذاشته شود.
مثال 3. آدرس فيزيکی رجوع شده توسط 047C:0048 برابر است با:
047C0+0048=04808
سگمنت ها روی هم می توانند قرار بگيرند بنابراين يک بايت، با داشتن آدرس فيزيکی منحصر بفرد در حافظه، می تواند از طريق چندين ترکيب سگمنت:آفست بدست می آيد.
مثال 4. آدرس فيزیکی 04808 می تواند توسط 047C:0048، 047D:0038، 047E:0028 يا 047B:0058 رجوع شود.
سگمنت های برنامه
سه ناحيه از سگمنت های حافظه که هر يک می توانند 64KB باشند برای يک برنامه در نظر گرفته می شوند:
1. سگمنت کد
• شامل دستورالعمل های زبان ماشين برنامه ای که دارد اجرا می شود. اولين دستور اجرائی برنامه در ابتدای اين سگمنت قرار دارد و سيستم عامل CPU را برای اجرای برنامه به اين محل ارجاع می دهد.
2. سگمنت داده
• شامل داده های تعريف شده و ناحيه کاری که برنامه نياز دارد.
3. سگمنت پشته
• شامل آدرس های برگشتی از زيربرنامه ها و داده های محلی است .
نکته 1. برنامه و داده در هر سگمنتی از حافظه می توانند قرار گيرند، فقط آدرس شروع سگمنت بايد برای CPU تعريف شده باشد. اين آدرس ها در ثبات های سگمنت ذخيره می شوند و اغلب درطول اجرای برنامه ثابت باقی می مانند. در عمل هنگام برنامه نويسی تنها از آدرس 4 رقمی آفست استفاده می شود.
نکته 2. سگمنت ها می توانند روی همديگر بيافتند. در بعضی مواقع که برنامه کوتاه است سگمنت داده می تواند از داخل سگمنت کد شروع شود به شرط اينکه تداخل رخ ندهد.