常用的ARM指令:数据处理指令和算术指令
* 数据传输指令:mov & mvn
- mov
(片内RAM)传送指令mov(MOVE)把一个字节/字/双字的操作数从源位置传送到目的位置,源操作数的内容不变。
指令格式:
MOV{条件}{S} 目的寄存器,源操作数
S:即上节说的是否影响CPSR寄存器的标志位。
- mvn
用法与mov都类似,区别就是 mvn 是先把源操作数按位取反后再传送到目的寄存器。
* 算术指令:add & sub & rsb & adc & sbc & rsc
- add
加法运算指令。将操作数operand2数据与Rn的值相加,结果保存到Rd寄存器。
指令格式:
add {cond}{S} Rd,Rn,operand2
eg:
add r1,r1,#0x1 ; r1=r1+0x1
add r1,r1,r2 ; r1=r1+r2
adds r3,r1,r2,lsl #2 ; r3=r1+r2<<2
-sub
减法运算指令。将寄存器Rn的值减去operand2的值,结果保存到Rd寄存器中。
指令格式:
sub {cond}{S} Rd,Rn,operand2
eg:
subs r0,,r0,#1 ; r0=r0-1
sub r2,r1,r0 ; r2=r1-r0
subs r7,r6,#0xf0 ; r7=r6-0xf0
-rsb
逆向减法指令。用operand2减去Rn的值,结果放到Rd寄存器里。
指令格式:
rsb {cond}{S} Rd,Rn,operand2
eg:
rsb r3,r1,#0xff00 ; r3=0xff00-r1
rsbs r1,r2,r2,lsl #2 ; r1=r2<<2 - r2
rsb r0,r1,#0 ; r0=-r1
-adc
带进位加法指令。将operand2的值与Rn的值相加,再加上cpsr寄存器的c标志位,结果保存在Rd寄存器中。
指令格式:
adc {cond}{S} Rd,Rn,operand2
eg:
adds r0,r0,r2
adc r1,r1,r3 ; 使用adc实现64位加法:(r1,r0) = (r1,r0) +(r3,r2)
-sbc
带进位减法指令。用Rn寄存器的值减去operand2的值,再减去cpsr寄存器的c标志位的非,结果保存在Rd寄存器中。
指令格式:
sbc {cond}{S} Rd,Rn,operand2
eg:
subs r0,r0,r2
sbc r1,r1,r3 ; 使用sbc实现64位减法:(r1,r0)-(r3,r2)
-rsc
带进位逆向减法指令,将operand2的值减去Rn的值,再减去cpsr标志位c的值,结果存储在Rd寄存器中。
指令格式:
rsc{cond}{S} Rd,Rn,operand2
eg:
rsbs r2,r0,#0
rsc r3,r1,#0 ; 实现64位数值的负数