微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM所有常用指令的实例与说明

ARM所有常用指令的实例与说明

时间:11-10 来源:互联网 点击:

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]

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top