📄 汉诺塔.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 + -