Thumb指令集之:Thumb數(shù)據(jù)處理指令
11.4.10算術(shù)右移指令A(yù)SR(1)
(1)編碼格式
算術(shù)右移指令A(yù)SR(1)的編碼格式如圖11.16所示。
圖11.16ASR(1)指令的編碼格式
這種形式的算術(shù)右移指令可以方便的實現(xiàn)將一個寄存器的值除以一個常數(shù)。該常數(shù)是以2為底的冪。
(2)指令的語法格式
ASRRd>,Rm>,#immed_5>
①Rd>
目的寄存器。用于存放指令操作的結(jié)果。
②Rm>
操作數(shù)寄存器。存放將要被右移的數(shù)據(jù)。
③immed_5>
指定右移的位數(shù)。該常數(shù)取值范圍為1~31。
(3)指令操作的偽代碼
Ifimmed_5==0
CFlag=Rm[31]
IfRm[31]==0then
Rd=0
Else/*Rm[31]==1*/
Rd=0xffffffff
Else/*immed_5>0*/
CFlag=Rm[immed_5-1]
Rd=RmArithmetic_shift_Rightimmed_5
NFlag=Rd[31]
ZFlag=ifRd==0then1else0
VFlag=unaffected
(4)對應(yīng)的ARM指令
MOVSRd>,Rm>,ASR#immed_5>
注意 | 在ARMv5以前的體系結(jié)構(gòu)版本中,沒有單獨的Thumb移位指令。在ARMv6版本中已經(jīng)增加了位移指令,詳細信息請參加ARM體系結(jié)構(gòu)相關(guān)文檔。 |
11.4.11算術(shù)右移指令A(yù)SR(2)
(1)編碼格式
算術(shù)右移指令A(yù)SR(2)的編碼格式如圖11.17所示。
圖11.17ASR(2)指令的編碼格式
此種形式的ASR指令的操作數(shù)均為寄存器。該指令根據(jù)指令的操作結(jié)果更新程序狀態(tài)字的標志位。
(2)指令的語法格式
ASRRd>,Rs>
①Rd>
存放指令的操作數(shù)和操作結(jié)果。
②Rs>
指定操作數(shù)將要被移動的位數(shù)。
(3)指令操作的偽代碼
IfRs[7:0]==0then
CFlag=unaffected
Rd=unaffected
ElseifRs[7:0]32then
CFlag=Rd[Rs[7:0]-1]
Rd=Rdarithmetic_shift_RightRs[7:0]
Else/*Rs[7:0]>=32*/
CFlag=Rd[31]
IfRd[31]==0then
Rd=0
Else/*Rd[31]==1*/
Rd=0xffffffff
NFlag=Rd[31]
ZFlag=ifRd==0then1else0
VFlag=unaffected
(4)對應(yīng)的ARM指令
MOVSRd>,Rd>,ASRRs>
11.4.12位清零指令BIC
(1)編碼格式
位清零指令BIC的編碼格式如圖11.18所示。
圖11.18BIC指令的編碼格式
BIC指令將兩個寄存器的值按位做“異或”操作。該指令根據(jù)指令的執(zhí)行結(jié)果更新程序狀態(tài)字的標志位。
(2)指令的語法格式
BICRd>,Rm>
①Rd>
存放指令的操作數(shù)和操作結(jié)果。
②Rm>
操作數(shù)寄存器,該寄存器中的數(shù)據(jù)的反碼將會和Rd>中的值做“與”操作。
(3)指令操作的偽代碼
Rd=RdANDNOTRm
NFlag=Rd[31]
ZFlag=ifRd==0then1else0
CFlag=unaffected
VFlag=unaffected
(4)對應(yīng)的ARM指令
BICSRd>,Rd>,Rm>
評論