如何知道堆栈指针是不是已到达 SRAM 中的最后一个位置?
Posted
技术标签:
【中文标题】如何知道堆栈指针是不是已到达 SRAM 中的最后一个位置?【英文标题】:How to know if the stack pointer has reached the last location in SRAM?如何知道堆栈指针是否已到达 SRAM 中的最后一个位置? 【发布时间】:2019-02-11 02:56:35 【问题描述】:假设我已将一些值压入 ATmega324PB 的 SRAM 堆栈。堆栈将从 SRAM 的末尾开始。现在,我想将这些值一个一个地弹出到一个寄存器中。基本上我想创建一个循环,将一个值弹出到寄存器,然后将堆栈中的下一个值弹出到同一个寄存器。循环将继续,直到堆栈指针到达最后一个 SRAM 位置(在 ATmega324PB 的情况下为 $8FF)。
当循环到达堆栈的最后一个位置 (SRAM) 时,如何使循环停止?
【问题讨论】:
更简单的做法是将堆栈指针设置为 $8FF。 谢谢罗斯。我没有想到那件事。 【参考方案1】:您必须检查存储当前堆栈指针的 SPH、SPL i/o 寄存器的值。 可能是这样的:
ldi r18, hi(RAMEND)
rjmp enterloop // first jump to check
loop:
pop r20 // pop from the stack
enterloop:
in r16, SPL
in r17, SPH
cpi r16, lo(RAMEND)
cpc r17, r18 // we have no comparison to immediate with carry
brlo loop
但我无法想象你为什么需要这种奇怪的堆栈访问方式。 您可以简单地将堆栈指针设置为结束
ldi r16, lo(RAMEND)
ldi r17, hi(RAMEND)
in r18, SREG // save flags, including interrupt flag
cli // lock interrupts until both registers are updated
out SPL, r16
out SPH, r17
out SREG, r18 // restore interrupts
您也可以将 RAM 的最高地址读入 r20 以达到相同的效果。
【讨论】:
以上是关于如何知道堆栈指针是不是已到达 SRAM 中的最后一个位置?的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有递归或堆栈但使用父指针的情况下按顺序遍历 BST?
Cortex M3映射从0x00000000地址开始,0地址不是堆栈指针吗?能从这开始执行吗?