ARMV7-M 的栈空间

照例先上两段原文:

711186f25d5e4d539a773711cb716663.png

 

6d803a681f2149e19d93e1e756a21724.png

以下为不是人话的翻译:

栈是一段内存的存储空间,用来存储局部变量,以及用来传递函数参数,当通用寄存器不够用时。

栈的实现方式为,向下生长,当前栈顶指针存放在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,只要在函数返回前,将已入栈的数据(参数和局部变量全部出栈),即可恢复原值。

 

 

 

 

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十三香炖猪肉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值