/* Using the indirect addressing mode instructions ld and st * write a subroutine to save registers r0 to r15 to a * stack buffer located at SRAM 0x04FF * Hint: SRAM address 0x0000 to 0x0001F map to registers r0 to r31 */ .INCLUDE Setup: ldi YH,0x05 ; YH = r29, initialize register stack pointer ldi YL,0x00 ; YL = r28, pre-decrement, first saved location is 04FF rcall PreReg0_20 rcall SaveReg0_15 done: rjmp done SaveReg0_15: clr XH ; r27 clr XL ; r26 clr r25 ; starting with r0 ldi r24,16 ; save 16 registers save_reg: ld r25, X+ st -Y, r25 dec r24 brne save_reg ret /* * Preload registers r0 to r20 with values 21 to 1 */ PreReg0_20: clr XH ; r27 clr XL ; r26 ldi r24,21 ; clear registers r0 to r20 reg_loop: st X+,r24 dec r24 brne reg_loop ret