Code:
.section ".data"
/*Variables data section*/
intro: .asciz "\nThis program prints the Fibonacci sequence." !Program purpose statemt
userp: .asciz "\nEnter a limit on the largest number to be displayed: " !Prompt user to enter a number
number: .asciz "%d" !number to be entered
formtp: .word 0 !where the user input number will be read in
pfib1: .asciz "\n%d "
outfib: .asciz "%d "
uoutp: .asciz "\nThe last number %d is disvisible by %d.\n" !Power of 2
conte: .asciz "\nDo you want to print a different sequence (y/n):" !Continue or stop statement
anser: .asciz "%c"
formta: .byte 0 !where the user input number will be read in
off: .asciz "pause"
define(fib1, i4) !%fib1
define(fib2, i3) !%fib2
define(fib3, l0) !%fib3
define(j_r, l1) !%j_r
define(temp_r, l2) !%temp_r
define(%uinput_r, l3) !%uinput_r
define(final_r, l4) !%final_r
define(max_r, l5) !%max_r
.align 4
.global main
.section ".text"
main: save %sp, -152, %sp
start:
!Post program statement to the user
mov 1, %fib1
mov 1, %fib2
set intro, %o0
call printf
nop
!Prompts for userinput
!Enter a limit on the largest number to be displayed
set userp, %o0
call printf
nop
set number, %o0 !sets the type of data to be entered: integer
set formtp, %o1 !location where input will be stored
call scanf !gets the input into the variable userinput
nop
!Store fib sequence
set pfib1, %o0 !sets the type of data to be entered: integer
mov %fib1, %o1
call printf !print fibonacci sequence
nop
while: !Do loop that calculates the fib sequence and prints it
set outfib, %o0
mov %fib2, %o1 !printsf("%d ", fib2)
call printf
nop
mov %fib1, %o2
mov %fib2, %o3
add %o2, %o3, %o5
mov %o5, %fib3 !fib3 = fib1 + fib2
mov %fib2, %o2
mov %o2, %fib1 !fib1 = fib2
mov %fib3, %o2
mov %o2, %fib2 !fib2 = fib3
mov %fib3, %o2
mov formtp, %o3
cmp %o2, %o3 !while(fib3 <= userinput)
bg swap
nop
b while
swap:
mov %g0, %j_r !int j
mov %fib1, %o0
mov %o0, %temp_r !int temp = fib1
mov 2, %o1
mov %o1, %final_r !int final = 2
mov 1, %o1
mov %o1, %max_r !int max = 1
forloop:
mov %temp_r, %o1
mov %o1, %o0
mov %max_r, %o2
call start
nop
mov %o0, %o1
cmp %o1, 0
bne printlast
nop
mov %max_r, %o0
mov %temp_r, %o1
cmp %o0, %o1
bg printlast
nop
mov %max_r, %o0
mov %o0, %j_r
mov %max_r, %o0
add %o0, %o0, %o0
mov %o0, %max_r
b forloop
nop
printlast:
set uoutp, %o0 !The last number %d is disvisible by %d.\n"
mov %temp_r, %o1
mov %j_r, %o2
call printf
nop
set conte, %o0 !Continue or stop statement
call printf
nop
add %fp, -25, %o5 !User response to stop or continue
set anser, %o3
mov %o5, %o1
call scanf
nop
ldub [formta], %o3
sll %o3, 24, %o3
sra %o3, 24, %o3
cmp %o3, 110
be done
nop
b start
nop
done: !LL3
set off, %o0
call system, 0
nop
mov 0, %o0
mov %o0, %i0
ret
restore