Thumb指令集之:Thumb数据处理指令
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>
加法操作的
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)