- 89 -
栈的示例(如图 3-2-1 所示)及其相关的名词。
1) 数据栈指针(stack pointer) 是指最后一个写入栈的数据的内存地址。
2) 数据栈的基地址(stack base)是指数据栈的最高地址。由于 ATP CS 中数据栈是 FD
类型的,实际上数据栈中最早入栈的数据占据的内存单元是基地址的下一个内存单元。
3) 数据栈界限(stack limit)是指数据栈中可以使用的最低的内存单元的地址。
4) 已占用的数据栈(used stack)是指数据栈的基地址和数据栈栈指针之间的区域。其
中包括数据栈栈指针对应的内存单元,但不包括数据栈的基地址对应的内存单元。
5) 未占用的数据栈(unused stack)是指数据栈栈指针和数据界限之间的区域。其中包
括数据栈界限对应的内存单元,但不包括数据栈栈指针对应的内存单元。
6) 数据栈中的数据帧(stack frames)是指在数据栈中,为子程序分配的用来保存寄存
器和局部变量的区域。
异常的处理程序可以使用被中断程序的数据栈,这时用户要保证中断的程序的数据栈足
够大。
使用 ADS 中的编译器产生的目标代码中包含了 DRFT2 格式的数据帧。在调试过程中,
调试器可以使用这些数据帧来查看数据栈中的相关信息。而对于汇编语言来说,用户必须使
用 FRAME 为操作来描述数据栈中的数据帧。ARM 汇编器根据伪操作在目标文件中产生相
应的 DRAFT2 格式的数据帧。
图 3-2-1 一个数据栈的示意图
在 ARMv5TE 中,批量传送指令 LDRD/STRD 要求数据栈是 8 字节对齐的,以提高数
据传送的速度。用 ADS 编译器产生的目标文件中,外部接口的数据栈都是 8 字节对齐的,
并且编译器将告诉链接器:本目标文件中的数据栈是 8 字节对齐的。而对于汇编程序来说如
果目标文件中包含了外部调用,则必须满足下列条件:
外部接口的数据栈必须是 8 字节对齐的。也就是要保证在进入该汇编代码后,直到该汇
编代码调用外部程序之间,数据栈的栈指针变化偶数个数(如栈指针加 2 个字,而不能加 3
个字)。
在汇编程序中使用 PRESERVE8 伪操作告诉链接器,本汇编程序数据栈是 8 字节对齐的。