Re: LZ: Push And Pop
[Prev][Next][Index][Thread]
On 4 Aug 96 at 14:51, Shmuel Popper wrote:
> On Sat, 3 Aug 1996, Josh Pieper wrote:
>
> [snip]
> > Ex:
> >
> > ld bc,$0010 > Parameter a
> > push bc
> > ld de,$0020 > Parameter b
> > push de
> > CALL_(Add)
> >
> > pop de > de now contains $10+$20==$30!!
> >
> > Rest Of Program
> >
> > ; Add Routine
> > Add:
> > pop hl > In this example puts a $20 in hl
> > pop de > Puts $10 in de
> > add hl,de
> > push hl > The stack can also be used to return values
> > ret
> >
> >
> > If you have any further questions on the subject post them to this list
> > or email me at:
> >
> > Josh Pieper
> > ppieper@nemonet.com
>
> You left out one important detail... When you call a routine, that address
> to return to is pushed onto the stack. When you return, the value on the
> top of the stack is popped off, and the cpu jumps to that address. As a
> result the example above will crash. This version, however, should not.
>
> ProgStart:
> ld bc, $0010 ;first number to add
> ld de, $0020 ;second number to add
> push bc
> push de
> CALL_(Add) ;Add returns the added number on the stack
> pop de ;de contains $0030, or $10 + $20
> ;rest of program
>
> Add:
> pop bc ;save address to return to in bc
> pop de ;second parameter now in de
> pop hl ;first parameter in hl
> add hl, de ;hl is now the sum
> push hl ;return value
> push bc ;push address to return to
> ret
>
> Just remember: ALWAYS save the value on the top of the stack when you
> enter a subroutine that does stack manipulation, unless you understand the
> stack well and are sure that you don't want to save the address (and don't
> mind crashing your calc during testing ;-) ).
>
Yep you got me!! (And I've crashed my calculator more than my share of
times if you haven't guessed already by this code!!!!!!)
Josh Pieper
ppieper@nemonet.com
References: