本博客是参考朱有鹏老师的linux课程总结, 在此声明感谢。
C语言运行时,需要栈。 因为C语言中的局部变量就是使用栈来实现的。
CPU 的每种模式中都有自己独立的栈, 也就是 SP寄存器(r13).
为什么需要模式中的栈独立呢, 因为如果共同使用栈,那么如果应用程序一旦出错,就会连累操作系统的栈损坏。
整个操作系统程序就会崩溃。
合理的解决方案就是使用独立的栈。这样自己的栈出现问题,不会连累到整个操作系统。
在系统复位之后, 默认是SVC模式(当复位和软中断指令执行时将会进入这种模式)。
所以要设置栈,只需要先SVC模式下的栈即可。
在ARM 中 ATPCS(ARM关于程序应该怎么实现的一个规范)中要求使用满减栈,所以不出意外都是使用满减栈。
栈有四种:满减栈 满增栈 空减栈 空增栈
满栈:进栈:先移动指针再存; 出栈:先出数据再移动指针
空栈:xxx
减栈:进栈:指针向下移动; 出栈:指针向上移动
增栈:xxx
查找有关手册找到SVC 模式下的栈内存地址。 譬如是0xd0037d80 ~ 0xd0037780.
因为是满减栈, 因此只需要设置栈地址为 0xd0037d80即可。
即在汇编代码中 只需要这一句
ldr sp, =0xd0037d80
即可