COMP1721 - Higher Computing 1B

Computing 1B - Week 13 Tutorial Solutions

  1. 
    main:
        LDI    r24, 10 
        LDI    r31, hi8(pm(fib))  
        LDI    r30, lo8(pm(fib)) 
        ICALL
        MOV    r26, r24
        LDI    r24, 1     ; print "%d\n"
        LDI    r31, 0x70  
        LDI    r30, 0x00  
        ICALL
        LDI    r24, 0     ; exit
        LDI    r31, 0x70  
        LDI    r30, 0x00  
        ICALL
    fib:
    ; if (n < 2) return 1;
    	LDI    r16, 1   
    	SUB    r16, r24
        BRBS   2, L1
    	LDI    r24, 1
    	RET
    L1:
    ; save n on stack
    	PUSH   r24
    ; calculate fib(n-1)
    	LDI    r16, 1
    	SUB    r24, r16
        LDI    r31, hi8(pm(fib))  
        LDI    r30, lo8(pm(fib))
        ICALL
    ; recover n and save fib(n-1) to stack
    	POP    r16
        PUSH   r24
        MOV    r24, r16
    ; calculate fib(n-2)
    	LDI    r16, 2
    	SUB    r24, r16
        LDI    r31, hi8(pm(fib))  
        LDI    r30, lo8(pm(fib))
        ICALL
    ; recover fib(n-1)
    	POP    r16
    	ADD    r24, r16
    ; return fib(n-1)+fib(n-2)
    	RET
    


Andrew Taylor (andrewt@cse.unsw.edu.au)
Higher Computing 1B, Computer Science & Engineering, UNSW