回 帖 发 新 帖 刷新版面

主题:斐波纳契数列(Fibonacci)问题

我有一个汇编的程序,是计算Fibonacci数列的,但是不能出正确的答案,希望大家可以帮帮我解决这个问题.

## Program to computes the value of Fibonacci number.

    .text
    .globl  __start

__start:

    sub    $sp,$sp,4    # push return address
    sw    $ra,($sp)
    sub    $sp,$sp,4    # push caller's frame pointer
    sw    $fp,($sp)
    sub    $fp,$sp,8    # $fp = $sp - space_for_variables
    move    $sp,$fp

    li    $v0,4    # call to print string
    la    $a0,pr1
    syscall

    li    $v0,5    # call to read integer
    syscall
    sw    $v0,0($fp)    # save in $v0
    nop

    lw    $a0,0($fp)    # load variable into $a0
    nop
    jal    fib
    nop

    sw    $v0,4($fp)    # b = fib(a)
    nop

    li    $v0,4    # call to print string
    la    $a0,pr2
    syscall

    lw    $a0,4($fp)
    li    $v0,1    # call to print integer
    syscall

    add    $sp,$fp,8    # $sp = $fp + space_for_variables

    lw    $fp,($sp)    # pop $fp
    add    $sp,$sp,4
    lw    $ra,($sp)    # pop $ra
    add    $sp,$sp,4
    jr    $ra    # return to OS
    nop

    .data
pr1:    .asciiz "Enter an interger:"
pr2:    .asciiz "\nThe Fibonacci number is:"

# int Fib( int n )
# {
#   if( n <= 0 )
#      return 0
#   else if( n == 1 )
#       return 1
#   else
#     x = Fib( n-1 )
#     y = Fib( n-2 )
#     return x + y
#   endif
# }

    .text
    .globl  fib

fib:
    sub    $sp,$sp,4    # push return address
    sw    $ra,($sp)
    sub    $sp,$sp,4    # push caller's frame pointer
    sw    $fp,($sp)
    sub    $sp,$sp,4    # push register $s1
    sw    $s1,($sp)
    sub    $fp,$sp,0    # $fp = $sp - space_for_variables (==0)
    move    $sp,$fp

    move    $s1,$a0    # save argument in $s1
    li    $t1,0    # get a==0
    bgt    $s1,$t1,lo1    # if (n <= 0)
    nop
    li    $v0,0    # return 0
    j    exit
    nop

lo1:
    move    $s1,$a0    # save argument in $s1
    li    $t1,1    # get a==1
    beq    $s1,$t1,lo2    # if (n == 1)
    nop
    bgt    $s1,$t1,lo3    # if (n <=1)
    nop

lo2:    li    $v0,1    # return 1
    j    exit
    nop
lo3:    
    sub     $a0,$s1,1    # param = n-1
    jal     fib    # compute fib(n-1)
    nop
    move    $v0,$s1    # x = Fib( n-1 )

    sub    $a0,$s1,2    # set param to n-2
    jal     fib    # and make recursive call
    nop
    add     $v0,$v0,$s1# add fib(n-2)

exit:
    add    $sp,$fp,0    # $sp = $fp + space_for_variables (==0)
    lw    $s1,($sp)
    add    $sp,$sp,4
    lw    $fp,($sp)    # pop $fp
    add    $sp,$sp,4
    lw    $ra,($sp)    # pop $ra
    add    $sp,$sp,4
    jr    $ra    # return to OS
    nop

回复列表 (共1个回复)

沙发

看不懂你的程序,不过如果是求FIBONACCI数列,我可以给你个程序,这个程序是求该数列前20项的值,希望对你有帮助.
DATA SEGMENT
F0 DW 0
F1 DW 1
FN DW 18 DUP (?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MOV AX,DATA
MOV DS,AX
MOV CX,9;只需要循环9次,因为第一个数和第二个数已知,每次循环得到两个
LEA SI,FN
MOV AX,FO
MOV BX,F1
NEXT:ADD AX,BX
ADD BX,AX
MOV WORD PTR [SI], AX
MOV WORD PTR  [SI+2],BX
ADD SI,4
LOOP NEXT
MOV AH,4CH
INT 21H
CODE ENDS
END

我来回复

您尚未登录,请登录后再回复。点此登录或注册