照例先上两段原文:
以下为不是人话的翻译:
栈是一段内存的存储空间,用来存储局部变量,以及用来传递函数参数,当通用寄存器不够用时。
栈的实现方式为,向下生长,当前栈顶指针存放在SP(R13)寄存器中,通常栈空间由栈底和栈长度决定,但是应用程序不保证SP指针在它俩之间。
通常,寄存器R4~R8(V1~V5),R10(V7)和R11(V8)被用来保持常规的局部变量。只有V1~ V4可以被使用当Thumb 模式被设置,但是AAPCS 不需要Thumb代码仅只用那些寄存器。
子程序必须保持R4~R8,R10,R11和SP的值(并且R9在PCS变形中,被定义为V6)
以下为是人话的翻译:
栈是一段连续的存储空间,有两个用处:1. 存储局部变量;2. 参数太多(超过4个)时,用于传递参数(第5,6…… 个参数)。
栈的生长方式为:向下生长(即:栈底高地址,栈顶低地址),栈顶地址存放在SP(R13)寄存器中。实际的程序中,栈空间是有限的,但应用程序不会检查栈是否溢出。
通常,寄存器R4~R8(V1~V5),R10(V7)和R11(V8)被用来存储局部变量。Thumb指令只有操作其中的V1~ V4(即:R4~R7)时无限制,但本规定(即:AACPS)允许Thumb指令操作“受限寄存器”(即:R8、R10 、R11)。
如果子程序中改变了 R4~R8,R10,R11和SP的值,那么子程序返回后,必须恢复为原值。
R4~R8,R10,R11和SP,恢复原值的算法
如果是R4~R8,R10,R11,有两种算法:1. 不改变这些寄存器的值;2. 使用前先将寄存器的值入栈,返回前再将相应的值出栈。
如果是SP,只要在函数返回前,将已入栈的数据(参数和局部变量全部出栈),即可恢复原值。