📄 fibonacci.asm
字号:
.model small
.386
.stack 100h
.data
string dq 100 dup(?)
creath db 'Please input the number you want:','$'
result db 'The result is:',0ah,0dh,'$'
.code
main proc far
start:
push ds
sub ax,ax
push ax
mov ax,@data
mov ds,ax
mov dx,offset creath
mov ah,9
int 21h
call decibin
call crlf
call fibnacci
call crlf
mov dx,offset result
mov ah,9
int 21h
call binidec
call crlf
mov ah,4ch
int 21h
main endp
decibin proc near
mov di,0
newchar:
mov ah,1
int 21h
sub al,30h
jl exit1
cmp al,9d
jg exit1
cbw
xchg ax,di
mov cx,10d
mul cx
xchg ax,di
add di,ax ;十进制数存入di里
jmp newchar
exit1:
ret
decibin endp
fibnacci proc near
mov si,offset string
mov dword ptr [si],1
mov dword ptr [si+4],0
mov dword ptr [si+8],1
mov dword ptr [si+12],0
sub di,2
cmp di,0
jle exit2
mov cx,di
rotate:
mov ebx,[si] ;Fibonacci数列的计算
mov edx,[si+4]
add ebx,[si+8]
adc edx,[si+12]
mov [si+16],ebx
mov [si+20],edx
add si,8
loop rotate
exit2:
ret
fibnacci endp
binidec proc near
add di,2
mov cx,di
mov si,offset string
again:
mov eax,[si]
mov edx,[si+4]
mov ebp,1000000000d
div ebp
mov ebx,eax ;将大整数分成两部分输出,分别利用ebx和edi存储高位和低位
mov edi,edx
call del
add si,8
loop again
ret
del proc near ;分段输出
cmp ebx,1d ;整数前面的零不输出
jb b1
cmp ebx,10d
jb a10
cmp ebx,100d
jb a9
cmp ebx,1000d
jb a8
cmp ebx,10000d
jb a7
cmp ebx,100000d
jb a6
cmp ebx,1000000d
jb a5
cmp ebx,10000000d
jb a4
cmp ebx,100000000d
jb a3
cmp ebx,1000000000d
jb a2
a1:
mov ebp,1000000000d
call dec_div
a2:
mov ebp,100000000d
call dec_div
a3:
mov ebp,10000000d
call dec_div
a4:
mov ebp,1000000d
call dec_div
a5:
mov ebp,100000d
call dec_div
a6:
mov ebp,10000d
call dec_div
a7:
mov ebp,1000d
call dec_div
a8:
mov ebp,100d
call dec_div
a9:
mov ebp,10d
call dec_div
a10:
mov ebp,1d
call dec_div
jmp b2
b1:
cmp edi,1d ;高位全零的情况下低位前面的零不输出
jb exit
cmp edi,10d
jb b10
cmp edi,100d
jb b9
cmp edi,1000d
jb b8
cmp edi,10000d
jb b7
cmp edi,100000d
jb b6
cmp edi,1000000d
jb b5
cmp edi,10000000d
jb b4
cmp edi,100000000d
jb b3
b2:
mov ebp,100000000d
call dec_divlow
b3:
mov ebp,10000000d
call dec_divlow
b4:
mov ebp,1000000d
call dec_divlow
b5:
mov ebp,100000d
call dec_divlow
b6:
mov ebp,10000d
call dec_divlow
b7:
mov ebp,1000d
call dec_divlow
b8:
mov ebp,100d
call dec_divlow
b9:
mov ebp,10d
call dec_divlow
b10:
mov ebp,1d
call dec_divlow
call space
exit:
ret
del endp
dec_div proc near ;输出高位部分
mov eax,ebx
mov edx,0
div ebp
mov ebx,edx
mov edx,eax
add edx,30h
mov ah,2
int 21h
jmp exit2
ret
dec_div endp
dec_divlow proc near ;输出低位部分
mov eax,edi
mov edx,0
div ebp
mov edi,edx
mov edx,eax
add edx,30h
mov ah,2
int 21h
ret
dec_divlow endp
binidec endp
crlf proc near
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
ret
crlf endp
space proc near
mov dl,20h
mov ah,2
int 21h
ret
space endp
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -