2016奚梦瑶维密翅膀:2.4.2 数据处理指令(1)
来源:百度文库 编辑:偶看新闻 时间:2024/04/29 12:39:31
2.4.2 数据处理指令(1)
数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令等。
数据传送指令用于在寄存器和存储器之间进行数据的双向传输。
算术逻辑运算指令完成常用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中,同时更新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 R1, R0 ;将寄存器R0 的值传送到寄存器R1
- MOV PC, R14 ;将寄存器R14 的值传送到PC, 常用于子程序返回
- MOV R1, R0, LSL#3 ;将寄存器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 R1, R0 ;将寄存器R1 的值与寄存器R0 的值相减,
并根据结果设置CPSR 的标志位- CMP R1, #100 ;将寄存器R1 的值与立即数100 相减,
并根据结果设置CPSR 的标志位
4. CMN指令
CMN指令的格式为:
- CMN{条件} 操作数1, 操作数2
CMN指令用于把一个寄存器的内容和另一个寄存器的内容或立即数取反后进行比较,同时更新CPSR中条件标志位的值。该指令实际完成操作数1和操作数2相加,并根据结果更改条件标志位。
指令示例:
- CMN R1, R0 ;将寄存器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 R1, R2 ;将寄存器R1 的值与寄存器R2
的值按位异或, 并根据结果设置CPSR 的标志位
7. ADD指令
ADD指令的格式为:
- ADD{条件}{S} 目的寄存器, 操作数1, 操作数2
ADD指令用于把两个操作数相加,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器或一个立即数。
指令示例:
- ADD R0, R1, R2 ;R0 = R1 + R2
- ADD R0, R1, #256 ;R0 = R1 + 256
- ADD R0, R2, R3, LSL#1 ;R0 = R2 + (R3 << 1)