微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Thumb指令集之:Thumb数据处理指令

Thumb指令集之:Thumb数据处理指令

时间:09-30 来源:互联网 点击:

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>

11.4.13比较指令CMN

(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>

11.4.14比较指令CMP(1)

(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>

11.4.15比较指令CMP(2)

(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>

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top