您的位置 首页 汽车

ARM一切常用指令的实例与阐明

ARM所有常用指令的实例与说明:程序跳转类指令:====================BX,语法:bxRn此指令执行程序跳转,执行后,cpu从Rn这个寄存器里…

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, msr , Rm
msr , Rm
msr , #expression

psr能够是cpsr, spsr, mrs用于读取psr寄存器里边的值然后赋值给Rd.
msr用于存储Rm寄存器里边的值进入psr里边。
msr , 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指令:
语法:{b} Rd,

ldr用于从内存中加载数据到寄存器。
str用于存储寄存器中的数据到内存中。

比方:

.LC:
ldr r0, .LC:表明把.LC所在内存地址里边的4个字节值赋给r0(这种状况需求此指令与标签在同一段内)
ldr r0, =.LC:表明直接把.LC所在的地址赋给r0
ldr r0, [r1] : 表明把把r1所代表的内存地址里边的值赋给r0
ldr r0, [r1, #8] : 表明r1加上8个字节代表的内存地址里边的值赋给r0
ldr r0, [r1, #8]!: 表明r1加上8个字节代表的内存地址里边的值赋给r0, 然后把r1 = r1 + 8
ldr r0, [r1], #4: 表明把r1所代表的内存地址里边的值赋给r0, 之后, r1 += 4
ldr r0, [r1, r2, LSL #2] :表明把r1+r2 * 4所代表的内存地址里边的值赋给r0

str r0, [r1, r2]: 把r1 + r2所代表的内存地址里边的值赋入r0
str r0, [r1, r2]!: 把r1 + r2所代表的内存地址里边的值赋入r0, r1 = r1 + r2

ldm, stm指令:
语法: Rn{!}, {^}

Rlist, 表明寄存器列表。比方{r0, r2, r5-r7,r9 }
{!}, 表明履行完ldm或stm之后是否对Rn进行回写。
{^}, 表明康复spsr中的值到cpsr。(一般用于回来曾经形式)

寄存器列表中的数据在内存中将被寄存的次序为低寄存器对应低内存地址的次序寄存。
stm操作一直与所指定的栈的方向坚持相同,ldm相反。stm就相当于压栈,ldm就相当于退栈。

stm表明把寄存器的数据存入内存
ldm表明把内存中的数据加载到寄存器上。

例如:
ldmfdsp, {r0,r1,r2} 表明把sp所指的内存地址开端的12个字节别离赋值给r0,r1,r2。
ldmfdsp!, {r0,r1,r2} 表明把sp所指的内存地址开端的12个字节别离赋值给r0,r1,r2,之后sp = sp + 12
ldmfd sp!, {r15}^表明把sp棧所指的4个字节里边的值赋给r15, 一起把spsr赋值给cpsr,而且sp += 4

stmfd sp, {r0, r1, r2} 表明把r2,r1,r0依照sp所指地址递减存储。也就相当于下面3条指令:
str r2, [sp, #-4]
str r1, [sp, #-8]
str r0, [sp, #-12]

stmfd sp!, {r0, r1, r2} 表明把r2,r1,r0依照sp所指地址递减存储。而且把sp = sp – 12,也就相当于下面4条指令:
str r2, [sp, #-4]
str r1, [sp, #-8]
str r0, [sp, #-12]
sub sp, sp, #12

特别用法:

stmfd sp!, {r0-r15}^ : 表明把用户形式下面的r0-r15寄存器存在当时形式下面的sp所指向的栈中。
stmfd sp!, {r0-r14}^ : 表明把用户形式下面的r0-r14寄存器存在当时形式下面的sp所指向的栈中。用于进程切换的时分保存用户形式下面的寄存器。
ldmfd sp!, {r0-r14}^ : 寄存器列表这里边不带有r15(pc), 表明把当时形式下面sp所指的栈中的15个int复制用户形式下面的r0-r14。这个用于康复进程状况。

swp指令:
语法: Rd, Rm, [rn]

swp指令履行单字节或单字的内存于寄存器的数据交换原子操作。把rn所指内存里边的值赋值给Rd, 然后把R1存入R2所指的内存。常常用于内核中完成操控互斥与信号等功能。

例如:

swp r0, r1,[r2]:表明把r2所指的内存地址里边的值赋值给r0, 然后把r1存入r2所指内存地址。相当于下面2条指令的原子操作。
ldr r0, [r2]
str r1, [r2]

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/276418.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们