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

📄 hanoi.asm

📁 递归方法实现HANOI塔问题 子程序模块个数不限。要求: 盘子个数可以输入,第一个塔为A,第二个塔为B,第三个塔的名称为C。打印出移动过程。
💻 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 + -