示例代码下载
1.start.S过程
- 设置栈
- 调用main函数,并把返回地址保存在LR(R14)中
.text
.global _start
_start:
/* 设置内存: sp栈 */
ldr sp, = 4096 /* nand 启动 */
/* 调用main函数 */
bl main
halt:
b halt
2.led.c过程
- 定义两个局部变量
- 设置变量
- return 0
int main(void)
{
volatile unsigned int *pGPFCON = (volatile unsigned int *)0x56000050;
volatile unsigned int *pGPFDAT = (volatile unsigned int *)0x56000054;
*pGPFCON = 0x100;
*pGPFDAT = 0;
return 0;
}
3.问题
- 函数的调用规则
ATPCS
:ARM-THUMB procedure call standard(ARM-Thumb过程调用标准) - 参考文章 Arm汇编学习笔记(六)——函数调用栈空间以及fp寄存器
3.1 为什么要设置栈?
- 因为C函数所需
- 保存局部变量
- 保存LR等寄存器(返回地址)
调用者如何传递参数给被调用者
被调用者如何传返回这给调用者
怎么从栈中恢复那些寄存器
- 调用者和被调用者通过r0-r3寄存器传递参数和返回值
- 在函数中,r4-r11可能被使用,所以:在入口保存他们,在出口恢复他们
- 高标号寄存器存放在高地址
3.2 反汇编程序分析
00000000 <_start>