Bluepsec Examples
Example Program
Overview
This package contains a simple assembler program that calculates Fibonacci numbers in an iterative manner.
The code
import CyanTypes::*;
import CyanAsm::*;
import List::*;
// function returning a program as a list of function calls which code the instructions
function List#(AsmLineT) fib_program(function ImmT findaddr(String label)) =
cons(asm("", OpORI, Rg1, RgZero, RgZero, 13), // r1 = 13
cons(asm("", OpJSR, RgZero, RgZero, RgZero, findaddr("fib")), // call fib function
cons(asm("", OpSTORE, RgZero, RgZero, Rg1, unpack(extend(pack(Address_magic_output)))), // output result
cons(asm("end", OpBEQ, RgZero, RgZero, RgZero, findaddr("end")), // loop for ever to stop
// start of fub function - paramenter passed in r1
cons(asm("fib", OpORI, Rg2, RgZero, RgZero, 2), // r2 = 2
cons(asm("", OpBLT, RgZero, Rg1, Rg2, findaddr("finish")), // if(r1<r2) goto finish
cons(asm("", OpOR, Rg4, Rg1, RgZero, 0), // r4 = r1 (a)
cons(asm("", OpORI, Rg1, RgZero, RgZero, 1), // r1 = 1 (a)
cons(asm("", OpORI, Rg2, RgZero, RgZero, 0), // r2 = 0 (b)
cons(asm("loop", OpADD, Rg1, Rg1, Rg2, 0), // r1=r1+r2, i.e. a=a+b
cons(asm("", OpSUB, Rg2, Rg1, Rg2, 0), // r2=r1-r2, i.e. b=a-b
cons(asm("", OpADDI,Rg4, Rg4, RgZero, -1), // r4=r4-1, i.e. dec loop counter
cons(asm("", OpBNE, RgZero, RgZero, Rg4, findaddr("loop")), // if(r4!=0) goto loop
cons(asm("finish", OpJR, RgZero, Rgra, RgZero, 0), // jump ra (return from subroutine)
tagged Nil)))))))))))))); // end of list
Link to the FibProg.bsv source