📄 hanoi.asm
字号:
data segment
bin dw 0 ;输入的数字
chnum db 10 dup('0'),'$' ;存放移动次数
one dw 'A'
two dw 'B'
three dw 'C'
strshow db '-->$'
chline db 0dh,0ah,'$' ;回车换行
prompt db 'Please input the plate number(1-99):$'
chtimes1 db 0dh,0ah,'You have moved $'
chtimes2 db 'times',0dh,0ah,'$'
inputlist label byte ;缓冲区
maxlen db 3
actlen db 0 ;实际个数
chinput db 3 dup ('0'),'$'
multfact dw 1
data ends
code segment
main proc far
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
loopagain:
lea dx,prompt
mov ah,09h
int 21h
lea dx,inputlist ;输入个数
mov ah,0ah
int 21h
call asctobin ;转化位数字 放在bin
mov ax,1
cmp ax,bin
ja loopagain ;ax>=bin,即bin<=1
mov ax,99
cmp bin,ax ;bin>=99
ja loopagain
push bin ;参数
push one
push two
push three
lea dx,chline ;回车换行
mov ah,09h
int 21h
call hanoi
lea dx,chtimes1
mov ah,09h
int 21h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;下面是把chnum的每个数字转化位ASK11码
mov cx,0010
lea si,chnum
shownum:
cmp byte ptr [si],'0'
je notadd
add byte ptr [si],48 ;转化为ASC11码
notadd:
inc si
loop shownum
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lea dx,chnum
mov ah,09h
int 21h
lea dx,chtimes2
mov ah,09h
int 21h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;下面是从新初始化变量进行下次输入
mov bin,0
mov actlen,0
mov [chinput],'0'
mov [chinput+1],'0'
mov cx,0010
lea si,chnum
put0:
mov byte ptr [si],'0'
inc si
loop put0
jmp loopagain
loopend:
mov ah,4ch
int 21h
main endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 字符串转化为数字的子程序
asctobin proc near
push ax
push cx
cmp actlen,0
je loopend ;没有输入
cmp actlen,1 ;输入各位数
je l2
jmp l3
l2:
xor ah,ah
mov al,[chinput]
sub al,48 ;48=30h
add bin,ax
jmp out1
l3:
xor ah,ah
mov al,[chinput+1]
sub al,48
add bin,ax
mov al,[chinput]
sub al,48
mov cl,10
mul cl
add bin,ax
out1:
pop cx
pop ax
ret
asctobin endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; hanoi子程序
hanoi proc near
push ax ;保存工作
push dx
push bp
mov bp,sp ;堆栈顶指针 发到bp
mov ax,1
cmp ax,word ptr [bp+14] ;将个数和1比较,前面工push了7次
je equal
jmp unequal
equal: ;个数为1 则输出 第2个参数符号-->第4个参数符号
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;下面是进行步骤记数
lea si,chnum+10
loopnum0:
xor ah,ah
dec si
mov al,[si]
add al,1
aaa ;如果有进位ah=1 ,al=相加后的树,如:3+9 -> al=2.ah=1
mov [si],al
cmp ah,1
je loopnum0 ;如果ah=1,说明有进位,将si向前移动一位,进行加1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov dx,word ptr[bp+12] ;输出'a'
mov ah,2 ;输出字符
int 21h
lea dx,strshow ;输出键号
mov ah,09h
int 21h
mov dx,word ptr [bp+8] ;输出'c'
mov ah,02h
int 21h
lea dx,chline
mov ah,09h
int 21h
jmp exit
unequal: ;个数>1
mov ax,[bp+14] ;个数发到AX
sub ax,1 ;个数-1
push ax ;参数
push [bp+12]
push [bp+8]
push [bp+10]
call hanoi ;n-1个移动到b
lea si,chnum+10 ;下面是把a->c,
loopnum1:
xor ah,ah
dec si
mov al,[si]
add al,1
aaa
mov [si],al
cmp ah,1
je loopnum1
mov dx,word ptr [bp+12] ;下面是输出
mov ah,2
int 21h
lea dx,strshow
mov ah,09h
int 21h
mov dx,word ptr [bp+8]
mov ah,02h
int 21h
lea dx,chline
mov ah,09h
int 21h
mov ax,[bp+14] ;然后再把n-1个由 第2个参数符号-->第4个参数符号
sub ax,1
push ax
push [bp+10]
push [bp+12]
push [bp+8]
call hanoi
exit:
pop bp
pop dx
pop ax
ret 8
hanoi endp
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -