📄 hanoi.asm
字号:
;hanoi
;注释声明:
; 1.hanoi(x,y,z,n)表示有n个盘子从x移动到z,经过y
; 2.print("x-->y")表示输出:x-->y
.model small
.data
msg1 db '-->$'
msg2 db 'Please enter the number of disk:$'
.stack 300h
.code
;*************************************************************
main proc far
start:
mov ax,@data
mov ds,ax
;显示提示信息
lea dx,msg2
mov ah,09h
int 21h
;输入盘子的个数
call decibin
call crlf
;给参数赋值
sub ah,ah
mov al,'A' ;x
push ax
mov al,'B' ;y
push ax
mov al,'C' ;z
push ax
push bx ;n
call hanoi
mov ax ,4c00h
int 21h
main endp
;*************************************************************
hanoi proc near pascal uses ax bx cx dx, x:word,y:word,z:word,n:word
mov ax,n
cmp ax,1
jnz next ;判断盘子数目是否为1
;盘子数=1
;----------pirnt("x-->z")----------------
;输出x
mov ax,x
mov dl,al
mov ah,2
int 21h
;输出-->
lea dx,msg1
mov ah,09h
int 21h
;输出z
mov ax,z
mov dl,al
mov ah,2
int 21h
;换行
call crlf
ret
;盘子数>1
next:
;------------hanor(x,z,y,n-1)--------------
;初始化子调用
mov ax,x
push ax
mov ax,z
push ax
mov ax,y
push ax
mov bx,n
dec bx
push bx
;保存变量
mov ax,x
mov bx,n
mov cx,y
mov dx,z
call hanoi
mov x,ax
mov n,bx
mov y,cx
mov z,dx
;--------------print("x-->z")----------------
;输出x
mov ax,x
mov dl,al
mov ah,2
int 21h
;输出-->
lea dx,msg1
mov ah,09h
int 21h
;输出y
mov ax,z
mov dl,al
mov ah,2
int 21h
call crlf
;----------------hanoi(y,x,z,n-1)-------------
mov ax,y
push ax
mov ax,x
push ax
mov ax,z
push ax
mov ax,n
dec ax
push ax
call hanoi
;-------------------end--------------------------
ret
hanoi endp
;*************************************************************
;从键盘输入数字
decibin proc near
mov bx,0
newchar:
mov ah,1
int 21h
sub al,30h
jl exit
cmp al,9d
jg exit
cbw
xchg ax,bx
mov cx,10d
mul cx
xchg ax,bx
add bx,ax
jmp newchar
exit:
ret
decibin endp
;*************************************************************
;换行
crlf proc near
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
ret
crlf endp
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -