📄 fib.asm
字号:
.model small
.386
.stack 200h
tos label word
.data
n_v dd 5
result dd ?
messin db 'Please input an integer n(0<=n<=100):',20h,20h,'$'
messout db 'The result of F(n):',20h,20h,'$'
messerr db 0ah,0dh,'Data input error!',0ah,0dh,'$'
.code
main proc far
start:
mov ax,stack
mov ss,ax
lea sp,tos
push ds
sub ax,ax
push ax
mov ax,@data
mov ds,ax
call input
cmp bx,-1
je exite
cwd
push ebx ;输入n的值
call fib ;计算结果
pop result
call output
exite:
ret
main endp
;---------------------------
output proc near
lea dx,messout
mov ah,09h
int 21h
mov ebx,result
call binidec
ret
output endp
;---------------------------
input proc near
again:
call crlf
lea dx,messin
mov ah,09h
int 21h
call decibin
cmp bx,100
ja again
cmp bx,0
jb again
call crlf
ret
input endp
;---------------------------
binidec proc near ;用ebx传递参数
push bx
push cx
push si
push di
;6 11 16 20 25 30 35 39
cmp ebx,10
jl b1
cmp ebx,100
jl b2
cmp ebx,1000
jl b3
cmp ebx,10000
jl b4
cmp ebx,100000
jl b5
cmp ebx,1000000
jl b6
cmp ebx,10000000
jl b7
cmp ebx,100000000
jl b8
cmp ebx,1000000000
jl b9
cmp ebx,10000000000
jl b10
cmp ebx,100000000000
jl b11
b11: mov ecx,10000000000
call dec_div
b10: mov ecx,1000000000
call dec_div
b9: mov ecx,100000000
call dec_div
b8: mov ecx,10000000
call dec_div
b7: mov ecx,1000000
call dec_div
b6: mov ecx,100000
call dec_div
b5: mov ecx,10000
call dec_div
b4: mov ecx,1000
call dec_div
b3: mov ecx,100
call dec_div
b2: mov ecx,10
call dec_div
b1: mov ecx,1
call dec_div
pop di
pop si
pop cx
pop bx
ret
binidec endp
;---------------------------
dec_div proc near
mov eax,ebx
mov edx,0
div ecx
mov ebx,edx
mov dx,ax
add dl,30h
mov ah,02h
int 21h
ret
dec_div endp
;---------------------------
decibin proc near
mov ah,1
int 21h
sub al,30h ;输入的第一个字符单独进行处理,便于进行异常处理
jl err1
cmp al,9
jg err1
cbw
mov bx,ax
newchar:
mov ah,1
int 21h
sub al,30h
jl exit1
cmp al,9
jg exit1
cbw
xchg ax,bx
mov cx,10
mul cx
xchg ax,bx
add bx,ax
jmp newchar
err1: ;异常处理的能力
lea dx,messerr
mov ah,09h
int 21h
mov bx,-1
exit1:
ret
decibin endp
;---------------------------
crlf proc near
mov dl,0ah
mov ah,02h
int 21h
mov dl,0dh
mov ah,02h
int 21h
ret
crlf endp
;---------------------------
fib proc near ;eax存储要计算F(n)中的n值
push bp
mov bp,sp
mov eax,[bp+4]
cmp eax,2
je l1
cmp eax,1
je l1
dec eax ;eax存放要计算F(n)的n值
push eax
call fib
pop eax
sub eax,eax
add eax,[bp-4] ;将F(n-1)和F(n-2)相加
add eax,[bp-12]
jmp exit
l1: mov eax,1
mov [bp-4],eax
exit:
mov [bp+4],eax
pop bp
ret
fib endp
;---------------------------
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -