PowerPC 在处理器级别上是没有实现堆栈操作的,也就是说,在 PowerPC 架构中,没有专门的堆栈操作汇编命令。但事实上 PowerPC 又使用到了堆栈,比如在函数调用、传参、返回错误码等操作。
在讲 PowerPC 堆栈处理之前,先提一下要用到的某些寄存器。首先是32个通用寄存器 GPR0 ~ GPR31。据说这32个寄存器是64位的,但是高32位的访问方式不同,通常只用低32位,所以我们暂且把他们当作32位的寄存器来用好了。
按照 PowerPC EABI (Embedded Application Binary Interface) 的说法:GPR0 由于语言的不同而用处不同,gcc 使用 GPR0 来保存 LR 寄存器的值;GPR1 用于存放堆栈指针,通常是栈顶指针;GPR3 ~ GPR4 用于传参和保存返回值;GPR5 ~ GPR10 也用于传参;GPR13 保存 sdata 段的段基址;GPR14 ~ GPR31 是可供用户自由使用的。LR 寄存器保存返回地址。
操作堆栈,通常使用到两个类型的指令:{stw, stwu} 和 lwz。
stw
stw rA, off(rB)
stw 相当于 push,表示32位的 rA 寄