关键寄存器介绍:
寄存器 | 含义 |
r0-r3 | 用作函数传参,例如函数A调用函数B,如果A需要向B传递参数,则将参数放到寄存器r0-r3中,如果参数个数大于4,则需要借用函数的栈空间。 |
r4-r11 | 变量寄存器,在函数中可以用来保存临时变量。 |
r9(SB) | 静态基址寄存器。 |
r10(SL) | 栈界限寄存器。 |
r11(FP) | 帧指针寄存器,通常用来访问函数栈,帧指针指向函数栈中的某个位置。 |
r12(IP) | 内部过程调用暂存寄存器。 |
r13(SP) | 栈指针寄存器,用来指向函数栈的栈顶。 |
r14(LR) | 链接寄存器,通常用来保存函数的返回地址。 |
r15(PC) | 程序计数器,指向代码段中下一条将要执行的指令,不过由于流水线的作用,PC会指向将要执行的指令的下一条指令。 |
内核中的函数栈
内核中,一个函数的代码最开始的指令都是如下形式:
mov ip, sp
stmfd sp!, {r0 - r3} (可选的)
stmfd sp!, {..., fp, ip, lr, pc}
……
从其中两条stmfd(压栈)指令可以看出,一个函数的函数栈的栈底(高地址)的结构基本是固定的,如下图: