转至:http://kinglaw05.blog.163.com/blog/static/5968331420101160158144/
在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时的初始化,进出中断时的环境保存、恢复,对性能要求非常苛刻的函数等。
1、相对跳转指令: b 、 bl
不同之处在于: bl 指令除了跳转之外,还将返回地址( bl 的下一条指令的地址)保存在 lr 寄存器中。
跳转范围:当前指令的前后32M。
它们是与位置无关的指令。
示例:
b fun1
......
fun1:
bl fun2
......
fun2:
......
2、数据传送指令: mov ,地址读取伪指令: ldr
mov 指令可以把一个寄存器的值赋给另一个寄存器,或者把一个常数赋给寄存器。
例:
mov r1, r2
mov r1, #4096
mov 指令传送的常数必须能用立即数来表示。
当不知道一个数能否用立即数来表示时,可以使用 ldr 命令来赋值。 ldr 是伪指令,它不是真实存在的指令,编译器会把它扩展成真正的指令:如果该常数能用立即数来表示,则使用 mov 指令;否则编译时将该常数保存在某个位置,使用内存读取指令把它读出来。
例:
ldr r1, =4097
ldr 本意为“大范围的地址读取伪指令”,以下是获得代码的绝对地址:
例:
ldr r1, =label
label:
......
3、内存访问指令: ldr 、 str 、 ldm 、 stm
ldr 指令既可能是大范围的地址读取伪指令,也可能是内存访问指令。当它的第二个参数前面有 “ = ” 时,表示伪指令,否则表示内存访问指令。
ldr 指令是从内存中读取数据到寄存器,str 指令把寄存器的值存储到内存中,它们操作的数据都是32位的。
例:
ldr r1, [r2, #4] // 将地址为r2+4的内存单元数据读取到r1中
ldr r1, [r2] // 将地址为r2的内存单元数据读取到r1中
ldr r1, [r2], #4 // 将地址为r2的内存单元数据读取到r1中,然后r2=r2+4
str r1, [r2, #4] // 将r1的数据保存到地址为r2+4的内存单元中
str r1, [r2] // 将r1的数据保存到地址为r2的内存单元中
str r1, [r2], #4 // 将r1的数据保存到地址为r2的内存单元中,然后r2=r2+4
ldm 和 stm 属于批量内存访问指令,只用一条指令就可以读写多个数据。格式为:
ldm {cond}
stm {cond}
其中,{cond} 表示指令的执行条件有:
条件码(cond) |
助记符 |
含义 |
cpsr中条件标志位 |
0000 |
eq |
相等 |
Z = 1 |
0001 |
ne |
不相等 |
Z = 0 |
0010 |
cs/hs |
无符号数大于/等于 |
C = 1 |
0011 |
cc/lo |
无符号数小于 |
C = 0 |
0100 |
mi |
负数 |
N = 1 |
0101 |
pl |
非负数 |
N = 0 |
0110 |
vs |
上溢出 |
V = 1 |
0111 |
vc |
没有上溢出 |
V = 0 |
1000 |
hi |
无符号数大于 |
C = 1 或 Z = 0 |
1001 |
ls |
无符号数小于等于 |
C = 0 或 Z = 1 |
1010 |
ge |
带符号数大于等于 |
N = 1, V = 1 或 N = 0, V = 0 |
1011 |
lt |
带符号数小于 |
N = 1, V = 0 或 N = 0, V = 1 |
1100 |
gt |
带符号数大于 |
Z = 0 且 N = V |
1101 |
le |
带符号数小于/等于 |
Z = 1 或 N! = V |
1110 |
al |
无条件执行 |
- |
1111 |
nv |
从不执行 |
- |
寄存器 |
别名 |
使用规则 |
r15 |
pc |
程序计数器 |
r14 |
lr |
连接寄存器 |
r13 |
sp |
数据栈指针 |
r12 |
ip |
子 程序内部调用的scratch寄存器 |
r11 |
v8 |
ARM状态局部变量寄存器8 |
r10 |
v7、s1 |
ARM状态局部变量寄存器7、在支持数据栈检查的ATPCS中为数据栈限制指针 |
r9 |
v6、sb |
ARM状态局部变量寄存器6、在支持RWPI的ATPCS中为静态基址寄存器 |
r8 |
v5 |
ARM状态局部变量寄存器5 |
r7 |
v4、wr |
ARM状态局部变量寄存器4、THUMB状态工作寄存器 |
r6 |
v3 |
ARM状态局部变量寄存器3 |
r5 |
v2 |
ARM状态局部变量寄存器2 |
r4 |
v1 |
ARM状态局部变量寄存器1 |
r3 |
a4 |
参数/结果/scratch寄存器4 |
r2 |
a3 |
参数/结果/scratch寄存器3 |
r1 |
a2 |
参数/结果/scratch寄存器2 |
r0 |
a1 |
参数/结果/scratch寄存器1 |