为什么在调用C程序时,要在汇编(.S)文件中设置栈指针sp(Stack Pointer) r13?还有设置栈指针的时候赋的值是多少时如何确定的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.text
.global _start

_start:

/* 设置内存: sp 栈 */
ldr sp, =4096 /* nand启动 */
// ldr sp, =0x40000000+4096 /* nor启动 */

/* 调用main */
bl main

halt:
b halt

为什么要nand启动设置成4096,nor启动设置为0x40000000+4096?

1.SDRAM的地址是 0x30000000 - 0x40000000。

2.Nand启动时,片内4K RAM基地址为0(在0地址处),Nor Flash不可访问。

3.Nor启动时,片内RAM地址为0x4000 0000,片内RAM在0x4000 0000往后的4k 此时的栈顶可以设置到内存的上限 0x40000000 + 4k(4096)。

4.调用C函数时,返回地址、局部变量一般都保存在栈里,所以调用C程序时要设置栈指针

5.之所以设成4096,是由于S4C2410、S3C2440从NAND Flash启动时,它的内部4K RAM的地址为0~4095,可以把栈
指针指向最后──其实你也可以指向0~4095中间某个位置,只要不破坏要运行的代码就可以