Thumb指令集之:Thumb数据处理指令
11.4.19逻辑左移指令LSL(2)
(1)编码格式
逻辑左移指令LSL(2)的编码格式如图11.25所示。
图11.25LSL(2)指令的编码格式
逻辑左移指令LSL(2)可以实现以2为底的幂的乘法。进行移位后空出的位添0并根据指令的操作结果更新程序状态寄存器的标志位。
(2)指令的语法格式
LSLRd>,Rs>
①Rd>
操作数寄存器,包含被移位的值并保存指令的执行结果。
②Rs>
包含逻辑左移位数的寄存器。
(3)指令操作的伪代码
ifRs[7:0]==0
CFlag=unaffected
Rd=unaffected
ElseifRs[7:0]32then
CFlag=Rd[32–Rs[7:0]]
Rd=Rdlogical_shift_leftRs[7:0]
ElseifRs[7:0]==32then
CFlag=Rd[0]
Rd=0
ElseifRs[7:0]==32then
CFlag=Rd[0]
Rd=0
Else/*Rs[7:0]>32*/
CFlag=0
Rd=0
NFlag=Rd[31]
ZFlag=ifRd==0then1else0
VFlag=unaffected
(4)对应的ARM指令
MOVSRd>,Rd>,LSLRs>
11.4.20逻辑右移指令LSR(1)
(1)编码格式
逻辑左移指令LSR(1)的编码格式如图11.26所示。
图11.26LSR(1)指令的编码格式
逻辑右移指令LSR(1)可以实现以2为底的幂做除数的除法。进行移位后空出的位添0,并根据指令的执行结果更新程序状态寄存器的标志位。
(2)指令的语法格式
LSRRd>,Rm>,#immed_5>
①Rd>
目的寄存器。存储指令的操作结果。
②Rm>
操作数寄存器。该寄存器保存的数据将进行右移操作。
③immed_5>
逻辑右移位数,范围为0~31。
(3)指令操作的伪代码
ifimmed_5==0
CFlag=Rd[31]
Rd=0
Else/*immed_5>0*/
CFlag=Rd[immed_5-1]
Rd=RmLogial_shift_rightimmed_5
NFlag=Rd[31]
ZFlag=ifRd==0then1else0
VFlag=unaffected
(4)对应的ARM指令
MOVSRd>,Rm>,LSR#immed_5>
11.4.21逻辑右移指令LSR(2)
(1)编码格式
逻辑左移指令LSR(2)的编码格式如图11.27所示。
图11.27LSR(2)指令的编码格式
逻辑右移指令LSR(2)可以实现以2为底的幂做除数的无符号除法。进行移位后空出的位添0,并根据指令的操作结果更新程序状态寄存器的标志位。
(2)指令的语法格式
LSRRd>,Rs>
①Rd>
操作数寄存器,包含被移位的值并保存指令的执行结果。
②Rs>
包含逻辑右移位数的寄存器。
(3)指令操作的伪代码
ifRs[7:0]==0
CFlag=unaffected
Rd=unaffected
ElseifRs[7:0]32then
CFlag=Rd[Rs[7:0]-1]
Rd=Rdlogical_shift_RightRs[7:0]
ElseifRs[7:0]==32then
CFlag=Rd[31]
Rd=0
ElseifRs[7:0]==32then
CFlag=Rd[0]
Rd=0
Else/*Rs[7:0]>32*/
CFlag=0
Rd=0
NFlag=Rd[31]
ZFlag=ifRd==0then1else0
VFlag=unaffected
(4)对应的ARM指令
MOVSRd>,Rd>,LSRRs>
评论