关于汇编跳转到C时,设置栈指针(SP)的疑问
汇编跳转到C时,都会为SP赋值
最近看书发现些疑问
(我用的开发板是mini2440,片内4K的SRAM,SDRAM大小64M,从0x30000000到0x33FFFFFF)
我看书上的代码,当程序在片内SRAM运行的时候,sp的值设置为4096,当程序在SDRAM内运行的时候sp设置为0x34000000
程序在哪个地方运行,sp就必须在那儿吗?程序在SDRAM运行,但依旧把sp设置为4096行吗?
还有,比如在片内运行的情况,如果程序大小2K,栈使用了2K,那不会有什么问题,但是如果栈使用了3K,那岂不是程序数据会被修改?
[解决办法]
程序中栈主要是用来存储函数中的局部变量以及保存寄存器参数的,如果你用了操作系统,栈中还可能存储当前进线程的上下文。设置栈大小的一个原则是,保证栈不会下溢出到数据空间或程序空间。
一般在RAM中运行的程序时这样分段的(从低地址向高地址): 程序段(默认名称一般为.text段),恒常量段(.RO段),带初始化值的全局变量段(一般名称为.RW段),不带初始化值的全局变量段(一般名称为.ZI段),然后上面还可能有堆空间,然后在上面是堆栈段(堆栈段的指针初始化在堆栈段的高地址,堆栈指针向下增长)。(当然这只是默认的情况,如果人为指定了链接规则,分布结果就可能不是上面这样了)
如果栈指针向下增长到其他段空间,称为堆栈溢出。堆栈溢出会修改其他空间的值,严重情况下可造成死机。
开始将堆栈指针设置在内部RAM,是因为不是每个板上都有外部RAM,而且外部RAM的大小也不相同,而且如果是SDRAM,还需要初始化,在内部RAM开始运行的一般是一个小的引导程序,基本上不怎么使用堆栈,因此将堆栈设置在内部RAM,但这也就要去改引导程序不能随意使用大量局部变量。
而应用程序往往是一层层的函数嵌套,使用的局部变量也较多,因此运行应用程序前将堆栈指针指到外部RAM空间。