ZHCU820Y September 2004 – June 2021
C/C++ 编译器使用函数帧堆栈来:
运行时堆栈从高地址增长到低地址。编译器使用 R1 寄存器来管理此堆栈。R1 是堆栈指针 (SP),指向堆栈上的下一个未使用位置。
链接器设置堆栈大小,创建全局符号 __TI_STACK_SIZE,并为其分配一个等于堆栈大小的值(以字节为单位)。默认的堆栈大小为 80 字节。可以在链接时使用链接器命令中的 --stack_size 选项来更改堆栈大小。更多有关 --stack_size 选项的信息,请参阅《MSP430 汇编语言工具用户指南》中的链接器说明一章。
由于 MSP430X 器件的寄存器大小增加(用 --silicon_version=mspx 指定),因此保存和恢复 save-on-entry 寄存器需要为堆栈上保存的每个寄存器提供 32 位栈空间。在移植最初为16 位 MSP430 器件编写的代码时,可能需要在以前的值的基础上增加 C 栈大小。
在系统初始化时,SP 被设置为堆栈顶部的指定地址。此地址是 .stack 段末尾之后的第一个位置。由于堆栈的位置取决于 .stack 段的分配位置,因此堆栈的实际地址是在链接时确定的。
C/C++ 环境在函数入口处自动递减 SP,以保留执行该函数所需的所有空间。堆栈指针在函数出口处递增,以将堆栈恢复到函数输入之前的状态。如果将汇编语言例程连接到 C/C++ 程序,请确保将堆栈指针恢复到函数输入之前的相同状态。
更多有关使用堆栈指针的信息,请参阅Topic Link Label7.3;更多有关堆栈的信息,请参阅Topic Link Label7.4。
编译器不提供编译期间或运行时检查栈溢出的方法。栈溢出会破坏运行时环境,导致程序失败。确保留出足够的空间让栈增长。可以使用 --entry_hook 选项在每个函数的开头添加代码以检查是否发生栈溢出;请参阅Topic Link Label3.14。