Stacks ======= LIFO: last-in, first-out Items inserted only at the top (PUSH) Items removed only from the top (POP) A stack pointer is used to keep track of the top. Two choices: A. points at the top element B. points where the next element pushed should go Another choice: does the stack grow up or down? Four versions of PUSH and POP. Look at the relevant instructions (PSH, PUL). Where does the SP point? Does the stack grown up or down in memory? Examples (see lecture) SP instructions: lds, sts, ins, des, tsx, tsy, txs, tys. Look at tsx. Why (SP) + 1? (SP) is an empty stack location It is assumed that the reason to transfer (SP) to X is so that X points to data on the stack. Subroutines =========== Modularity Hide Details Avoid repeating code Look at Hexmon in class notes (p. 45ff) Download onto the board Code for communication over the serial port; reading/writing memory; controling motors. Find the cmd_loop. putchar,e.g., is used multiple times (code is on page 51) Why couldn't we just branch to a label putchar? Why make it a subroutine? what information needs to be saved before jumping to a subroutine? where to come back to, once the subroutine is done; the same code can be called from different places. Consider: cmd_read_byte (which could also be written as a subroutine). call getword; call getbyte; call getchar; jsr, among other things, pushes the return address on the stack; rts? pops the stack, and places the value where? Into the PC Does the jsr affect the PC too? look at, say, jsr putchar what addressing mode is this? extended 0001 ** nonsense program *** 0002 0070 VARS EQU $70 0003 f800 INSTS EQU $F800 0004 fffe RESET EQU $FFFE 0005 00ff STACK EQU $00FF 0006 0007 0070 ORG VARS 0008 0070 33 93 VAR1 fdb $3393 0009 0072 VAR2 rmb 2 0010 0011 f800 ORG INSTS 0012 f800 8e 00 ff START lds #STACK 0013 f803 ce 00 05 ldx #5 0014 f806 bd f8 0c jsr work 0015 0016 f809 7e f8 09 END JMP END 0017 0018 f80c 08 work inx 0019 f80d 39 rts 0020 0021 fffe ORG RESET 0022 fffe f8 00 fdb START 0023 A 00 B 00 t=0 D 0000 X 0000 Y 0000 breakpoints -> SP 0000 PC F800 lds #00ff 00 (.... ....) A 00 B 00 t=3 D 0000 X 0000 Y 0000 breakpoints -> SP 00FF PC F803 ldx #0005 00 (.... ....) A 00 B 00 t=6 D 0000 X 0005 Y 0000 breakpoints -> SP 00FF PC F806 jsr f80c 00 (.... ....) What will the SP contain? What will the PC contain? A 00 B 00 t=12 D 0000 X 0005 Y 0000 breakpoints -> SP 00FD PC F80C inx 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 0000 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0010 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0020 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0030 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0040 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0050 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0060 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0070 33 93 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0080 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0090 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00a0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00b0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00c0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00d0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00f0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa f8 09 A 00 B 00 t=15 D 0000 X 0006 Y 0000 breakpoints -> SP 00FD PC F80D rts 00 (.... ....) What will the SP and PC contain? A 00 B 00 t=20 D 0000 X 0006 Y 0000 breakpoints -> SP 00FF PC F809 jmp f809 00 (.... ....) Does memory change as a result of the rts? No: .... 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00f0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa f8 09 It is fine for the subroutine to use the stack too, but it has to leave it the same on exit as it was on entry. What if the subroutine did this: work ldaa #2 psha inx rts Right before the rts: A 02 B 00 t=20 D 0200 X 0006 Y 0000 breakpoints -> SP 00FC PC F810 rts 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 0000 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0010 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0020 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0030 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0040 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0050 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0060 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0070 33 93 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0080 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0090 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00a0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00b0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00c0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00d0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00f0 aa aa aa aa aa aa aa aa aa aa aa aa aa 02 f8 09 What happens now? What will PC be? SP? A 02 B 00 t=25 D 0200 X 0006 Y 0000 breakpoints -> SP 00FE PC 02F8 stx ffff 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 0000 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0010 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0020 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0030 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0040 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0050 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0060 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0070 33 93 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0080 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 0090 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00a0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00b0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00c0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00d0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00f0 aa aa aa aa aa aa aa aa aa aa aa aa aa 02 f8 09