首页 理论教育ARM嵌入式系统应用的数据处理指令

ARM嵌入式系统应用的数据处理指令

【摘要】:数据处理指令的使用原则:●所有操作数都是32位,可以是寄存器或立即数。后缀S表示指令的操作是否影响标志位。例如:3.ADD指令ADD{cond}{S},,ADD指令将Rn中的数值加上Shift_operand表示的数值,结果放入目的寄存器Rd中,同时根据操作的结果影响标志位。例如:13.CMP指令CMP{cond},CMP指令将寄存器Rn中的数值减去shifter_operand表示的数值,但不存储结果,仅仅根据结果设置CPSR中的标志位。该指令常用于检测特定位的值。例如:16.TEQ指令TEQ{cond},TEQ指令用于把一

数据处理指令主要完成寄存器中数据的各种运算操作。数据处理指令的使用原则:

●所有操作数都是32位,可以是寄存器或立即数。

●如果数据操作有结果,结果也为32位,放在目的寄存器中。

●指令使用“两操作数”或“三操作数”方式,即每一个操作数寄存器和目的寄存器分别指定。

●数据处理指令只能对寄存器的内容进行操作。指令后都可以选择S后缀来影响标志位。比较类指令不需要后缀S,这些指令执行后都会影响标志位。

1.MOV指令

MOV{cond}{S}<Rd>,<Shift_operand>

MOV(MOVe)指令将一个立即数、一个寄存器的值或被移位的寄存器的值传送到目的寄存器中。后缀S表示指令的操作是否影响标志位。如果目的寄存器是寄存器PC可以实现程序流程的跳转,寄存器PC作为目的寄存器且后缀S被设置,则在跳转的同时,将当前处理器工作模式下的SPSR值复制到CPSR中。例如:

2.MVN指令

MVN{cond}{S}<Rd>,<Shift_operand>

MVN(MoVe Negative)指令将一个立即数、一个寄存器或被移位的寄存器的值先按位(bitwise)求反,再传送到目的寄存器中。后缀S表示是否影响标志位。例如:

3.ADD指令

ADD{cond}{S}<Rd>,<Rn>,<Shift_operand>

ADD指令将Rn中的数值加上Shift_operand表示的数值,结果放入目的寄存器Rd中,同时根据操作的结果影响标志位。例如:

4.SUB指令

SUB{cond}{S}<Rd>,<Rn>,<Shift_operand>

SUB(SUBtract)指令用于把Rn的数值减去Shift_operand表示的数值,结果放入目的寄存器Rd中,同时根据操作的结果影响标志位。例如:

5.RSB指令

RSB{cond}{S}<Rd>,<Rn>,<Shift_operand>

RSB(Reverse SuBtract)指令称为反向减法指令,用于把Shift_operand表示的数值减去Rn中的数值,结果放人目的寄存器Rd中,同时根据操作的结果影响标志位。例如:

6.ADC指令

ADC{cond}{S}<Rd>,<Rn>,<Shift_operand>

ADC(ADd with Carry)指令将Rn中的数值加上Shift_operand表示的数值后,再加上CPSR中的C标志位的值,结果放入目的寄存器Rd中,同时根据操作的结果影响标志位。例如:

结果(R1,R0)=(R1,R0)+(R3,R2),这样就完成了64位的加法。使用上例的方法,可以做比32位大的加法运算。

7.SBC指令

SBC{cond}{S}<Rd>,<Rn>,<Shift_operand>

SBC(SuBtractwith Carry)指令将Rn中的数值减去shift_operand表示的数值后,再减去CPSR中的C标志位值的反码,结果放入目的寄存器Rd中,同时根据操作的结果影响标志位。例如:

结果(R1,R0)=(R1,R0)-(R3,R2),这样就完成了64位的减法。使用上例的方法,可以做比32位大的减法运算。(www.chuimin.cn)

8.RSC指令

RSC{cond}{S}<Rd>,<Rn>,<Shift_operand>

RSC(Reverse Subtractwith Carry)指令将shift_operand表示的数值减去Rn中的数值后,再减去CPSR中的C标志位值的反码,结果放入目的寄存器Rd中,同时根据操作的结果影响标志位。例如:

9.AND指令

AND{cond}{S}<Rd>,<Rn>,<Shift_operand>

AND指令将寄存器Rn中的数值与shifter_operand表示的数值按位做“逻辑与”操作结果放入目的寄存器Rd中,同时根据操作的结果影响标志位。常用于将操作数某些位清零。例如:

10.ORR指令

ORR{cond}{S}<Rd>,<Rn>,<Shift_operand>

ORR指令将寄存器Rn中的数值与shifter_operand表示的数值按位做“逻辑或”操作,结果放入目的寄存器Rd中,同时根据操作的结果影响标志位。常用于将操作数某些位置1。例如:

11.EOR指令

EOR{cond}{S}<Rd>,<Rn>,<Shift_operand>

EOR(Exclusive OR)指令将寄存器Rn中的数值和shifter_operand表示的数值按位做“异或”操作,结果放入目的寄存器Rd中,同时根据操作的结果影响标志位。常用于将操作数某些位取反。例如:

12.BIC指令

BIC{cond}{S}<Rd>,<Rn>,<Shift_operand>

BIC(BIt Clear)指令是位清零指令,将寄存器Rn中的数值与shifter_operand表示的数值按位取反后的值做按位“逻辑与”操作,结果放入目的寄存器Rd中,同时根据操作的结果影响标志位。Shift_operand为32位掩码,掩码中设置了哪些位则清除Rn中的哪些位。例如:

13.CMP指令

CMP{cond}<Rn>,<Shift_operand>

CMP(CoMPare)指令将寄存器Rn中的数值减去shifter_operand表示的数值,但不存储结果,仅仅根据结果设置CPSR中的标志位。例如:

14.CMN指令

CMN{cond}<Rn>,<Shift_operand>

CMN(CoMpare Negative)指令将寄存器Rn的值减去shifter_operand表示的数值的负数值(或者说加上shifter_operand表示的数值),仅仅根据结果设置CPSR中的标志位,不保存结果。例如:

15.TST指令

TST{cond}<Rn>,<Shift_operand>

TST(TeST)指令用于把一个寄存器Rn中的数值和shifter_operand表示的数值进行按位做“逻辑与”运算,仅仅根据结果设置CPSR中的标志位,不保存结果。该指令常用于检测特定位的值。例如:

16.TEQ指令

TEQ{cond}<Rn>,<Shift_operand>

TEQ(Test EQuivalence)指令用于把一个寄存器Rn的值和shifter_operand表示的数值进行按位做“逻辑异或”运算,仅仅根据结果设置CPSR中的标志位,不保存结果。该指令常用于检测两个操作数是否相等。例如: