Thumb指令集之:Thumb数据处理指令
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体系结构相关文档。 (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> (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> (1)编码格式 比较指令CMN的编码格式如图11.19所示。 图11.19CMN指令的编码格式 比较指令CMN将一个寄存器的值和另一个寄存器的值取负做比较,并根据比较结果更新程序状态字的标志位。程序中比较指令后通常跟条件执行指令。 (2)指令的语法格式 CMNRn>,Rm> ①Rn> 操作数寄存器。用于存放指令的第一个操作数。 ②Rm> 操作数寄存器。用于存放指令的第二个操作数。 (3)指令操作的伪代码 Alu_out=Rn+Rm NFlag=alu_out[31] ZFlag=ifalu_out==0then1else0 CFlag=NOTBorrowFrom(Rn+Rm) VFlag=OverflowFrom(Rn+Rm) (4)对应的ARM指令 CMNRn>,Rm> (1)编码格式 比较指令CMP(1)的编码格式如图11.20所示。 图11.20CMP(1)指令的编码格式 比较指令CMP(1)将一个寄存器的值和8位立即数做比较,并根据比较结果更新程序状态字的标志位。程序中比较指令后通常跟条件执行指令。 (2)指令的语法格式 CMPRn>,#immed_8> ①Rn> 操作数寄存器。 ②immed_8> 8位常数。将与寄存器Rn>的值做比较。 (3)指令操作的伪代码 Alu_out=Rn–immed_8 NFlag=alu_out[31] ZFlag=ifalu_out==0then1else0 CFlag=NOTBorrowFrom(Rn–immed_8) VFlag=OverflowFrom(Rn–immed_8) (4)对应的ARM指令 CMPRn>,#immed_8> (1)编码格式 比较指令CMP(2)的编码格式如图11.21所示。 图11.21CMP(2)指令的编码格式 比较指令CMP(2)将两个寄存器的值做比较,并根据比较结果更新程序状态字的标志位。程序中比较指令后通常跟条件执行指令。 (2)指令的语法格式 CMPRn>,Rm> ①Rn> 操作数寄存器,存放比较的第一个操作数。 ②Rm> 操作数寄存器,存放比较的第二个操作数。 (3)指令操作的伪代码 alu_out=Rn–Rm NFlag=alu_out[31] ZFlag=ifalu_out==0then1else0 CFlag=NOTBorrowFrom(Rn-Rm) VFlag=OverflowFrom(Rn-Rm) (4)对应的ARM指令 CMPRn>,Rm> (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_out11.4.11算术右移指令ASR(2)
11.4.12位清零指令BIC
11.4.13比较指令CMN
11.4.14比较指令CMP(1)
11.4.15比较指令CMP(2)
11.4.16比较指令CMP(3)
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)