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

📄 fib.asm

📁 汇编语言课程设计的程序
💻 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 + -