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

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

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

11.4Thumb数据处理指令

数据处理指令是指那些操作寄存器中数据的指令。Thumb指令集中的数据处理指令是ARM指令集数据处理指令的一个子集,其中包括MOV指令、算术指令、移位指令、逻辑指令、比较指令和乘法指令。表11.3列出了Thumb数据处理指令。

表11.3 Thumb状态数据处理指令

助记符

说明

操作

ADCRd,Rm

带进位的32位加

Rd:=Rd+Rm+Cflag

ADDRd,Rn,Rm

32位加

Rd:=Rn+Rm

ADDRd,Rn,#0~#7

32位加

Rd:=Rn+3_bit_immed

ADDRd,#0~#277

32位加

Rd:=Rn+8_bit_immed

ANDRd,Rm

逻辑与

Rd:=RdANDRm

ASRRd,Rm,#1~#32

算术右移

Rd:=RmASR5_bit_immed

ASRRd,Rs

算术右移

Rd:=RmASRRs

BICRd,Rm

位清零

Rd:=RdANDNOTRm

CMNRn,Rm

32位取负比较

Rn+Rm并设置标志位

CMPRn,#0~#255

32位整数比较

Rn-8_bit_immed并设置标志位

CMPRn,Rm

32位整数比较

Rn-Rm并设置标志位

EORRd,Rm

异或

Rd:=RdEORRm

LSLRd,Rm,#0~#31

逻辑左移

Rd:=RmLSL5_bit_immed

LSLRd,Rs

逻辑左移

Rd:=RdLSLRs

LSRRd,Rm,#1~#32

逻辑右移

Rd:=RmLSR5_bit_immed

LSRRd,Rs

逻辑右移

Rd:=RdLSRRs

MOVRd,#0~#255

将数据送入寄存器

Rd:=8_bit_immed

MOVRd,Rn

将数据送入寄存器

Rd:=Rn

MULRd,Rm

Rd:=Rm*Rd

MVNRd,Rm

将32位数的“反”送入寄存器

Rd:=NOTRm

NEGRd,Rm

求反

Rd:=0-Rm

ORRRd,Rm

逻辑或

Rd:=RdORRm

RORRd,Rs

逻辑右移

Rd:=RdRORRs

SBCRd,Rm

带进位减

Rd:=Rd-Rm-NOT(CarryFlag)

SUBRd,Rn,Rm

Rd:=Rn-Rm

SUBRd,Rn,#0~#7

Rd:=Rn-3_bit_immed

SUBRd,#0~#255

Rd:=Rn-8_bit_immed

TSTRn,Rm

位测试指令

RnANDRm并更新标志位

Thumb的数据处理指令与等价的ARM指令使用相同的格式。所有对r0~r7低8个寄存器操作的数据处理指令都更新条件标志位,对r8~r14和PC高8个寄存器操作的指令除MOV指令外,其他指令均不改变条件标志位。这些指令包括:

·MOVRd,Rn

·ADDRd,Rm

·CMPRn,Rm

·ADDsp,#0~#508

·SUBsp,#0~#508

·ADDRd,sp,#0~#1020

·ADDRd,pc,#0~#1020

Thumb数据处理指令的基本语法格式分为以下8种。

①opcode1>Rd>,Rn>,Rm>

opcode1>:=ADD|SUB

②opcode2>Rd>,Rn>,#3_bit_immed>

opcode2>:=ADD|SUB

③opcode3>Rd>|Rn>,#8_bit_immed>

opcode3>:=ADD|SUB|MOV|CMP

④opcode4>Rd>,Rm>,#shift_immed>

opcode4>:=LSL|LSR|ASR

⑤opcode5>Rd>|Rn>,Rm>|Rs>

opcode5>:=MVN|CMP|CMN|TST|ADC|SBC|NEG|MUL|LSL|LSR|ASR|ROR|AND|EOR|BIC

⑥ADDRd>,reg>,#8_bit_immed>

reg>:=SP|PC

⑦opcode6>SP,SP,#7_bit_immed>

opcode6>:=ADD|SUB

⑧opcode7>Rd>|Rn>,Rm>

opcode7>:=MOV|ADD|CMP

注意

上面的指令和语法格式中,3_bit_immed、7_bit_immed、8_bit_immed分别表示3位、7位、8位立即数。

下面详细介绍各指令的语法和使用。

11.4.1ADC指令

(1)编码格式

带进位的加法指令ADC的编码格式如图11.7所示。

图11.7ADC指令的编码格式

带进位的ADC指令和加法指令ADD配合使用可以实现多字相加(multi-word),详见ARM指令集介绍。

(2)指令的语法格式

ADCRd>,Rm>

①Rd>

第一个操作数寄存器,并且是操作结果的目的寄存器。

②Rm>

第二操作数寄存器。

(3)指令操作的伪代码

Rd=Rd+Rm+CFlag

NFlag=Rd[31]

ZFlag=ifRd==0then1else0

CFlag=CarryFrom{Rd+Rm+CFlag}

VFlag=OverflowFrom{Rd+Rm+CFlag}

(4)对应的ARM指令

ADCSRd>,Rd>,Rm>

11.4.2小立即数加法指令ADD(1)

(1)编码格式

立即数加法指令ADD(1)的编码格式如图11.8所示。

图11.8ADD(1)指令的编码格式

ADD加法指令实现“小常数”的加法运算,并将相加的结果保存到指定的寄存器中。

(2)指令的语法格式

ADDRd>,Rn>,#immed_3>

①Rd>

加法操作的目标寄存器。

②Rn>

操作数寄存器。

③#immed_3>

3位的立即数。该立即数将和寄存器Rn>的值相加,并将结果保存到Rd>中。

(3)指令操作的伪代码

Rd=Rn+immed_3

NFlag=Rd[31]

ZFlag=ifRd==0then1else0

CFlag=CarryFrom{Rn+immed_3}

VFlag=OverflowFrom{Rn+immed_3}

(4)对应的ARM指令

ADDSRd>,Rn>,#immed_3>

11.4.3大立即数加法指令ADD(2)

(1)编码格式

立即数加法指令ADD(2)的编码格式如图11.9所示。

图11.9ADD(2)指令的编码格式

此中形式的ADD(2)指令将一个大的立即数(8bit)与指定寄存器的值相加,并将运算结果保存到此寄存器中。

(2)指令的语法格式

ADDRd>,#immed_8>

①Rd>

加法操作的

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

网站地图

Top