⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fibonacci.asm

📁 本程序用汇编语言实现
💻 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 + -