انواع روش های آدرس دهی در معماری کامپیوتر

آدرس دهی در یک کامپیوتر در واقع روش دسترسی پردازنده به آدرس است. در آدرس دهی مبدا و مقصد داده مشخص میشود و نیز معلوم میشود در جریان انتقال داده از مبدا به مقصد چه عملیاتی انجام شده است. اگر بخواهیم به طور ساده بیان کنیم هر خانه حافظه یا هر بایت حافظه در یک پردازنده ۸ بیتی یک آدرس منحصر به فرد دارد. این خانه حافظه میتواند رجیستر و یا آدرس پورت و … باشد. استفاده از این حافظه مستلزم آدرس دهی است. مثلاً فرض کنید بخواهیم مقدار دو رجیستر را با هم جمع کنیم. آدرس هر دو رجیستر باید داشته باشیم تا مقدار این دو رجیستر را جمع کرده و در رجیستر دیگر مثلاً اکومولاتور بریزیم. به این کار آدرس دهی می گویند. یا فرض کنید بخواهیم مقداری عددی را در یک خانه حافظه ذخیره کنیم. در این حالت نیز باید عددی را در رجیستر و از آنجا به خانه حافظه منتقل کنیم. در برنامه نویسی به زبان اسمبلی شناخت روشهای آدرس دهی بسیار مهم است. اندازه گیری تعداد کلاک های اجرای هر خط برنامه در کاربردهایی که اهمیت زیادی دارد حیاتی است. آشنایی با هر دستور اسمبلی در روش آدرس دهی آن در برنامه نویسی ضروری است. بدین معنا که با استفاده از یک دستور اسمبلی بایستی نوع آدرس دهی آن دستور را بدانیم. درپردازنده های با معماری RISC، که اکثر دستورات با تعداد کلاک کمی اجرا می شود روش های آدرس دهی انواع کمتری دارد اما در سی پی یو های با معماری CISC، که هر دستور اسمبلی بیش از چند کلاک زمان می‌گیرد روشهای آدرس‌دهی پیچیده تری داریم.

در معماری کامپیوتر به طور کلی ۱۲ روش آدرس دهی داریم، که این ۱۲ دسته به ۴ دسته کلی آدرس دهی مستقیم، آدرس دهی غیر مستقیم، آدرس دهی فوری و آدرس دهی نسبی دسته بندی می شود. این ۱۲ روش به صورت زیر هستند:

۱- حالت آدرس دهی ضمنی

۲- حالت آدرس دهی پشته

۳- حالت آدرس دهی فوری

۴- حالت آدرس دهی مستقیم

۵- حالت آدرس دهی غیر مستقیم

۶- حالت آدرس دهی مستقیم در رجیسترها

۷- حالت آدرس دهی غیر مستقیم در رجیسترها

۸- حالت آدرس دهی نسبی

۹- حالت آدرس دهی نمایه شده

۱۰- حالت آدرس دهی با رجیستر پایه

۱۱- حالت آدرس دهی با افزایش خودکار

۱۲- حالت آدرس دهی با کاهش خودکار

حال به توضیح هر کدام از روشهای آدرس‌دهی می پردازیم.

روش آدرس دهی ضمنی

در این روش خود دستور اسمبلی به صورت ضمنی آدرس دهی را در خود دارد. بدین معنی که در دستور اسمبلی هیچ داده یا آدرسی دیده نمی شود ولی این دستور به صورت ضمنی آدرس دهی را در بطن خود دارد. مثلاً دستور زیر را دقت کنید: (بسته به نوع پردازنده و معماری آن دستورات متفاوتی دیده می شود)

CMA

دستور نشان داده شده که برای معماری کامپیوتر ۸۰۸۵ است رجیستر آکومولاتور را کامپلیمنت می‌کند. (Complement Accumulator). در دستور بالا آدرس آکومولاتور مشخص نیست ولی به طور ضمنی در دستور مستتر است. به این روش آدرس دهی، آدرس‌دهی ضمنی یا Implicit Addressing Mode می گویند.

حالت آدرس دهی پشته

این روش آدرس دهی مخصوص پشته ها یا stack ها می باشد. در این روش دستور بر خانه‌های بالای پشته عمل می کند. در این حالت نیز مقدار آدرس مشخص نیست و در دستور مستتر است ولی چون این دستور بر روی پشته ها عمل می کند به این روش روش آدرس دهی پشته ها می گوییم. 

مثلاً دستور PUSH و POP. که دیتایی را در قسمت بالای پشته گذاشته و یکی به آدرس اشاره شده به خانه حافظه پشته اضافه می‌کند یا داده ای را از حافظه برداشته و یکی از آدرس اشاره شده به پشته کم می کند. در این حالت نیز آدرس اشاره شده در خود دستور مستتر است و برای پردازنده مشخص است. به این روش آدرس دهی، روش آدرس دهی پشته یا Stack Addressing Mode میگویند.

حالت آدرس‌دهی فوری

آدرس دهی فوری

در این روش مقدار عددی به طور مستقیم در رجیستر قرار می گیرد. مثلاً:

ADD #45

در این دستور مقدار عددی ۱۰ به رجیستر آکومولاتور اضافه میشود. آدرس آکومولاتور برای پردازنده مشخص است.

MOV R1 #56

در این دستور مقدار عددی ۵۶ به رجیستر R1 منتقل می شود. 

به این روش آدرس دهی، آدرس دهی فوری یا Immediate Addressing Mode گفته می شود.

حالت آدرس دهی مستقیم

روش آدرس دهی مستقیم

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

SUB 450

در این دستور مقداری که در خانه ۴۵۰ حافظه قرار دارد از رجیستر اکومولاتور کم میشود. در این حالت همانگونه که دیده می شود مقدار عددی مشخص نشده بلکه آدرس جایی که این عدد ذخیره شده در دستور اسمبلی آمده است. به این روش آدرس دهی، آدرس‌دهی مستقیم یا Direct Addressing Mode گفته می‌شود. همانطور که مشاهده می شود در این روش خانه حافظه به صورت مستقیم آدرس دهی می شود. (دقت کنید که علامت # که در پشت عدد نیامده، به کامپایلر اعلام می کند که عدد نشان داده شده آدرس است نه یک مقدار عددی.) یا به عنوان مثالی دیگر:

LOAD R1 100

LOAD R1 R2

که در خط اول مقداری که در آدرس ۱۰۰ ذخیره شده است مستقیماً به رجیسترR1 ریخته می شود و در خط دوم نیز مقدار ذخیره شده در رجیستر R2 به رجیستر R1 ریخته می شود.

روش آدرس دهی غیر مستقیم

روش آدرس دهی غیر مستقیم

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

LOAD R1 @100

در این حالت رجیسترR1 با مقداری که در خانه ای به آدرسی که در خانه حافظه شماره ۱۰۰ ذخیره شده پر می شود. همانطور که می بینید آدرس دهی به حافظه به صورت غیر مستقیم صورت گرفته است. به این روش آدرس دهی، آدرس دهی غیر مستقیم یا Indirect Addressing گفته میشود.

حالت آدرس دهی مستقیم در رجیسترها

در واقع همان حالت آدرس‌دهی مستقیم است، فقط دستوراسمبلی روی مقدار حافظه کار نمی‌کند بلکه روی مقدار رجیستر کار میکند در این حالت آدرس دهی به رجیستر هاست و کاری با حافظه نداریم. مثلاً:

ADD R1

دستور بالا مقدار ذخیره شده در رجیستر R1 را به طور مستقیم با آکومولاتور جمع می‌کند و در آکومولاتور قرار دهد.

حالت آدرس دهی غیر مستقیم در رجیسترها

در واقع همان حالت درصد غیرمستقیم است، فقط دستور اسمبلی روی مقدار حافظه کار نمی کند بلکه روی رجیستر ها کار میکند. یعنی آدرس رجیستری که دستور اصلی روی آن موثر است در رجیستری که در دستور آمده ذخیره شده است. مثلاً:

ADD @R1

در مثال بالا مقدار ذخیره شده در آدرسی که در رجیستر R1 ذخیره شده است با آکومولاتور جمع شده و در آکومولاتور قرار می گیرد. 

حالت آدرس دهی نسبی

در این حالت مقداری که دستور اسمبلی روی آن موثر است با اضافه شدن مقداری که در دستور آمده به نقطه فعلی حافظه که PC (Program Counter به آن اشاره می کند، به دست می آید. یعنی مقداری که در دستور اسمبلی آمده مستقیماً استفاده نمی شود بلکه آدرس دهی نسبت به مکان فعلی PC انجام گرفته است. مثلاً:

JMP 350

SJMP 60

 دستورات بالا مستقیماً عدد PC را با ۳۵۰ و ۶۰ جمع می کند.

حالت آدرس دهی نمایه شده

در این روش آدرس دهی مقدار آدرس نسبت به عددی که در رجیستر ذخیره شده به دست می آید. در واقع مقدار ای که دستور اسمبلی روی آن موثر است با جمع کردن مقدار آدرس عددی که در رجیستر ذخیره شده است به دست می آید. یک مثال این روش را روشن تر توضیح می دهیم:

LOAD R1 100(R2)

در این دستور مقدار رجیسترR2 با عدد ۱۰۰ جمع میشود و عددی که به دست می آید آدرس ایست که دستور اسمبلی روی آن موثر است و مقداری که در آن آدرس ذخیره شده است رجیسترR1 منتقل می شود. به این روش آدرس دهی، روش آدرس دهی نمایه شده یا indexed addressing mode گفته می شود.

حالت آدرس دهی با رجیستر پایه

در این حالت آدرس حافظه‌ای که دستور اسمبلی روی آن موثر است با جمع عدد آورده شده در دستور اسمبلی با رجیستر آکومولاتور یا هر رجیستر دیگری که در معماری کامپیوتر مشخص شده است به دست می آید. مثلاً:

MOVA 100

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

MOV1 40

همانطور که در بالا توضیح داده شد فرض کنید بخواهیم پردازنده‌ای را طراحی کنیم که قابلیت آدرس دهی با رجیستر پایه را داشته باشد. فرض کنید رجیستر پایه ما در آدرس دهی مثلاً رجیستر R10 باشد. دستور MOV1 را تعریف می کنیم به صورتی که مقدار رجیستر ذکر شده را با عددی که در ادامه آمده جمع کند و حاصل را در رجیستر ذکرشده بریزد. به این روش آدرس دهی، روش آدرس دهی با کمک رجیستر پایه یا Base Register Addressing Mode گفته می شود.

حالت آدرس‌دهی با افزایش خودکار

در این حالت چه حالت خاصی از آدرس دهی غیرمستقیم رجیستر ها می باشد پس از اینکه آدرس جایی از حافظه که دستور اسمبلی روی آن موثر است و در رجیستر ذخیره شده است مشخص شد به مقدار رجیستر به اندازه پله اضافه می شود. مقدار پله در معماری طراحی شده است. مثلاً اگر مقدار پله ۱ یاشد، d = 1،‌ به آدرسی که در رجیستر ذخیره شده است یک واحد اضافه می شود. این حالت آدرس دهی، روش آدرس دهی با افزایش خودکار گفته می شود.

حالت آدرس دهی با کاهش خودکار

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

حرف پایانی

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

0 پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگوها شرکت کنید؟
در گفتگو ها شرکت کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *