Re: LZ: Push And Pop


[Prev][Next][Index][Thread]

Re: LZ: Push And Pop



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: