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

📄 汉诺塔.asm

📁 用汇编解决汉诺塔问题
💻 ASM
字号:
;汉诺塔
data	segment
	msg1		db	'Please	input a number(1-15):','$'
	msg2		db	'The number of steps:','$'
	msg3		db	'-->','$'
	n		dw	?				;木板数
	m		dw	?				;移位数
data	ends
;----------------------------------------------------
code	segment
main	proc	far
	assume  cs:code,ds:data
start:
		push		ds
		sub		ax,ax
		push		ax
;装数据段
		mov		ax,data
		mov		ds,ax
;输出提示
		mov		ah,9
		lea		dx,msg1
		int		21h
;输入第一个字符(数字或其他字符)
		mov		ah,1
		int		21h
		sub		al,30h
		cmp		al,9
		jg		exit
		cmp		al,0
		jl		exit
		mov		ah,0
		mov		n,ax
;输入第二个字符(数字或其他字符)
		mov		ah,1
		int		21h
		sub		al,30h
		cmp		al,9
		jg		next1
		cmp		al,0
		jl		next1
		mov		ah,0
		mov		bx,ax
		mov		al,0ah
		mov		dx,n
		mul		dx
		add		ax,bx
		mov		n,ax
;开始移动
next1:
		mov		bh,'A'
		mov		bl,'B'
		mov		ch,'C'
		mov		dx,0
		mov		m,dx		;计数器				
		call		counter		;不为1继续调用	
		call		crlf
		push		dx		
		mov		ah,9
		lea		dx,msg2
		int		21h
		pop		dx
		mov		ax,m
		call		output		;输出总移动数
exit:
		ret
main	endp
;--------------------------------------------
counter	proc	near		;递归函数
		cmp		n,0
		je		return2
		dec		n
		push		n
		xchg		bl,ch
		push		bx
		push		cx								
		call		counter
		pop		cx
		pop		bx		
		call		crlf
		xchg		bl,ch
		mov		dl,bh
		mov		ah,2
		int		21h
		lea		dx,msg3
		mov		ah,9
		int		21h
		mov		dl,ch
		mov		ah,2
		int		21h
		pop		n
		xchg		bh,bl	
		call		counter
		inc		m
return2:
		
		ret
counter	endp
;--------------------------------------------
crlf	proc	near		;回车换行
		push		dx
		push		ax
		mov		dl,10d
		mov		ah,2
		int		21h
		mov		dl,13d
		mov		ah,2
		int		21h
		pop		ax
		pop		dx
		ret
crlf	endp
;----------------------------------------------
output	proc	near		;十进制输出,被除数在ax中
		mov		dx,0
		mov		cx,10000d	;输出万位		
		div		cx
		push		dx
		mov		dl,30h
		add		dl,al
		mov		ah,2
		int		21h
		pop		dx
							;输出千位
		mov		ax,dx
		mov		dx,0
		mov		cx,1000d		
		div		cx
		push		dx
		mov		dl,30h
		add		dl,al
		mov		bh,ah
		mov		ah,2
		int		21h
		pop		dx
							;输出百位
		mov		ax,dx
		mov		dx,0
		mov		cx,100d		
		div		cx
		push		dx
		mov		dl,30h
		add		dl,al
		mov		ah,2
		int		21h
		pop		dx
							;输出十位
		mov		ax,dx
		mov		cl,10d		
		div		cl
		mov		dl,30h
		add		dl,al
		mov		bh,ah
		mov		ah,2
		int		21h
							;输出个位
		mov		dl,30h
		add		dl,bh
		mov		ah,2
		int		21h
		ret							
output	endp
;----------------------------------------------
code	ends
		end	start
		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -