Как узнать, достиг ли указатель стека последнего местоположения в SRAM? - PullRequest
0 голосов
/ 11 февраля 2019

Допустим, я поместил несколько значений в стек SRAM ATmega324PB.Стек начнется с конца SRAM.Теперь я хочу вытолкнуть эти значения одно за другим в регистр.По сути, я хочу создать цикл, который вставляет одно значение в регистр, а затем отправляет следующее значение в стеке в тот же регистр.Цикл будет продолжаться до тех пор, пока указатель стека не достигнет последнего местоположения SRAM (которое в случае ATmega324PB будет равно $ 8FF).

Как я могу остановить цикл, когда он достигнет последнего местоположения стека (SRAM)?

1 Ответ

0 голосов
/ 13 февраля 2019

Необходимо проверить значения регистров ввода-вывода SPH, SPL, в которых хранится текущий указатель стека.Это может быть что-то вроде этого:

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

Вы также можете прочитать самый верхний адрес ОЗУ в r20 для достижения того же результата.

...