一.汇编数据处理指令
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(即乘8)
MOVS PC, R14 ;将寄存器R14的值传送到PC中,返回到调用代码并恢复标志位
除了MOV指令外,还有数据取反传送指令MVN。 【MVN指令】
MVN指令的格式为:
MVN{条件}{S} 目的寄存器,源操作数
复制代码
MVN指令可完成从另一个寄存器、被移位的寄存器、或将一个立即数加载到目的寄存器。与MOV指令不同之处是在传送之前按位被取反了,即把一个被取反的值传送到目的寄存器中。其中S决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。
指令示例:
MVN R0,#0 ;将立即数0取反传送到寄存器R0中,完成后R0=-1(有符号位取反)
2.算术运算指令
(1)【加法指令】: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)
(2)【带进位的加法指令】:ADC
ADC指令的格式为:
ADC{条件}{S} 目的寄存器,操作数1,操作数2
ADC指令用于把两个操作数相加,再加上CPSR中的C条件标志位的值,并将结果存放到目的寄存器中。
它使用一个进位标志位,这样就可以做比32位大的数的加法,注意不要忘记设置S后缀来更改进位标志。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。
以下指令序列完成两个128位数(此处应为两个四字数相加)的加法,第一个数由高到低存放在寄存器R7~R4,第二个数由高到低存放在寄存器R11~R8,运算结果由高到低存放在寄存器R3~R0:
ADDS R0,R4,R8 ; 加低端的字,R0=R4+R8
ADCS R1,R5,R9 ; 加第二个字,带进位,R1=R5+R9
ADCS R2,R6,R10 ; 加第三个字,带进位,R2=R6+R10
ADC R3,R7,R11 ; 加第四个字,带进位,R3=R7+R11
(3)【减法指令】:SUB
SUB指令的格式为:
SUB{条件}{S} 目的寄存器,操作数1,操作数2
SUB指令用于把操作数1减去操作数2,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令可用于有符号数或无符号数的减法运算。
指令示例:
SUB R0,R1,R2 ; R0 = R1 - R2
SUB R0,R1,#256 ; R0 = R1 - 256
SUB R0,R2,R3,LSL#1 ; R0 = R2 - (R3 << 1)
(4)【带借位减法指令】:SBC
SBC指令的格式为:
SBC{条件}{S} 目的寄存器,操作数1,操作数2
BC指令用于把操作数1减去操作数2,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。
操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。
该指令使用进位标志来表示借位,这样就可以做大于32位的减法&