首页 理论教育 嵌入式系统原理与应用:Thumb数据处理指令解析

嵌入式系统原理与应用:Thumb数据处理指令解析

时间:2023-11-23 理论教育 版权反馈
【摘要】:Thumb 数据处理指令包括一组高度优化且相当复杂的指令,范围涵盖编译器,通常需要大多数操作。ARM 指令支持在单条指令中完成一个操作数的移位及一个ALU 操作,但Thumb 指令集将移位操作和ALU 操作分离为不同的指令。因此,Thumb 指令集中移位操作是作为操作符出现的,而不是作为操作数的修改量出现。数据处理指令的二进制编码如图4.2 所示。这条指令不影响条件码标志。d.对于立即数移位的指令,指令从Rm 取值,并

嵌入式系统原理与应用:Thumb数据处理指令解析

Thumb 数据处理指令包括一组高度优化且相当复杂的指令,范围涵盖编译器,通常需要大多数操作。 ARM 指令支持在单条指令中完成一个操作数的移位及一个ALU 操作,但Thumb 指令集将移位操作和ALU 操作分离为不同的指令。 因此,Thumb 指令集中移位操作是作为操作符出现的,而不是作为操作数的修改量出现。 数据处理指令的二进制编码如图4.2 所示。

图4.2 数据处理指令的二进制编码

(1)算术运算指令

1)ADD 与SUB——低寄存器加法和减法

对于低寄存器操作,这两条指令各有如下三种形式:①两个寄存器的内容相加或相减,结果放到第三个寄存器中;②寄存器中的值加上或减去一个小整数,结果放到另一个不同的寄存器中;③寄存器中的值加上或减去一个大整数,结果放回同一个寄存器中。

①指令格式

其中:

②用法

若expr3 或expr8 为负值,则ADD 指令汇编成相对应的带正数常量的SUB 指令,SUB 指令汇编成相对应的带正数常量的ADD 指令。 指令中的Rd、Rn 和Rm 必须是低寄存器(R0 ~R7)。 这些指令更新标志为N、Z、C 和V。

③举例

2)ADD——高或低寄存器

将寄存器中值相加,结果送回到第一操作数(也作为目的寄存器)寄存器。

①指令格式

ADD Rd,Rm

其中:

Rd  目的寄存器,也是第一操作数寄存器;

Rm  第二操作数寄存器。

②用法

这条指令将Rd 和Rm 中的值相加,结果放在Rd 中。 Rd 和Rm 可以是R0 ~R15 中的任何一个,而不只限于低寄存器。 若Rd 和Rm 是低寄存器,则更新条件码标志为N、Z、C 和V。其他情况下不更新条件码标志。

注意:若Rd 和Rm 都是低寄存器时,指令“ADD Rd,Rm”汇编成指令“ADD Rd,Rd,Rm”。

③举例

3)ADD 与SUB—SP

SP 加上或减去立即数常量。

①指令格式

ADD SP,#expr

SUB SP,#expr

其中:expr 为表达式,取值(在汇编时)为在-508 ~+508 范围内的4 的整倍数。

②用法

这条指令将expr 的值加到SP 的值上,结果放到SP 中。 这条指令不影响条件码标志。

注意:若expr 为负值,则ADD 指令汇编成相对应的带正数常量的SUB 指令;SUB 指令汇编成相对应的带正数常量的ADD 指令。

③举例

4)ADD——PC 或SP 相对偏移

SP 或PC 值加一个立即数常量,结果放入低寄存器。

①指令格式

ADD Rd,Rp,#expr

其中:

②用法

这条指令将expr 加到Rp 的值中,结果放入Rd。 这条指令不影响条件码标志。

注意:若Rp 是PC,则使用值为:(当前指令地址+4)AND 0xFFFFFFC,即忽略地址的低两位,这条指令不影响条件码标志。

③举例

5)ADC、SBC 和MUL

带进位标志的加法、带进位标志的减法和乘法。

①指令格式

其中:

Rd   目的寄存器,也是第一操作数寄存器;

Rm  第二操作数寄存器。

②用法

ADC 将带进位标志的Rd 和Rm 的值相加,结果放在Rd 中。 用这条指令可组合成多字加法。

SBC 考虑进位标志,从Rd 的值中减去Rm 的值,结果放入Rd 中。 用这条指令可组合成多字减法。

MUL 进行Rd 和Rm 的值的乘法,结果放入Rd 中。

注意:在此操作过程中,Rd 和Rm 必须是低寄存器(R0 ~R7)。

ADC 和SBC 更新标志N、Z、C 和V,MUL 更新标志N 和Z。 在ARMv4 及以前的结构中,MUL 会使标志C 和V 不正确。 在ARMv5 结构及以后的结构中,MUL 不影响标志C 和V。

③举例

(2)逻辑运算指令(AND、ORR、EOR 和BIC)

按位进行“与”“或”“异或”和“与反码相与”的逻辑操作。

①指令格式

op Rd,Rm

其中:

Rd   目的寄存器。 它也包含第一操作数。 Rd 必须在R0 ~R7 范围内。

Rm  第二操作数寄存器。 Rm 必须在R0 ~R7 范围内。

②用法

这些指令用于对Rd 和Rm 中的值进行按位逻辑操作,结果放在Rd 中。 其操作如下:

a.AND 指令进行逻辑“与”操作;

b.ORR 指令进行逻辑“或”操作;

c.EOR 指令进行逻辑“异或”操作;(www.xing528.com)

d.BIC 指令进行“Rd AND NOT Rm”操作。

注意:这些指令根据结果更新标志N 和Z。

③举例

(3)移位和循环移位操作(ASR、LSL、LSR 和ROR)

在Thumb 指令集中,移位和循环移位作为独立的指令,对寄存器的内容进行移位和循环移位操作。 这些指令可使用寄存器中的值或立即数来表示移位量。

①指令格式

其中:op 是下列其中之一:

a.ASR 算术右移,将寄存器中的内容看作补码形式的带符号整数,将符号位拷贝到空出的位。

b.LSL 逻辑左移,空出的位用“0”填充。

c.LSR 逻辑右移,空出的位用“0”填充。

d.ROR 循环右移,将寄存器右端移出的位循环移回到左端。 注意,ROR 仅能与寄存器控制的移位一起使用,也即是它只能用第一种指令格式。

Rd——目的寄存器,它也是第一操作数寄存器。 Rd 必须在R0 ~R7 范围内。

Rs——包含移位量的寄存器,Rs 必须在R0 ~R7 范围内。

Rm——存放源操作数的寄存器,Rm 必须在R0 ~R7 范围内。

expr——立即数移位量。 它是一个取值(在汇编时)为整数的表达式。 整数的范围如下,若op 是LSL,则为0 ~31,其他情况则为1 ~32。

②用法

a.对于寄存器控制移位的指令,也即是寄存器存放移位位数,这些指令从Rd 中取值,并对其进行移位,结果放回Rd。 只有Rs 的最低有效字节可用作移位量。

b.对于除ROR 以外的所有指令,若移位量为32,则Rd 清零,最后移出的位保留在标志C中,并根据结果影响N、Z 标志位。 若移位量大于32,则Rd 和标志C 均被清零,并根据结果影响N、Z 标志位。

c.对于ROR 指令,若移位量为32,则Rd 不变且不影响标志位;若移位量大于32 或小于32 时,则最后移出的位都将存入C 中,并根据结果影响N、Z 标志位。

d.对于立即数移位的指令,指令从Rm 取值,并对其进行移位,结果放到Rd 中。

注意:这些指令根据结果更新标志N 和Z,且不影响标志V。 对于标志C,若移位量是“0”,则不受影响;若移位量不是“0”且移位量在允许的范围中时,C 包含源寄存器的最后移出的位。

③举例

(4)比较指令(CMP 和CMN)

比较和比较负值。

①指令格式

其中:

Rn——第一操作数寄存器;

expr——表达式,其值(在汇编时)范围为在0 ~255 内的整数;

Rm——第二操作数寄存器。

②用法

这些指令更新条件码标志,但不往寄存器中存放结果。

a.CMP 指令从Rn 的值中减去expr 或Rm 的值,根据结果设置条件码标志位,而Rn 中的内容不变。

b.CMN 指令将Rm 和Rn 的值相加,根据结果设置条件码标志位,Rm 和Rn 的内容不变。

注意:对于“CMP Rn,#expr”和CMN 指令,Rn 和Rm 必须在R0 ~R7 范围内。 对于“CMP Rn,Rm”指令,Rn 和Rm 可以是R0 ~R15 中的任何寄存器。 这些指令根据结果更新标志N、Z、C 和V。

③举例

(5)传送和取负指令(MOV、MVN 和NEG)

传送、传送非和取负。

①指令格式

其中:

Rd——目的寄存器;

expr——表达式,其取值(在汇编时)为在0 ~255 范围内的整数;

Rm——源寄存器。

②用法

MOV 指令将#expr 或Rm 的值放入Rd。

MVN 指令从Rm 中取值,然后对该值进行按位逻辑“非”操作,结果放入Rd。

NEG(negate)指令从Rm 中取值,再乘以“ -1”,结果放入Rd。

注意:对于“MOV Rd,#expr”、MVN 和NEG 指令,Rd 和Rm 必须在R0 ~R7 范围内。 对于“MOV Rd,Rm”指令,Rd 和Rm 可以是寄存器R0 ~R15 中的任一个。 “MOV Rd,#expr”和MVN 指令更新标志N 和Z,对标志C 或V 无影响。 NEG 指令更新标志N、Z、C 和V,而“MOV Rd,Rm”指令表现如下:

a.若Rd 或Rm 是高寄存器(R8 ~R15),则标志不受影响;

b.若Rd 和Rm 都是低寄存器(R0 ~R7),则更新标志N 和Z,且清除标志C 和V。

③举例

(6)测试指令(TST)

①指令格式

其中:

Rn——第一操作数寄存器;

Rm——第二操作数寄存器。

②用法

TST 对Rm 和Rn 中的值进行按位“与”操作。 它更新条件码标志,但不将结果放入寄存器。 该指令根据结果更新标志N 和Z,标志C 和V 不受影响。 Rn 和Rm 必须在R0 ~R7范围内。

为了便于与ARM 指令进行对照理解,下面将Thumb 指令集中有等价指令的ARM 数据处理指令列于表4.1 和表4.2。

使用8 个通用低寄存器(r0 ~r7)的指令:

表4.1 ARM 与Thumb 指令低寄存器比较

续表

表4.2 ARM 与Thumb 指令高寄存器比较

所有对8 个低寄存器操作的数据处理指令都更新条件码位(等价于ARM 指令置S 位),对8 个高寄存器操作的指令不改变条件码位(CMP 指令除外,它只改变条件码)。 上面指令中“1/2 Hiregs”表示至少有一个寄存器操作数是高8 位寄存器。 #imm3、#imm7、#imm8 分别表示3 位、7 位和8 位立即数域。 #sh 表示5 位的移位数域。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈