arm cortex 堆栈操作

堆栈操作的进一步探讨
如果参与的寄存器比较多,这种 PUSH 和 POP 岂不是又臭又长?放心,PUSH/POP 指令
足够体贴,支持一次操作多个寄存器。像这样:
PUSH  {R0-R2}      ;压入R0-R2
PUSH  {R3-R5,R8, R12}  ;压入R3-R5,R8,以及R12
在POP时,可以如下操作:
POP   {R3-R5,R8, R12}  ;弹出R3-R5,R8,以及R12

POP   {R0-R2}      ;弹出R0-R2


  注意:在寄存器列表中,不管寄存器的序号是以什么顺序给出的,汇编器都将把它们升
序排序。然后先push序号大的寄存器,所以也就先pop序号小的寄存器。(这是译者在实验

中发现的)。如果不按升序写寄存器,也许有些汇编器会给出语法错误。


  PUSH/POP对子还有这样一种特殊形式,形如
  PUSH  {R0-R3, LR}

  POP   {R0-R3, PC}



  请注意:POP的最后一个寄存器是PC,并不是先前PUSH的LR。这其实是一个返回的小
技巧。与其按部就班地把先前LR的值弹回LR,再复制给PC来返回;不如干脆绕过LR,直接
传给PC!那不怕LR的值没有被恢复吗?不怕,因为LR在子程序调用中的唯一用处,就是在
返回时提供返回地址。因此,在返回后,先前保存的返回地址就没有利用价值了,所以只要

PC得到了正确的值,不恢复也没关系。



关于MSP需要注意的地方:


  因为 CM3使用的是向下生长的满栈,所以MSP 的初始值必须是堆栈内存的末地址加 1。举例 来
说,如果你的堆栈区域在 0x20007C00-0x20007FFF之间,那么MSP 的初始值就必须是 0x20008000。  
  向量表跟随在 MSP 的初始值之后——也就是第 2个表目。要注意因为 CM3是在Thumb态下执
行,所以向量表中的每个数值都必须把 LSB置1(也就是奇数)。正是因为这个原因,图 3.18中使用
0x101来表达地址 0x100。当0x100处的指令得到执行后,就正式开始了程序的执行。在此之前初始
化 MSP 是必需的,因为可能第 1 条指令还没来得及执行,就发生了 NMI 或是其它 fault。MSP 初始
化好后就已经为它们的服务例程准备好了堆栈。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值