Opcode : نشان دهنده ی عملیات دستورالعمل است.
Shift:نشان دهنده ی این است که دستورالعمل کدهای شرطی را تغییر می دهد.
Rd:رجسیتر مقصد را مشخص می کند.
Rn:رجسیتر عملگر صحیح را مشخص می کند.
بیت های [11:0]: بیت های shifter operand که بعداً توضیح داده می شود.
بیت 25: I بیت است که مشخص کننده ی حالت بین immediate shifter و register-base shifter operand است.
اگر بیت های نشان داده شده همه مقدارهای نشان داده شده را بگیرد دستورالعمل پردازش داده نیست بلکه در فضای دستورالعمل های لود و ذخیره یا محاسباتی قرار میگیرد.
اگر بیت های نشان داده شده همه مقدارهای نشان داده شده را بگیرد دستورالعمل پردازش داده نیست بلکه در فضای دستورالعمل های لود و ذخیره یا محاسباتی قرار میگیرد.
1= ]7[ bit 0= ]4[ bit 0= ]25[ bit 1-2: shifter operand یکی از سه فرمت زیر را دارد.
مقدار عملگر فوری: مقداری است که توسط چرخش 8 بیت ثابت در 32 بیت word توسط یک عدد زوج (30، 000، 2،0) ایجاد می شود.
چند مقدار صحیح ثابت: 0FF* 0 ، 104 * 0، FF * 0 F000000F* 0 ، 00FF * 0 چند مقدار ناصحیح ، 102* 0، 101*0 برای مثال: MOV R0#، ADD R3, RB, #1 CMP R7, #10000 BIC Rq, R8, 0* FF 00 مقدار عملگر رجیستر: مقدار یک رجسیتر است.
به عنوان مثال مقدار را به منتقل می کند و MOV مقادیر و را جمع کرده و حاصل را در ذخیره می کند.
و و ADD مقدار عملگر رجسیتر شیفت یافته: مقدار یک رجیستر که پیش از عملگر پردازش داده شیفت(چرخش) یافته باشد.
5 نوع شیفت داریم: ASR Arithmetic shift right LSR: logical shift left LSR: logical shift right ROR: Rotate right RRX: Rotate right with entend مقدار عددی که می خواهیم شیفت بدهیم می تواند یک عدد فوری یا یک رجیستر باشد.
مقدار R را به سمت چپ 2 بار شیفت 2# LSL، ، MOV داده و در می ریزد ROR، ، MOV که به مقدار شیفت داده شده است.
1-3 عملگرهای فوری پردازش داده مقدار shifter- operand تشکیل می شود با چرخش یک مقدار فوری 5 بیتی در موقعیت های بیت زوج در یک 32 بیتی.
اگر مقدار عددی صفر باشد، مقدار خروجی shifter مقدار C می باشد.
در غیر این صورت به مقدار بیت 31 shifter operand ست می شود.
: برابر است با حاصل چرخش immed-8 با مقدار rotate-imm*2 عملیات: shifter- operand = immed-8 rotate right (rotate-immed *2) if rotate-imm=0 then shifter- carry-out=c flay else shifter- carry-out= shifter- operand [31] مقادیر فوری مجاز می باشند که تنها از چرخش یک 8 بیتی به یک مقدار زوج در 32 بیتی word حاصل می شوند.
Cncoding بعضی مقادیر بیشتر از یک روش برای encoding دارند.
مثلاً E* 0= rotate-imm 3F* 0= 8-immd F*0= rotate-imm FC*0= 8-immed در چنین مواردی اسمبلر باید مقدار صحیح را طبق زیر انتخاب کند: اگر مقدار فوری در بازه ی 0 تا FF* 0 قرار داشته باشد، encoding با rotate-imm=0 قابل دسترس است.
در غیر این صورت توصیه می شود که encoding با کوچکترین مقدار ممکن rotate- imm انتخاب شود.
1-4 data processing operands – tegister : رجیستری را مشخص می کند که عملگر دستورالعمل مقدار آن است.
Shifter-operand=Rm Shifter- carry= C flay Encoding: این دستورالعمل encode می شود که شیفت منطقی به سمت چپ (0= shift-imm) اگر به جای و مورد استفاده قرار گیرد و مقدار استفاده شده آدرس دستورالعمل است به علاوه ی 8.
1-5- شیفت منطقی به سمت چپ به یک عدد فوری این عملگر به کار می رود برای تولید مقدار یک رجسیتر 1 مقدار شیفت چپ داده شده یک رجسیتر (ضرب شده در یک توانی از 2) مقدار خارج شده از shifter بیت آخری است شیفت داده شده و اگر شیفتی داده نشده باشد فلگ c است.
, LSL# : رجسیتری است که مقدار آن باید شیفت داده شود.
LSL: نشان دهنده ی شیفت منطقی به سمت چپ است.
: مقدار شیفت را نشان می دهد که عددی است بین 0 تا 31 1-6: شیفت منطقی به سمت چپ با یک رجیستر این عملگر پردازش داده برای تولید مقدار یک یک رجیستر ضرب در یک توانی از 2 به کار می رود.
عملگر این دستورالعمل مقدار رجیستر Rm است.
که با مقدار بایت سمت راست Rs شیفت داده شده است.
مقدار carry-out آخرین بیتی است که با شیفت خارج شده و صفر است اگر مقدار بشیتر از 32 باشد و فلگ c است اگر مقدار شیفت صفر باشد.
, LSL رجیستری است که مقدار شیفت در آن قرار دارد.
1-7: شیفت منطقی به سمت راست با یک عدد فوری درست مانند شیفت منطقی به سمت چپ است.
1-8: شیفت منطقی به سمت راست با یک رجیستر درست مانند شیفت منطقی به سمت چپ با رجیستر 1-9- شیفت سمت راست محاسباتی با عدد فوری این عملگر پردازش داده یک مقدار عددی که به صورت محاسباتی به راست شیفت داده شده می دهد.
عملگر این دستورالعمل مقدار رجسیتر Rm است که بوسیله یک عدد فوری بین 1 تا 32 شیفت محاسباتی داده می شود.
بیت 31 Rm بیت خالی شده را می گیرد و بیت خارج شده آخرین بیت شیفت داده شده است.
, ASR # arithmetic shift right :ASR عملیات: if shift-imm=0 then if Rm [31]=0 then shifter- operand=0 shifter-carry-out=Rm[31] else shifter-operand= 0* FFFFFFFF shifter-carry-out=Rm[31] else shifter-operand= Rm arithmetic – shift –right shifter- carry= Rm[shift-imm-1] این عملگر دستورالعمل مقدار رجیستر Rm است که توسط مقدار بایت پایین Rs شیفت محاسباتی به سمت راست داده شده است.
بیت 31 Rm به جای بیت خالی قرار می گیرد.
بیت carry-out آخرین بیت شیفت داده شده است.
اگر مقدار شیفت بیشتر از 32 باشد این مقدار بیت علامت Rm است و اگر مقدار شیفت صفر باشد این مقدارؤ مقدار فلگ c است.
, ASR 1-11- چرخش به راست یک عددی فوری این عملگر برای تهیه ی مقدار یک رجیستر که توسط عددی ثابت چرخش یافته استفاده می شود که مقدار رجیستر Rm توسط عددی که رنج آن بین 1 تا 31 است چرخیده می شود بیت آخری که در سمت راست چرخیده شد در جای خالی سمت چپ قرار می گیرد و این بیت در carryout نیز قرار می گیرد.
, RoR # : مشخص کننده ی چرخش است که عددی است بین 1 تا 31.
اگر صفر باشد RRM نتیجه می شود.
عملیات: if shift- inn= then RRX Else shift-imm>0 Shifter- operand – Rm rotate- right shift-imm Shifter- carry-out=Rm[shift-imm-1] 12-1 چرخش به راست با رجیستر برای تولید یک مقدار رجیستر که توسط یک متغیر چرخش داده شده به کار می رود.
مقدار رجیستر Rm توسط بایت سمت راست Rs چرخیده می شود.
اگر مقدار shift صفر باشد carry-out مقدار فلگ c می باشد.
عملیات: if Rs [7:0]= 0 then shifter- operand= Rm shifter-carry-out= C Flag else if Rs[14:0]= 0 then shifter-operand=Rm shifter-carry-out=Rm [31] else shifter-operand=Rm rotate-right Rs[4:0] shifter-carry-out=Rm[Rs[4:0]-1] 13-1 Rotate with extend این عملگر برای تهیه ی چرخش به سمت راست 33 بیتی است که بیت 33 فلگ c در نظر گرفته می شود.
عملگر این دستور مقدار رجیستر Rm را یک بیت به سمت راست شیفت می دهد و جای خای را فلگ c پر می کند.
و carry-out بیتی است که به بیرون شیفت داده شده است.
, RRx این نوع مد توسط ADC ایجاد می شود.
2.
ذخیرع و لود word یا بابت بدون علامت 9 مد آدرس دهی برا محاسبه ی آدرس برای ذخیره و بود word یا بایت بدون علامت وجود دارد.
حالت کلی آن.
LDR |STR| {} {B} {T} , که adderessing- mode آن یکی از 9 روش زیر است.
1- [ # t/- ] 2-[, t/- ] 3-[, t/- , # ] 4-[, # t/- ]!
5-[, t/- ]!
6-[, t/- , # ]!
7-[], # t/- 8-[], t/- 9-[], t/- , ,# 2-1- encoding immediate offset Register offset/index Sealed register offset/index P بیت 0=P نشان دهنده ی استفاده post-index addressing- در این صورت ادرس رجیستر پایه برای آدرس دهی استفاده می شود و سپس آفست در رجیستر پایه اثر گذاشته و روی آن نوشته می شود.
P=1: نشان دهنده ی آدرس دهی آفست یا pre- index (بیت W مشخص می کند) آدرس با اثر آفست روی رجیستر پایه ایجاد می شود.
U: اگر U=0 آفست رجیستر پایه جمع و U=1 تفریق می شود.
W: 0=P: اگر W=0، LPRB و LDR، STR و STRB و دسترسی نرمال به حافظه است.
STRT, LDRT, LDRBT w=1 STRBT به کار می رود که دسترسی مد کاربر حافظه است.
1=p، اگر 0= w رجیستر پایه تغییر نمی کند ولی اگر 1=w باشد مقدار محاسبه شده برای حافظه روی رجیستر پایه می ریزد.
L: 1=L بود و 0= L ذخیره.
2-2- آفست فوری این مد مقدار آفست را با رجیستر بیس جمع و یا از آن کم می کند تا آدرس حافظه بدست آید.
: رجیستر شامل آدرس پایه را نشان می دهد.
: مقدار آفستی که با آدرس پایه به کار می رود را نشان می دهد.
If u=1 then Address= Rn+offset-12 Else N = Rn-N نکات: اگر [] به کار رود یعنی آفست برابر صفر است.
B: 0=B Word و 1=B بایت بدون علامت.
2-3- آفست رجسیتر آدرس با جمع یا تفریق کردن مقدار رجیستر Rm با یا از مقدار رجیستر پایه بدست می آید.
2-4- Scaleld register offset این مد آدرس دهی از جمع یا تفریق کردن مقدار شیفت داده یا چرخش داده ی Rm از یا با مقدار رجیستر Rn است.
[, t/ 0 , LSL# [, t/- , LSR# ] [, t/- , ASR #] [, t/- , ROR ] [ t/- , RPX] 2-5- pre- index فوری آدرس لز جمع یا تفریق کردن مقدار آفست از مقدار رجیستر پایه Rn بدست می آید.
اگر شرایط مشخص شده در دستورالعمل با حالت که شرایط تطبیق کند.
آدرس محاسبه شده در رجیستر پایه Rn ذخیره می شود.
[, # t/- ]!
!: بیت W راست می کند برای تغییر رجیستر پایه 2-6- register pre- index درست مانند مد بالا ولی به جای آفست فوری مقدار رجیستر Rm جمع یا تفریق می شود.
[, t/- ]!
2-7 Scald register pre- index درست مانند 2-4 ولی با این تفاوت که pre- index است یعنی اگر شرایط دستورالعمل با حالت که شرایطی تطبیق کند، آدرس محاسبه شده در Rn ریخته می شود.
[, t/- , LSL# ] 2-8 post- index فوری: [], #t/- در این مد آدرس دهی مقدار رجیستر Rn به عنوان آدرس در نظر گرفته می شود اگر شرایط دستورالعمل حالت کد شرایطی تطبیق کند مقدار آفست با یا از مقدار Rn جمع یا تفریق شده ورودی Rn ریخته می شود.
مانند حالت قبل ولی مقدار Rm از مقدار Rn کم یا زیاد می شود.
2-10 Scaled register post- indened درست مانند 2-7 اما آدرس مقدار Rn در نظر گرفته شده و سپس عملیات روی Rn صورت می گیرد.
[], t/- , LSL# -3- مد آدرس دهی شماره 3: Addressing modes: load and store halfword or load signed byte 6 مد آدرس دهی برای محاسبه آدرس برای دستورالعمل های لود و ذخیره (signed or unsigned) و یا برای لود کردن signed byte وجود دارد.
همان طور که در فصل 3 نیز مطرح شد، صورت کلی دستورالعمل های لود و ذخیره halfword و لود signed byte بصورت زیر است: LDR|STR{} H|SH|SB , بطوری که یکی از 6 حالت زیر است: 1)Immediate offset : [, # +/- ] 2)Register offset : [, +/- ] 3)Immediate pre-indexed : [ , # +/- ]!
4)register pre- indexed : [, # +/- 5)Immediate post-indexed : [, # +/- 6)register post-indexed : [], +/- این مجموعه دستورالعمل های نوع کدگذاری بصورت زیر هستند: 1)Immediate offset/index 2)register offset/index حال به معرفی بیت های دیاگرام های کدگذاری بالا می پردازیم: بیت P: : نشان دهنده استفاده از آدرس دهی post-indexed می باشد، مقدار رجیستر پایه برای آدرس حافظه استفاده می شود و سپس offset بکار برده می شود در مقدار رجیستر پایه و مقدار جدید در رجیستر پایه نوشته می شود.
: نشان دهنده استفاده از آدرس دهی offset یا pre-indexed می باشد.(بیت W یکی از این دو را مشخص می کند).
در این حالت آدرس حافظه با اعمال کردن offset به مقدار رجیستر پایه تولید می شود.
بیت U: مشخص می کند که آیا مقدار offset با مقدار پایه جمع می شود () یا از آن کم می شود )) بیت W، دو معنی دارد: اگر : بیت W باید صفر باشد وگرنه دستورالعمل unpredictable می شود.
اگر : نشان می دهد که آدرس حافظه بر روی رجیستر پایه نوشته میشود یعنی در حالت آدرس دهی pre-indexed هستیم.
که نشان می دهد مقدار رجیستر پایه بدون تغییر باقی می ماند.
(offset addressing) بیت L: بین در دستورالعمل های و فرق قائل می شود.
بیت S: بین دسترسی به signed halword و unsigned halfword فرق قائل می شود.
بیت H: بین یک (1= =H) و یک Byte (0=