原创 ARM处理器16种数据处理指令

2009-3-3 09:54 3355 7 7 分类: MCU/ 嵌入式

数据处理指令


数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令等。数据传送指令用于在寄存器和存储器之间进行数据的双向传输。算术逻辑运算指令完成常用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中,同时更新 CPSR 中的相应条件标志位。  比较指令不保存运算结果,只更新 CPSR 中相应的条件标志位。


数据处理指令包括:


  MOV 数据传送指令


  MVN 数据取反传送指令


  CMP 比较指令


  CMN 反值比较指令


  TST 位测试指令


  TEQ 相等测试指令


  ADD 加法指令


  ADC 带进位加法指令


  SUB 减法指令


  SBC 带借位减法指令


  RSB 逆向减法指令


  RSC 带借位的逆向减法指令


  AND 逻辑与指令


  ORR 逻辑或指令


  EOR 逻辑异或指令


  BIC 位清除指令


1 MOV 指令


MOV 指令的格式为:


MOV{条件}{S} 目的寄存器,源操作数


MOV 指令可完成从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器。其中 S选项决定指令的操作是否影响 CPSR中条件标志位的值,当没有 S 时指令不更新 CPSR 中条件标志位的值。


指令示例:


MOV R1R0    ;将寄存器R0的值传送到寄存器R1


MOV PCR14    ;将寄存器R14的值传送到PC,常用于子程序返回


MOV R1R0LSL3  ;将寄存器R0的值左移3位后传送到R1


2 MVN 指令


MVN 指令的格式为:


MVN{条件}{S} 目的寄存器,源操作数


MVN 指令可完成从另一个寄存器、被移位的寄存器、或将一个立即数加载到目的寄存器。与 MOV指令不同之处是在传送之前按位被取反了,即把一个被取反的值传送到目的寄存器中。其中S 决定指令的操作是否影响 CPSR 中条件标志位的值,当没有 S 时指令不更新 CPSR 中条件标志位的值。


指令示例:


MVN R0,#0    ;将立即数0取反传送到寄存器R0中,完成后R0=-1


3 CMP 指令


CMP 指令的格式为:


CMP{条件} 操作数 1,操作数 2


CMP 指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新 CPSR 中条件标志位的值。该指令进行一次减法运算,但不存储结果,只更改条件标志位。标志位表示的是操作数 1 与操作数 2 的关系(大、小、相等),例如,当操作数 1 大于操作操作数 2,则此后的有 GT后缀的指令将可以执行。


指令示例:


CMP R1R0    ;将寄存器R1的值与寄存器R0的值相减,并根据结果设置CPSR的标志位


CMP R1,#100   ;将寄存器R1的值与立即数100相减,并根据结果设置CPSR的标志位


4CMN 指令


CMN 指令的格式为:


CMN{条件} 操作数 1,操作数 2


CMN 指令用于把一个寄存器的内容和另一个寄存器的内容或立即数取反后进行比较,同时更新CPSR 中条件标志位的值。该指令实际完成操作数 1 和操作数 2 相加,并根据结果更改条件标志位。


指令示例:


CMN R1R0    ;将寄存器R1的值与寄存器R0的值相加,并根据结果设置CPSR的标志位


CMN R1,#100   ;将寄存器R1的值与立即数100相加,并根据结果设置CPSR的标志位


5 TST 指令


TST 指令的格式为:


TST{条件} 操作数 1,操作数 2


TST指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新 CPSR 中条件标志位的值。操作数 1 是要测试的数据,而操作数 2 是一个位掩码,该指令一般用来检测是否设置了特定的位。


指令示例:


TST R1,#%1   ;用于测试在寄存器R1中是否设置了最低位(%表示二进制数)


TST R1,#0xffe   ;将寄存器R1 的值与立即数0xffe按位与,并根据结果设置CPSR的标志位


6 TEQ 指令


TEQ 指令的格式为:


TEQ{条件} 操作数 1,操作数 2


TEQ指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的异或运算,并根据运算结果更新 CPSR 中条件标志位的值。该指令通常用于比较操作数 1 和操作数 2 是否相等。


指令示例:


TEQ R1R2   ;将寄存器R1的值与寄存器R2的值按位异或,并根据结果设置CPSR的标志位


7 ADD 指令


ADD 指令的格式为:


ADD{条件}{S} 目的寄存器,操作数 1,操作数 2


ADD指令用于把两个操作数相加,并将结果存放到目的寄存器中。操作数 1 应是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即数。


指令示例:


ADD  R0R1R2            R0 = R1 + R2


ADD  R0R1#256             R0 = R1 + 256


ADD  R0R2R3LSL#1       R0 = R2 + (R3 << 1)


8 ADC 指令


ADC 指令的格式为:


ADC{条件}{S} 目的寄存器,操作数 1,操作数 2


ADC 指令用于把两个操作数相加,再加上 CPSR 中的 C 条件标志位的值,并将结果存放到目的寄存器中。它使用一个进位标志位,这样就可以做比 32 位大的数的加法,注意不要忘记设置 S 后缀来更改进位标志。操作数 1 应是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即数。


以下指令序列完成两个 128 位数的加法,第一个数由高到低存放在寄存器 R7R4,第二个数由高到低存放在寄存器 R11R8,运算结果由高到低存放在寄存器 R3R0


ADDS  R0R4R8           加低端的字


ADCS  R1R5R9            加第二个字,带进位


ADCS  R2R6R10        加第三个字,带进位


ADC  R3R7R11        加第四个字,带进位


9 SUB 指令


SUB 指令的格式为:


SUB{条件}{S} 目的寄存器,操作数 1,操作数 2


SUB指令用于把操作数 1 减去操作数 2,并将结果存放到目的寄存器中。操作数 1 应是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即数。该指令可用于有符号数或无符号数的减法运算。


指令示例:


SUB  R0R1R2            R0 = R1 - R2


SUB  R0R1#256             R0 = R1 - 256


SUB  R0R2R3LSL#1       R0 = R2 - (R3 << 1)


10SBC 指令


SBC 指令的格式为:


SBC{条件}{S} 目的寄存器,操作数 1,操作数 2


SBC指令用于把操作数 1减去操作数 2,再减去 CPSR 中的C 条件标志位的反码,并将结果存放到目的寄存器中。操作数 1 应是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即数。该指令使用进位标志来表示借位,这样就可以做大于 32 位的减法,注意不要忘记设置 S后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。


指令示例:


SUBS  R0R1R2            R0 = R1 - R2 - C,并根据结果设置CPSR的进位标志位


11RSB 指令


RSB 指令的格式为:


RSB{条件}{S} 目的寄存器,操作数 1,操作数 2


RSB 指令称为逆向减法指令,用于把操作数 2 减去操作数 1,并将结果存放到目的寄存器中。操作数 1 应是一个寄存器,操作数 2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令可用于有符号数或无符号数的减法运算。


指令示例:


RSB  R0R1R2            R0 = R2 R1


RSB  R0R1#256             R0 = 256 R1


RSB  R0R2R3LSL#1       R0 = (R3 << 1) - R2


12RSC 指令


RSC 指令的格式为:


RSC{条件}{S} 目的寄存器,操作数 1,操作数 2


RSC指令用于把操作数 2减去操作数 1,再减去 CPSR 中的C 条件标志位的反码,并将结果存放到目的寄存器中。操作数 1 应是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即数。该指令使用进位标志来表示借位,这样就可以做大于 32 位的减法,注意不要忘记设置 S后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。


指令示例:


RSC  R0R1R2            R0 = R2 R1 - C


13AND 指令


AND 指令的格式为:


AND{条件}{S} 目的寄存器,操作数 1,操作数 2


AND指令用于在两个操作数上进行逻辑与运算,并把结果放置到目的寄存器中。操作数 1 应是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于屏蔽操作数 1 的某些位。


指令示例:


AND  R0R0,#3            该指令保持R001位,其余位清零。


14ORR 指令


ORR 指令的格式为:


ORR{条件}{S} 目的寄存器,操作数 1,操作数 2


ORR 指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。操作数 1


应是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于设置操作数 1 的某些位。


指令示例:


ORR  R0R0,#3            该指令设置R001位,其余位保持不变。


15EOR 指令


EOR 指令的格式为:


EOR{条件}{S} 目的寄存器,操作数 1,操作数 2 EOR指令用于在两个操作数上进行逻辑异或运算,并把结果放置到目的寄存器中。操作数 1 应是一个寄存器,操作数 2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于反转操作数 1 的某些位。


指令示例:


EOR  R0R0,#3            该指令反转R001位,其余位保持不变。


16BIC 指令


BIC 指令的格式为:


BIC{条件}{S} 目的寄存器,操作数 1,操作数 2


BIC指令用于清除操作数1 的某些位,并把结果放置到目的寄存器中。操作数 1 应是一个寄存器操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即数。操作数 2 32 位的掩码,如果在掩码中设置了某一位,则清除这一位。未设置的掩码位保持不变。


指令示例:


BIC  R0R0,#%1011          该指令清除 R0 中的位 01、和 3,其余的位保持不变。


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条