Thumb指令集之:Thumb数据处理指令
11.4.10算术右移指令ASR(1)
(1)编码格式
算术右移指令ASR(1)的编码格式如图11.16所示。
图11.16ASR(1)指令的编码格式
这种形式的算术右移指令可以方便的实现将一个寄存器的值除以一个常数。该常数是以2为底的幂。
(2)指令的语法格式
ASRRd>,Rm>,#immed_5>
①Rd>
目的寄存器。用于存放指令操作的结果。
②Rm>
操作数寄存器。存放将要被右移的数据。
③immed_5>
指定右移的位数。该常数取值范围为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)对应的ARM指令
MOVSRd>,Rm>,ASR#immed_5>
注意 | 在ARMv5以前的体系结构版本中,没有单独的Thumb移位指令。在ARMv6版本中已经增加了位移指令,详细信息请参加ARM体系结构相关文档。 |
11.4.11算术右移指令ASR(2)
(1)编码格式
算术右移指令ASR(2)的编码格式如图11.17所示。
图11.17ASR(2)指令的编码格式
此种形式的ASR指令的操作数均为寄存器。该指令根据指令的操作结果更新程序状态字的标志位。
(2)指令的语法格式
ASRRd>,Rs>
①Rd>
存放指令的操作数和操作结果。
②Rs>
指定操作数将要被移动的位数。
(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)对应的ARM指令
MOVSRd>,Rd>,ASRRs>
11.4.12位清零指令BIC
(1)编码格式
位清零指令BIC的编码格式如图11.18所示。
图11.18BIC指令的编码格式
BIC指令将两个寄存器的值按位做“异或”操作。该指令根据指令的执行结果更新程序状态字的标志位。
(2)指令的语法格式
BICRd>,Rm>
①Rd>
存放指令的操作数和操作结果。
②Rm>
操作数寄存器,该寄存器中的数据的反码将会和Rd>中的值做“与”操作。
(3)指令操作的伪代码
Rd=RdANDNOTRm
NFlag=Rd[31]
ZFlag=ifRd==0then1else0
CFlag=unaffected
VFlag=unaffected
(4)对应的ARM指令
BICSRd>,Rd>,Rm>
评论