Skip to content

Instantly share code, notes, and snippets.

@b-adams
Created October 26, 2012 06:58
Show Gist options
  • Save b-adams/3957326 to your computer and use it in GitHub Desktop.
Save b-adams/3957326 to your computer and use it in GitHub Desktop.
CS225 recursive function
-------------------------------------------------------------------------------
Object
Addr code Symbol Mnemon Operand Comment
-------------------------------------------------------------------------------
;Example function with arguments and return value
;int factorial(int n)
;finds the nth fibonacci number
; fibF(0)=fibF(1)=1
; fibF(n) = fibF(n-1)+fibF(n-2)
0000 0400BD BR main
;FIBONACCI FUNCTION BEGINS
;Caller's names
FIBUfram:.EQUATE 4 ;Frame size of fibonacci arguments and return value
FIBUn: .EQUATE -4 ;Caller's view of fibFn location
FIBUret: .EQUATE -2 ;Caller's view of fibFret location
;Callee's names
fibFfram:.EQUATE 4 ;Frame size of fibonacci local variables
fibFn2: .EQUATE 0 ;local variable #2d
fibFn1: .EQUATE 2 ;local variable #2d
fibFretv:.EQUATE 4 ;return address #2h
fibFn: .EQUATE 6 ;formal parameter #2d
fibFret: .EQUATE 8 ;return value #2d
;Function entry point
0003 24 fibF: NOP0
0004 680004 SUBSP fibFfram,i ;allocate #fibFn1 #fibFn2
0007 C30006 LDA fibFn,s ;Load the argument
000A B00001 CPA 1,i ;Compare to 1: our base cases are for n<=1
000D 060013 BRLE fibFBase ;have a 1 (or less), do base case
0010 04001D BR fibFRec ;have a 2 (or more), do recursive case
0013 24 fibFBase:NOP0
0014 C00001 LDA 1,i
0017 E30008 STA fibFret,s ;Save the value in the return slot
001A 04005A BR fibFDone ;finish up with returning stuff
001D 24 fibFRec: NOP0
;Part 1: find fibF(n-1)
001E C30006 LDA fibFn,s ;Get the argument
0021 800001 SUBA 1,i ;Find n-1
0024 E3FFFC STA FIBUn,s ;Prepare it as an argument
0027 680004 SUBSP FIBUfram,i ;allocate #fibFret #fibFn
002A 160003 CALL fibF ;Run fibonacci procedure
002D 600004 ADDSP FIBUfram,i ;deallocate #fibFn #fibFret
0030 C3FFFE LDA FIBUret,s ;Get the return value
0033 E30002 STA fibFn1,s ;Store fibF(n-1) it for future use
;Part 2: find fibF(n-2)
0036 C30006 LDA fibFn,s ;Get the argument (again)
0039 800002 SUBA 2,i ;Find n-2
003C E3FFFC STA FIBUn,s ;Prepare it as an argument
003F 680004 SUBSP FIBUfram,i ;allocate #fibFret #fibFn
0042 160003 CALL fibF ;Run fibonacci procedure
0045 600004 ADDSP FIBUfram,i ;deallocate #fibFn #fibFret
0048 C3FFFE LDA FIBUret,s ;Get the return value
004B E30000 STA fibFn2,s ;Store fibF(n-2) it for future use
;Part 3: find their sum and store as return value
004E C30002 LDA fibFn1,s
0051 730000 ADDA fibFn2,s
0054 E30008 STA fibFret,s ;Setting up value as return value
0057 04005A BR fibFDone ;finish up with returning stuff
005A 24 fibFDone:NOP0
005B 600004 ADDSP fibFfram,i ;deallocate #fibFn2 #fibFn1
005E 58 RET0
;
; Entry point for program
;
005F 596F75 prompt: .ASCII "You must want a Fibonacci number!\n"
206D75
737420
77616E
742061
204669
626F6E
616363
69206E
756D62
657221
0A
0081 576869 .ASCII "Which one would you like? \x00"
636820
6F6E65
20776F
756C64
20796F
75206C
696B65
3F2000
009C 546865 res1: .ASCII "The \x00"
2000
00A1 746820 res2: .ASCII "th Fibonacci number is...\n\t\x00"
466962
6F6E61
636369
206E75
6D6265
722069
732E2E
2E0A09
00
mainfibF:.EQUATE 0 ;local variable #2d
mainin: .EQUATE 2 ;local variable #2d
mainfrm: .EQUATE 4 ;Frame size for main's local variables
00BD 24 main: NOP0
00BE 680004 SUBSP mainfrm,i ;allocate #mainin #mainfibF
00C1 41005F STRO prompt,d
00C4 330002 DECI mainin,s ;User input to local variable
00C7 C30002 LDA mainin,s
00CA E3FFFC STA FIBUn,s ;Prepare that input as a FIBU argument
00CD 680004 SUBSP FIBUfram,i ;allocate #fibFret #fibFn
00D0 160003 CALL fibF ;Run fibonacci procedure
00D3 600004 ADDSP FIBUfram,i ;deallocate #fibFn #fibFret
00D6 C3FFFE LDA FIBUret,s ;Get returned value
00D9 E30000 STA mainfibF,s ;Store returned value
00DC 41009C STRO res1,d ;The
00DF 3B0002 DECO mainin,s ;N
00E2 4100A1 STRO res2,d ;th Fibo is...
00E5 3B0000 DECO mainfibF,s ;fibF(N)
00E8 600004 ADDSP mainfrm,i ;deallocate #mainfibF #mainin
00EB 00 STOP
00EC .END
-------------------------------------------------------------------------------
Symbol table
--------------------------------------
Symbol Value Symbol Value
--------------------------------------
FIBUfram 0004 FIBUn FFFC
FIBUret FFFE fibF 0003
fibFBase 0013 fibFDone 005A
fibFRec 001D fibFfram 0004
fibFn 0006 fibFn1 0002
fibFn2 0000 fibFret 0008
fibFretv 0004 main 00BD
mainfibF 0000 mainfrm 0004
mainin 0002 prompt 005F
res1 009C res2 00A1
--------------------------------------
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment