در 8051  هشت نوع آدرس دهی وجود دارد که عبارتند از:

 

1) آدرس دهی ثبات ((Rejister Addresing

2) آدرس دهی مستقیم ((Direct Addresing

3) آدرس دهی غیر مستقیم ((Indirect Addresing

4) آدرس دهی فوری   (   (Immediate Addresing

5)   آدرس دهی نسبی  (  (Relative Addresing

6)    آدرس دهی مطلق ( (Absolute Addresing

7)  آدرس دهی بلند ((Long Addresing

8)     (Index Addresingآدرس دهی اندیس دار (

 

 

1- آدرس دهی ثبات:

   در 8051 هشت ثبات با نام بانک ثبات وجود دارد که این ثبات ها به صورت تک تک با نامهای R0-R7  شناخته می شوند تعدادی از دستورالعمل های 8051 بر روی این ثباتها کار می کنند ابن دستورالعملها را دستورهای با آدرس دهی ثبات گویند.در دستورا ت آدرس دهی ثبات ,  سه بیت کم ارزشتر کد دستور  ,  آدرس ثباتهای مذکور را مشخص می کند بنابراین کد اجرا و آدرس ثبات در یک بایت دستور قرار می گیرد.

زبان اسمبلی میکروکنترولر 8051 ,  آدرس دهی ثبات را با سمبل RN  مشخص می کند که  N  بین 0 تا 7 می باشد.به عنوان مثال برای اضافه کردن محتوای ثبات   R7 به آکومولاتور دستور زیر استفاده می شود:

ADD A,R7

 

کد اجرای این دستور 00101111   است که 5بیت پر ارزشتر یعنی 00101  دستور جمع ADD  و سه بیت کم ارزش تر آن یعنی 111 ثبات  R7  را مشخص می نماید.

 

 

 

مثال2:

 کد اجرای دستور زیر چیست و این دستور چه عملی انجام می دهد؟

                                                                                                  MOV A,R7

 

اصولا 15 نوع دستور  MOV  وجود دارد که در اینجا نوع MOV A,Rn  را بررسی می کنیم. کد باینری این دستور به صورت 11101rrr  است که سه بیت کم ارزش تر ,  آدرس ثبات منبع را مشخص می کند . با قرار دادن آدرس  R7  یعنی 111 در کد باینری به جای rrr  خواهیم داشت 11101111 که کد EFH  برای دستور مذکور حاصل می شود.دستور مذکور محتوای ثبات R7  را به آکومولاتور منتقل می کند.

 

آدرس دهی مستقیم:

همانطور که می دانیم هر بیت (8 بیت) از حافظه میکرو به وسیله عددی منحصر به فرد که شماره ردیف آن بیت است مشخص می شود ,  این عدد منحصر به فرد آدرس نام دارد. از این جهت می گوییم منحصر به فرد زیرا هیچ دو بیت از حافظه میکرو دارای یک آدرس نیستند.

لذا با استفاده از این آدرس می توان به کلیه مکانهای حافظه دسترسی داشت . آدرس دهی مستقیم از این آدرس استفاده می کند. علائه بر آدرس ,  بیشتر مکانهای حافظه دارای نام نیز هستند. برای مثال پورت یک هم دارای آدرس 90H  است و هم نام P1  را دارد. استفاده از هر دو (نام یا آدرس ) در برنامه نویسی مجاز است.

در برنامه نویسی هنگامی که عددی را بدون هیچ پیشوندی می نویسند نشان دهنده استفاده از آدرس دهی مستقیم است.

 

به عنوان مثال در دستور زیر:

MOV P1,A

که محتوای ثبات آکومولاتور (A) را به پورت P1  انتقال می دهد ,  از آدرس دهی مستقیم استفاده شده است.

 

آدرس دهی غیر مستقیم:

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

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

برای فهم بیشتر مطلب دو دستور زیر را در نظر بگیرید:

MOV R0,#90h

MOV @R0,A

 

دستور اول عدد 90 در مبنای 16 را در ثبات R0  قرار می دهد. عدد 90h  آدرس پورت یک می لاشد.دستور دوم به میکرو دستور می دهد تا محتوای ثبات A  را در آدرسی که در R0  است (یا مکانی که R0 به آن اشاره می کند) قرار بده.

جمله بالا در مفاهیم برنامه نویسی به نام اشاره گر معروف است . اشاره گر متغیری است که آدرس مکان حافظه را در خود نگه می دارد.

در این دستور @R0 معادل همان P1 است.

 

آدرس دهی فوری یا بلافاصله:

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

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

MOV A,#90h

MOV A,9h

دستور اول عدد 90 در مبنای 16 را در ثبات A  قارا می دهد . بعد از اجرای دستور مطمئن هستیم که محتوای ثبات A  ,  . 90h است.دستور دوم مقداری را که در آدرس 90h  حافظه است در ثبات  A قرار می دهد یادآوری می کنم که 90h آدرس پورت یک است . بنابراین هر عددی که بر روی پورت یک باشد در درون ثبات A قرار خواهد گرفت و ما از مقدار این عدد هیچ اطلاعی نداریم.

 

 

آدرس دهی نسبی:

این نوع آدرس دهی در چند دستورالعمل پرشی به کار رفته است ( مانند ( sjmp با استفاده از این نوع آدرس دهی می توان به 127 بایت بالاتر و 127 بایت پایین تر از مکان فعلی برنامه پرش کرد. هنگامی که کامپایلر به این نوع دستورات پرشی می رسد آدرس مبدا را از آدرس مقصد تفریق می کند و نتیجه را به شمارنده برنامه اضافه می کند( (pc دستور زیر را در نظر بگیرید:

 

90 sjmp 100

اکنون در مکان 90 حافظه هستیم برنامه می خواهد به مکان 100 پرش کوتاه انجام دهد . آدرس مبدا از مقصد کم می شود (100-90) و به  pc  ,  +10 واحد اضافه می شود.

مزیت استفاده از این نوع آدرس دهی این است که کد مستقل از مکان ایجاد می کند.

 

آدرس دهی مطلق:

آدرس دهی مطلق فقط برای دستورات ACALL  (فراخوانی سابروتین) و AJMP  (پرش مطلق) به کار برده می شود و دو بایتی هستند . با این دستورات می توان تا 2K بایت در داخل یک صفحه حافظه پرش نمود.

 

به عنوان مثال:

 

AJMP BACK

 

 

آدرس دهی بلند:

این نوع آدرس دهی با دستورات فذاخوانی سابروتین(( LCALL و دستور پرش بلند ((LJMP به کار برده می شود.این دستورات 3 بایتی هستند که در بایت دوم و سوم آنها آدرس 16 بیتی مقصد می باشد.

یکی از مزیتهای این دستورات این است که می توان به تمات فضای حافظه برنامه دسترسی پیدا کرد ولی اشکال آن ها این است که سه بایت طول دارند.

 

به عنوان مثال:

LJMP FAR_AHEAD

 

 

آدرس دهی اندیس دار:

این نوع آدرس دهی در دستورات پرش ( ( JMP و انتقال ( (MOVC  استفاده می شودکه محتوای ثبات پایه مانند((pc یا اشاره گر داده ((DPTR را با محتوای آکومولاتور جمع می کند تا آدرس مقصد حاصل شود.

هم چنین این نوع آدرس دهی در نوشتن جداول جستجو ((LOOUP TABLE استفاده می شود.

 

به عنوان مثال:

MOVC A,@A+DPTR