如何知道堆栈指针是否到达 SRAM 中的最后一个位置?
How to know if the stack pointer has reached the last location in SRAM?
假设我已经将一些值压入了 ATmega324PB 的 SRAM 堆栈中。堆栈将从 SRAM 的末尾开始。现在,我想将这些值一个一个地弹出到寄存器中。基本上我想创建一个循环,将一个值弹出到寄存器,然后将堆栈中的下一个值弹出到同一个寄存器。循环将继续,直到堆栈指针到达最后一个 SRAM 位置(在 ATmega324PB 的情况下为 $8FF)。
如何让循环在到达堆栈的最后位置 (SRAM) 时停止?
您必须检查存储当前堆栈指针的 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来达到同样的效果。
假设我已经将一些值压入了 ATmega324PB 的 SRAM 堆栈中。堆栈将从 SRAM 的末尾开始。现在,我想将这些值一个一个地弹出到寄存器中。基本上我想创建一个循环,将一个值弹出到寄存器,然后将堆栈中的下一个值弹出到同一个寄存器。循环将继续,直到堆栈指针到达最后一个 SRAM 位置(在 ATmega324PB 的情况下为 $8FF)。
如何让循环在到达堆栈的最后位置 (SRAM) 时停止?
您必须检查存储当前堆栈指针的 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来达到同样的效果。