ARM所有常用指令的实例与说明:
程序跳转类指令:
====================
BX,
语法: bx Rn
此指令执行程序跳转,执行后,cpu从Rn这个寄存器里面所存的内存地址处开始继续执行。由于是跳转,因此也会同时刷新管道线。另外,如果此Rn的最低位为1的话,随后的指令将被译作thumb指令,如果最低位为0的话,随后的指令将被译作arm32位指令。因此,此指令可以用于在32位arm指令与16位thumb指令之间进行跳转。
32位代码转入16位代码执行:
16位代码转入32位代码执行:
B, BL 指令,
语法: 指令 表达式/label
B指令就直接跳转指定的地方,bl跳转到指定的地方之前还要把当前pc保存在lr寄存器里面。
die_loop:
b die_loop 这样就构成了死循环
bl add 保存当前pc到lr,然后调用add函数,
数据处理类指令:
====================
mov, mvn指令:
语法: 指令 目标寄存器, 操作数
mov指令把操作数拷贝到目标寄存器里面。操作数可以是:寄存器,或者立即数表达式,
例如:
mov r0, r1 # 把r1赋给r0
mov r2, #7
mov r0, r1, LSL r2 把r1左移r2位后赋给r0
mov r2, #100 # 把立即数100赋给r2
mvn指令把操作数按位取反之后把值赋给目标寄存器。
例如:
mov r0, r1 # 表示把r1里面的值按位取反后赋给r0
cmp, cmn, teq, tst, 指令:
语法: 指令 寄存器, 操作数
操作数可以是:寄存器,或者立即数表达式
这四条指令都是让后面的寄存器于操作数执行相应的操作后根据结果设定cpsr寄存器里面的相应位的值。
cmp指令把寄存器和操作数相减,根据结果设定cpsr。用于比较大小。
例如:循环100次
mov r0, #0
loop100:
add r0, r0, #1
cmp r0, #100
ble loop100
cmn指令把寄存器和操作数想加,根据结果设定cpsr。用于看两个数只和会不会有进位。
teq指令把寄存器和操作数进行按位异或,根据结果设定cpsr。用于测试两个数是否相等。
tst指令把寄存器和操作数进行按位相与,根据结果设定cpsr。用于测试某位是否为1。
这四条指令在执行期间都只是对寄存器和操作数进行操作,并不回写。
and, eor, sub, rsb, add, adc, sbc, rsc, orr, bic指令:
语法:指令 Rd, Rn, Op2
操作数可以是:寄存器,立即数
and 指令对Rn和Op2按位与操作之后把结果赋值给Rd.
eor 指令对Rn和Op2按位异或操作之后把结果赋值给Rd.
sub 指令对Rn和Op2进行减操作之后把结果赋值给Rd.
rsb 指令对Op2和Rn进行减操作之后把结果赋值给Rd.
add 指令对Rn和Op2进行加操作之后把结果赋值给Rd.
adc 指令对Rn和Op2加操作并且加上cpsr寄存器中的C位的值之后把结果赋值给Rd.
sbc 指令执行Rn-op2-1+进位位之后把结果赋值给Rd。
rsc 指令执行Op2-Rn-1+近位位之后把结果赋值给Rd.
orr 指令对Rn和Op2按位或操作之后把结果赋值给Rd.
bic 指令执行对Op2先按位取反之后再与Rn进行按位与操作,之后把结果赋值给Rd,用于对Rd中的某位置0.
mrs, msr指令:
语法: mrs Rd, <psr>
msr <psr>, Rm
msr <psrf>, Rm
msr <psrf>, #expression
psr可以是cpsr, spsr, mrs用于读取psr寄存器里面的值然后赋值给Rd.
msr用于存储Rm寄存器里面的值进入psr里面。
msr <psrf>, Rm只修改psr里面的标志位。
mul, mla指令:
语法: mul Rd, Rm, Rs
mla Rd, Rm, Rs, Rn
mul指令对Rm和Rs执行乘操作之后把值赋给Rd。 Rd = Rm * Rs.
mla指令对Rd和Rs执行乘操作之后并加上Rn后赋值给Rd. Rd = Rm * Rs + Rn。
mull, mlal指令:
语法: umull RdLo, RdHi, Rm, Rs :把Rm和Rs当作32位无符号数执行乘法操作,然后把结果的低32位赋给RdLo, 高32位赋给RdHi
umlal RdLo, RdHi, Rm, Rs :把Rm和Rs当作32位无符号数执行乘法操作,再加上由RdHi和RdLo组成的64位数,然后把结果的低32位赋给RdLo, 高32位赋给RdHi
smull RdLo, RdHi, Rm, Rs :把Rm和Rs当作32位有符号数执行乘法操作,然后把结果的低32位赋给RdLo, 高32位赋给RdHi
smlal RdLo, RdHi, Rm, Rs :把Rm和Rs当作32位有符号数执行乘法操作,再加上由RdHi和RdLo组成的64位数,然后把结果的低32位赋给RdLo, 高32位赋给RdHi
ldr, str指令:
语法:<ldr/str>{b} Rd, <Address>
ldr用于从内存中加载数据到寄存器。
str用于存储寄存器中的数据到内存中。
例子: