Thumb指令集之:Thumb数据处理指令
11.4.16比较指令CMP(3)
(1)编码格式
比较指令CMP(3)的编码格式如图11.22所示。
图11.22CMP(3)指令的编码格式
比较指令CMP(3)将两个寄存器的值做比较,其中一个寄存器为r8~r14或PC寄存器高16位。并根据比较结果更新程序状态寄存器的标志位。程序中比较指令后通常跟条件执行指令,实现指令的分支跳转。
(2)指令的语法格式
CMPRn>,Rm>
①Rn>
操作数寄存器。保存将要进行比较的第一个操作数,其取值可以为r0~r15的任意寄存器。
②Rm>
操作数寄存器。保存将要进行比较的第二个操作数,其取值可以为r0~r15的任意寄存器。
(3)指令操作的伪代码
alu_out=Rn–Rm
NFlag=alu_out[31]
ZFlag=ifalu_out==0then1else0
CFlag=NOTBorrowFrom(Rn-Rm)
VFlag=OverflowFrom(Rn-Rm)
注意 | 指令操作数寄存器Rn>和Rm>中,至少有一个寄存器为r8~r14或PC寄存器的高16位,否则,指令的执行结果不可预知。 |
(4)对应的ARM指令
CMPRn>,Rm>
11.4.17异或指令EOR
(1)编码格式
比较指令EOR的编码格式如图11.23所示。
图11.23EOR指令的编码格式
EOR指令将两个寄存器中的数值按位执行“异或”操作,并根据指令的执行结果更新程序状态寄存器的标志位。
(2)指令的语法格式
EORRn>,Rm>
①Rn>
操作数寄存器。同时保存指令的第一个操作数和指令的执行结果。
②Rm>
操作数寄存器。保存将要进行比较的第二个操作数。
(3)指令操作的伪代码
Rd=RdORRm
NFlag=Rd[31]
ZFlag=ifRd==0then1else0
CFlag=unaffected
VFlag=unaffected
(4)对应的ARM指令
EORSRd>,Rd>,Rm>
11.4.18逻辑左移指令LSL(1)
(1)编码格式
逻辑左移指令LSL(1)的编码格式如图11.24所示。
图11.24LSL(1)指令的编码格式
逻辑左移指令LSL(1)可以实现以2为底的幂的乘法。进行移位后空出的位添0。
(2)指令的语法格式
LSLRd>,Rm>,#immed_5>
①Rd>
目的寄存器。存储指令的操作结果。
②Rm>
操作数寄存器。该寄存器保存的数据将进行左移操作。
③immed_5>
逻辑左移位数,范围为0~31。
(3)指令操作的伪代码
ifimmed_5==0
CFlag=unaffected
Rd=Rm
Else/*immed_5>0*/
CFlag=Rm[32–immed_5]
Rd=Rmlogical_shift_leftimmed_5
NFlag=Rd[31]
ZFlag=ifRd==0then1else0
VFlag=unaffected
(4)对应的ARM指令
MOVSRd>,Rm>,LSL#immed_5>
评论