I need to implement an assembler and interpreter for a simple
instruction set.  For example, this code

  \begin{code}
  compute112    = do 
    {           zero r1 
    ;           zero r2
    ;           addi r2 3       -- loop three times
    ;topLoop <- label
    ;           addi r1 4
    ;           addi r2 (-1)    -- decrement loop counter
    ;           brPositive r2 topLoop
    ;           add r1 100
    }
  \end{code}

would result in register r1 having a value 112.  Without forward
branches, the implementation is reasonably straightforward.  The
assembler can use a Monad with state and writer capabilities.  The
interpreter can use a continuation monad to implement branches and a
state monad for the machine state.

However, forward branches make things harder.  I'd like to be able to
write something along the lines of:

  \begin{code}
  compute12     = mdo 
    {           zero r1 
    ;           zero r2
    ;           addi r2 3       -- loop three times
    ;topLoop <- label
    ;           addi r1 4
    ;           addi r2 (-1)    -- decrement loop counter
    ;           brPositive r2 topLoop
    ;           mov r3 r1
    ;           addi r3 (-10)   
-- !!! Forward branch:
    ;           brPositive r3 out -- if r1 > 10 don't add 100
    ;           add r1 100
    ;out <-     label
    }
  \end{code}

but it's not clear to me how to implement it.  I'd be willing to
accept a somewhat less clean version (for instance, with more
cumbersome forward references.)

Any help would be greatly appreciated.

        thanks,
        mike
_______________________________________________
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to