Thumb指令集之:Thumb数据处理指令
=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> (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> (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> (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> (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> (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> (1)编码格式 数据传送指令MOV(1)的编码格式如图11.28所示。 图11.28MOV(1)指令的编码格式 (2)指令的语法格式 MOVRd>,#immed_8> ①Rd> 目的寄存器。存放指令的执行结果。 ②11.4.17异或指令EOR
11.4.18逻辑左移指令LSL(1)
11.4.19逻辑左移指令LSL(2)
11.4.20逻辑右移指令LSR(1)
11.4.21逻辑右移指令LSR(2)
11.4.22移位指令MOV(1)
Thumb指令集 数据处理指令 ARM MOV指令 移位指令 相关文章:
- Thumb指令集之: Thumb指令的特点及实现(08-30)
- Thumb指令集之: Thumb跳转指令(08-30)
- Thumb指令集之: Thumb指令应用(08-30)
- Thumb指令集之: ARM和Thumb的混合编程(08-30)
- Thumb指令集与ARM指令集的区别(11-21)
- Thumb指令集之: Thumb指令应用(09-30)