如何知道堆栈指针是否已到达SRAM中的最后一个位置?

时间:2019-02-11 02:56:36

标签: assembly avr atmel

比方说,我已经将许多值推入ATmega324PB的SRAM堆栈中。堆栈将从SRAM的末尾开始。现在,我想将这些值一个接一个地弹出到寄存器中。基本上,我想创建一个循环,将一个值弹出到寄存器,然后将堆栈中的下一个值弹出到同一寄存器。循环将一直持续到堆栈指针到达最后一个SRAM位置(在ATmega324PB的情况下为$ 8FF)。

当循环到达堆栈(SRAM)的最后位置时,如何使循环停止?

1 个答案:

答案 0 :(得分: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以达到相同的结果。