32 lines
1014 B
Plaintext
32 lines
1014 B
Plaintext
getfib:
|
|
;input: BX = the desired fibonacci number (in other words, the "n" in "F(n)")
|
|
; DS must point to the segment where the fibonacci table is stored
|
|
;outputs to DX:AX (DX = high word, AX = low word)
|
|
push ds
|
|
cmp bx,41 ;bounds check
|
|
ja IndexOutOfBounds
|
|
shl bx,1
|
|
shl bx,1 ;multiply by 4, since this is a table of dwords
|
|
mov ax,@code
|
|
mov ds,ax
|
|
mov si,offset fib
|
|
mov ax,[ds:si] ;fetch the low word into AX
|
|
mov dx,2[ds:si] ;fetch the high word into DX
|
|
pop ds
|
|
ret
|
|
|
|
|
|
IndexOutOfBounds:
|
|
stc ;set carry to indicate an error
|
|
mov ax,0FFFFh ;return FFFF as the error code
|
|
pop ds
|
|
ret
|
|
|
|
;table of the first 41 fibonacci numbers
|
|
fib dword 0, 1, 1, 2, 3, 5, 8, 13
|
|
dword 21, 34, 55, 89, 144, 233, 377, 610
|
|
dword 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657
|
|
dword 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269
|
|
dword 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986
|
|
dword 102334155
|