高手请进,散分100,求Fibonacci数列程序,在线等~~~
n=1,f(n)=1
n=2,f(n)=1
n>2.f(n)=f(n-1)+f(n-2)
求第N项!!!
问题点数:0、回复次数:8Top
1 楼zlf2356609(小鱼)回复于 2005-01-03 19:59:56 得分 0
多谢了!!马上就要交了!!!还是没有编出来,郁闷!!!!Top
2 楼zlf2356609(小鱼)回复于 2005-01-03 20:01:02 得分 0
要求有输出和输入的!!!好像这个很难解决!!!Top
3 楼clumsy(Kyrie eleison)回复于 2005-01-03 20:17:14 得分 0
到现在还没解决啊? 下面的是原来这里的个帖子里以递归方法求解 Fibonacci 数列的代码, 加上输入和显示模块拼装而成的. 在输入是直接回车的话, 退出
;
; do with Masm6.0: ml /AT fibo.asm
; or ml /c fibo.asm
; link /tiny fibo.obj;
;
_TEXT segment 'CODE'
assume cs:_TEXT, ds:_TEXT
org 100h
start:
l_getVal:
call inVal ; read in (n)
test ax, ax ; exit if zero
jz l_exit
cmp ax, MaxVal ; too large?
jbe @f ; no
mov ax, MaxVal ; yes, set it to max.
@@:
mov n, ax
push ax
mov dx, offset msgFn1
mov ah, 9
int 21h
mov ax, n ; print n
call dec2asc
mov dx, offset msgFn2
mov ah, 9
int 21h
push n
call fibo ; get F(n)
call dec2asc ; print F(n)
mov dx, offset msgCRLF
mov ah, 9
int 21h
jmp l_getVal
l_exit:
mov ax, 4c00h
int 21h
; return a integer in ax
inVal proc
push dx
push cx
push si
mov dx, offset msg4n
mov ah, 9
int 21h
mov ah, 0ah
mov dx, offset bufIn
mov si, dx
int 21h
xor dx, dx
inc si
cld
lodsb
test al, al
jz l_setax
mov cl, 2
l_digits:
lodsb
cmp al, '0'
jb l_setax
cmp al, '9'
ja l_setax
and ax, 0fh
shl dx, 1
add ax, dx
shl dx, cl
add dx, ax
jmp l_digits
l_setax:
mov ax, dx
pop si
pop cx
pop dx
ret
inVal endp
align 2
MaxVal dw 24 ; F(24)=46368, F(25) > 64K
n dw 0
Fn dw 0
msgFn1 db 'F(', '$'
msgFn2 db ')=', '$'
msg4n db 'n=', '$'
msgCRLF db 0dh, 0ah, '$'
bufIn db 6, 0, 6 dup (?)
; return F(n) in ax
fibo proc near ; F(n)
push bp
mov bp, sp
push dx
mov ax, [bp+4] ; n -> ax
test ax, ax
jz l_ret0 ; F(0) = 0
dec ax
jz l_ret1 ; F(1) = 1
push ax ; n-1 -> stack
dec ax
push ax ; n-2 -> stack
call fibo ; F(n-2)
mov dx, ax ; F(n-2) -> ax
call fibo ; F(n-1)
add ax, dx ; F(n-1) + F(n-2) -> ax
l_ret:
pop dx
pop bp
ret 2
l_ret0:
xor ax, ax
jmp l_ret
l_ret1:
mov ax, 1
jmp l_ret
fibo endp
; display the unsigned integer value in AX
dec2asc proc
push ax
push dx
push cx
mov dx, -1 ; flag of ending
push dx ; flag to stack
mov cx, 10
l_div10:
xor dx, dx
div cx ; DX:AX / CX
push dx
test ax, ax
jne l_div10
mov cx, -1
mov ah, 2 ; display character in DL
l_disp:
pop dx
cmp dx, cx
je l_ret
add dl, '0' ; one-digit value turns to character
int 21h ; display the digit
jmp l_disp
l_ret:
pop cx
pop dx
pop ax
ret
dec2asc endp
_TEXT ends
end start
程序运行结果: 每行是在提示 'n=' 进行输入后才显示的
E:\MASM>fibo
F(1)=1
F(2)=1
F(3)=2
F(4)=3
F(5)=5
F(6)=8
F(7)=13
F(8)=21
F(9)=34
F(10)=55
F(11)=89
F(12)=144
F(13)=233
F(14)=377
F(15)=610
F(16)=987
F(17)=1597
F(18)=2584
F(19)=4181
F(20)=6765
F(21)=10946
F(22)=17711
F(23)=28657
F(24)=46368
F(24)=46368
n=
Top
4 楼zlf2356609(小鱼)回复于 2005-01-03 20:27:17 得分 0
多谢!!!!!!Top
5 楼zlf2356609(小鱼)回复于 2005-01-03 22:06:15 得分 0
输出是乱码~~~而且本来就有7个错误!晕!~帮忙再修改一下把!3Q!!~~Top
6 楼clumsy(Kyrie eleison)回复于 2005-01-04 07:12:55 得分 0
代码的开始的注释部分已经说明了的, 用 Masm6.0 或以上版本, 生成 .com 类型!!!Top
7 楼zlf2356609(小鱼)回复于 2005-01-12 19:31:04 得分 0
怎么转换啊??我太菜了,实在不知道~Top
8 楼clumsy(Kyrie eleison)回复于 2005-01-13 07:16:04 得分 0
转换? 什么转换啊? 是把上面的代码转换为可以使用 Masm5.0 的格式吗? 只要把编译时提示的两个一样的标号 l_ret 改个名字, 还有就是 @@ 和 @f 修改一下就可以了
_TEXT segment 'CODE'
assume cs:_TEXT, ds:_TEXT
org 100h
start:
push cs ; 这两个指令可以使得 .exe 格式
pop ds ; 也可以正常运行
l_getVal:
call inVal ; read in (n)
test ax, ax ; exit if zero
jz l_exit
cmp ax, MaxVal ; too large?
jbe l_@@ ; no
mov ax, MaxVal ; yes, set it to max.
l_@@:
mov n, ax
push ax
mov dx, offset msgFn1
mov ah, 9
int 21h
mov ax, n ; print n
call dec2asc
mov dx, offset msgFn2
mov ah, 9
int 21h
push n
call fibo ; get F(n)
call dec2asc ; print F(n)
mov dx, offset msgCRLF
mov ah, 9
int 21h
jmp l_getVal
l_exit:
mov ax, 4c00h
int 21h
; return a integer in ax
inVal proc
push dx
push cx
push si
mov dx, offset msg4n
mov ah, 9
int 21h
mov ah, 0ah
mov dx, offset bufIn
mov si, dx
int 21h
xor dx, dx
inc si
cld
lodsb
test al, al
jz l_setax
mov cl, 2
l_digits:
lodsb
cmp al, '0'
jb l_setax
cmp al, '9'
ja l_setax
and ax, 0fh
shl dx, 1
add ax, dx
shl dx, cl
add dx, ax
jmp l_digits
l_setax:
mov ax, dx
pop si
pop cx
pop dx
ret
inVal endp
align 2
MaxVal dw 24 ; F(24)=46368, F(25) > 64K
n dw 0
Fn dw 0
msgFn1 db 'F(', '$'
msgFn2 db ')=', '$'
msg4n db 'n=', '$'
msgCRLF db 0dh, 0ah, '$'
bufIn db 6, 0, 6 dup (?)
; return F(n) in ax
fibo proc near ; F(n)
push bp
mov bp, sp
push dx
mov ax, [bp+4] ; n -> ax
test ax, ax
jz l_ret0 ; F(0) = 0
dec ax
jz l_ret1 ; F(1) = 1
push ax ; n-1 -> stack
dec ax
push ax ; n-2 -> stack
call fibo ; F(n-2)
mov dx, ax ; F(n-2) -> ax
call fibo ; F(n-1)
add ax, dx ; F(n-1) + F(n-2) -> ax
l_retfibo:
pop dx
pop bp
ret 2
l_ret0:
xor ax, ax
jmp l_retfibo
l_ret1:
mov ax, 1
jmp l_retfibo
fibo endp
; display the unsigned integer value in AX
dec2asc proc
push ax
push dx
push cx
mov dx, -1 ; flag of ending
push dx ; flag to stack
mov cx, 10
l_div10:
xor dx, dx
div cx ; DX:AX / CX
push dx
test ax, ax
jne l_div10
mov cx, -1
mov ah, 2 ; display character in DL
l_disp:
pop dx
cmp dx, cx
je l_ret
add dl, '0' ; one-digit value turns to character
int 21h ; display the digit
jmp l_disp
l_ret:
pop cx
pop dx
pop ax
ret
dec2asc endp
_TEXT ends
end startTop




