Neat-o, but I do have a question... how do I pass parameters to
recursive subroutines, and/or save registers and not clobber the
caller's?
Here's a factorial program I wrote:
### Compute the factorial recursively
### based on the scheme classic:
### (define fact (lambda(n) (if (= 1 n) 1 (* n (fact (- n 1))))))
set I0, 3
save I0
bsr fact
restore I1
print "Factorial of "
print I0
print " is "
print I1
print "\n"
end
fact:
push_i
restore I0
print "called fact! parameter="
print I0
print ", depth: "
print I31
inc I31,1
eq I0,0,$is_one
eq I0,1,$is_one
set I1,I0
dec I1,1
save I1
bsr fact
restore I1
mul I0,I0,I1
save I0
branch $done
$is_one:
set I0,1
save I0
$done:
pop_i
ret
But alas, it cannot work: since there's only a single stack, and
there's no way to peek down into it (that I could find), there's no way
to pass params via the stack...or not clobber another's registers. It
might be interesting to have 3 stacks:
* branches
* interpreter contexts
* data
Though that might become a little tedious...hehe, but it would allow my
above example to work :)
Brian
On Fri, 2001-10-12 at 15:00, Dan Sugalski wrote:
> Okay, I finished the support for the generic stack. We can now:
>
> *) save and restore registers (using the save and restore opcodes)
>
> *) return from subs using the address on the top of the stack (using
> the ret opcode)
>
> *) Branch to a label using the bsr opcode, and remember where we were
> for later returning
>
> At the moment we've only got relative sub calls using the bsr (well, bsr_i
> and bsr_ic opcodes, but close enough...) opcode. jsr will come as soon as
> we can reasonably get absolute addresses. Soon, I think.
>
> Dan
>
> --------------------------------------"it's like this"-------------------
> Dan Sugalski even samurai
> [EMAIL PROTECTED] have teddy bears and even
> teddy bears get drunk