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

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

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

immed_8>

8位立即数。指示要移入寄存器的数据。

(3)指令操作的伪代码

Rd=immed_8

NFlag=Rd[31]

ZFlag=ifRd==0then1else0

CFlag=unaffected

VFlag=unaffected

(4)对应的ARM指令

MOVSRd>,#immed_8>

11.4.23移位指令MOV(2)

(1)编码格式

数据传送指令MOV(2)的编码格式如图11.29所示。

图11.29MOV(2)指令的编码格式

此种形式的MOV指令用于数据在r0~r7低寄存器间传送,并根据的指令的执行结果更新程序状态寄存器的标志位。

注意

从指令的编码形式可以看出,MOV(2)指令被作为ADDRd,Rn,#0指令来编译。

(2)指令的语法格式

MOVRd>,Rn>

①Rd>

目的寄存器。存放指令的执行结果。

②Rn>

源寄存器。用于存放被传送的数据。

(3)指令操作的伪代码

Rd=Rn

NFlag=Rd[31]

ZFlag=ifRd==0then1else0

CFlag=0

VFlag=0

(4)对应的ARM指令

ADDRd>,Rn>,#0

11.4.24移位指令MOV(3)

(1)编码格式

数据传送指令MOV(3)的编码格式如图11.30所示。

图11.30MOV(3)指令的编码格式

此种形式的MOV指令用于在r8~r14和PC寄存器的高16位内传送数据。与MOV(2)指令不同,该指令不影响程序状态寄存器。

(2)指令的语法格式

MOVRd>,Rm>

①Rd>

目的寄存器。可以是r0~r15中的任意寄存器,用于存放指令的执行结果。

②Rm>

源寄存器。可以是r0~r15中的任意寄存器,用于存放被传输的数据。

(3)指令操作的伪代码

Rd=Rm

(4)指令的使用

可以使用此种形式的MOV指令MOVPC,r14用于子程序的返回(返回的程序是Thumb子程序)。它和BX指令的区别在于BX指令可以用于ARM和Thumb程序间的相互调用。

注意

如果目的寄存器Rd>和源寄存器Rm>同时为r0~r7低寄存器,则指令的执行结果不可预知。

(5)对应的ARM指令

MOVRd>,Rm>

11.4.25乘法指令MUL

(1)编码格式

乘法指令MUL的编码格式如图11.31所示。

图11.31MUL指令的编码格式

MUL指令实现两个数(可以为无符号数,也可以为有符号数)的乘积,并将指令的执行结果存放到一个32位的寄存器中,同时可以根据运算结果设置CPSR寄存器中相应的条件标志位。

(2)指令的语法格式

MULRd>,Rm>

①Rd>

目的寄存器,存放乘法操作的第一个乘数。

②Rm>

第二个乘数所在寄存器。

(3)指令操作的伪代码

Rd=(Rm*Rd)[31:0]

NFlag=Rd[31]

ZFlag=ifRd==0then1else0

CFlag=unaffected

VFlag=unaffected

注意

如果乘法指令MUL的源和目的寄存器使用相同的寄存器,则指令的执行结果不可预知;对于有符号数和无符号数,指令的操作结果是一样的。

(4)对应的ARM指令

MULSRd>,Rm>,Rd>

11.4.26传送指令MVN

(1)编码格式

传送指令MVN的编码格式如图11.32所示。

图11.32MVN指令的编码格式

MVN指令将一个数的反码传送到目标寄存器,并根据指令的执行结果更新CPSR中相应的条件标志位。

(2)指令的语法格式

MVNRd>,Rm>

①Rd>

目的寄存器,存放指令的操作结果。

②Rm>

源寄存器,存放要传送反码的数据。

(3)指令操作的伪代码

Rd=NOTRm

NFlag=Rd[31]

ZFlag=ifRd==0then1else0

CFlag=unaffected

VFlag=unaffected

(4)对应的ARM指令

MVNSRd>,Rm>

11.4.27取反指令NEG

(1)编码格式

取反指令NEG的编码格式如图11.33所示。

图11.33NEG指令的编码格式

NEG取反指令将一个寄存器的值取反存入另一个寄存器。同时根据指令的操作结果更新CPSR中相应的条件标志位。

(2)指令的语法格式

NEGRd>,Rm>

①Rd>

目的寄存器,存放指令的操作结果。

②Rm>

源寄存器,包含将要被取反的数据。

(3)指令操作的伪代码

Rd=0–Rm

NFlag=Rd[31]

ZFlag=ifRd==0then1else0

CFlag=NOTBorrowFrom(0-Rm)

VFlag=OverflowFrom(0-Rm)

(4)对应的ARM指令

RSBSRd>,Rm>,#0

11.4.28逻辑或指令ORR

(1)编码格式

逻辑或指令ORR的编码格式如图11.34所示。

图11.34ORR指令的编码格式

ORR指令将两个寄存器的值做按位做或运算,并根据指令的执行结果更新程序状态寄存器的标志位。

(2)指令的语法格式

ORRRd>,Rm>

①Rd>

目的寄存器,存放指令的操作结果,存放做逻辑或运算的其中一个操作数。

②Rm>

存放做逻辑或运算的另一个操作数。

(3)指令操作的伪代码

Rd=RdORRm

NFlag=Rd[31]

ZFlag=ifRd==0then1else0

CFlag=unaffected

VFlag=unaffected

(4)对应的ARM指令

ORRSRd>,Rd>,Rm>

11.4.29循环右移指令ROR

(1)编码格式

循环右移指令ROR的编码格式如图11.35所示。

图11.35ROR指令的编码格式

ROR指令将一个给定寄存器的值循环右移一定的位数。并根据指令的操作结果更新状态寄存器的条件标志位

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

网站地图

Top