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

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

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

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

11.4.19逻辑左移指令LSL(2)

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

11.4.20逻辑右移指令LSR(1)

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

11.4.21逻辑右移指令LSR(2)

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

11.4.22移位指令MOV(1)

(1)编码格式

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

图11.28MOV(1)指令的编码格式

(2)指令的语法格式

MOVRd>,#immed_8>

①Rd>

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

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

网站地图

Top