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

📄 hanoi.lst

📁 递归方法实现HANOI塔问题 子程序模块个数不限。要求: 盘子个数可以输入,第一个塔为A,第二个塔为B,第三个塔的名称为C。打印出移动过程。
💻 LST
字号:
Microsoft (R) Macro Assembler Version 6.11		    04/25/08 08:59:01
C:\DOCUME~1\ADMINI~1\桌面\243200~2\hanoi\hanoi.asm	     Page 1 - 1


 0000				data  segment
 0000 0000			      bin   dw 0      ;输入的数字 
				      
 0002  000A [			      chnum db 10 dup('0'),'$'      ;存放移动次数 
        30
       ] 24
				      
 000D 0041			      one   dw 'A'
 000F 0042			      two   dw 'B'
 0011 0043			      three dw 'C'
 0013 2D 2D 3E 24		      strshow  db '-->$'
				      
 0017 0D 0A 24			      chline   db 0dh,0ah,'$'     ;回车换行 
				      
 001A 50 6C 65 61 73 65		      prompt   db 'Please input the plate number(1-99):$'
       20 69 6E 70 75 74
       20 74 68 65 20 70
       6C 61 74 65 20 6E
       75 6D 62 65 72 28
       31 2D 39 39 29 3A
       24
 003F 0D 0A 59 6F 75 20		      chtimes1 db 0dh,0ah,'You have moved $'
       68 61 76 65 20 6D
       6F 76 65 64 20 24
 0051 74 69 6D 65 73 0D		      chtimes2 db 'times',0dh,0ah,'$'
       0A 24
				      
				      
 0059				      inputlist   label byte       ;缓冲区 
 0059 03			      maxlen   db 3
 005A 00			      actlen   db 0    ;实际个数 
 005B  0003 [			      chinput  db 3 dup ('0'),'$'
        30
       ] 24
				      
				      
 005F 0001			      multfact dw 1
 0061				data ends
 0000				code  segment
 0000				main  proc far
				assume   cs:code,ds:data
 0000				start:
 0000  B8 ---- R		      mov   ax,data
 0003  8E D8			      mov   ds,ax
 0005				loopagain:
 0005  8D 16 001A R		      lea   dx,prompt
 0009  B4 09			      mov   ah,09h
 000B  CD 21			      int   21h
				      
 000D  8D 16 0059 R		      lea   dx,inputlist  ;输入个数 
 0011  B4 0A			      mov   ah,0ah
 0013  CD 21			      int   21h
				      
 0015  E8 0080			      call  asctobin   ;转化位数字 放在bin 
				       
 0018  B8 0001			      mov   ax,1
 001B  3B 06 0000 R		      cmp   ax,bin
 001F  77 E4			      ja    loopagain    ;ax>=bin,即bin<=1 
 0021  B8 0063			      mov   ax,99
 0024  39 06 0000 R		      cmp   bin,ax  ;bin>=99 
 0028  77 DB			      ja    loopagain  
				      
				      
 002A  FF 36 0000 R		      push  bin      ;参数 
 002E  FF 36 000D R		      push  one
 0032  FF 36 000F R		      push  two
 0036  FF 36 0011 R		      push  three
				      
 003A  8D 16 0017 R		      lea   dx,chline     ;回车换行 
 003E  B4 09			      mov   ah,09h
 0040  CD 21			      int   21h
				      
 0042  E8 008D			      call  hanoi
				      
 0045  8D 16 003F R		      lea   dx,chtimes1
 0049  B4 09			      mov   ah,09h
 004B  CD 21			      int   21h
				      
				;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;下面是把chnum的每个数字转化位ASK11码    
 004D  B9 000A			      mov   cx,0010
 0050  8D 36 0002 R		      lea   si,chnum
 0054				shownum:
 0054  80 3C 30			      cmp   byte ptr [si],'0'
 0057  74 03			      je    notadd
 0059  80 04 30			      add   byte ptr [si],48   ;转化为ASC11码 
 005C				notadd:
 005C  46			      inc   si
 005D  E2 F5			      loop  shownum
				;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;      
				      
 005F  8D 16 0002 R		      lea   dx,chnum
 0063  B4 09			      mov   ah,09h
 0065  CD 21			      int   21h
 0067  8D 16 0051 R		      lea   dx,chtimes2
 006B  B4 09			      mov   ah,09h
 006D  CD 21			      int   21h
				      
				;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;下面是从新初始化变量进行下次输入      
 006F  C7 06 0000 R 0000	      mov   bin,0
 0075  C6 06 005A R 00		      mov   actlen,0
 007A  C6 06 005B R 30		      mov   [chinput],'0'
 007F  C6 06 005C R 30		      mov   [chinput+1],'0'
 0084  B9 000A			      mov   cx,0010
 0087  8D 36 0002 R		      lea   si,chnum
 008B				put0:
 008B  C6 04 30			      mov   byte ptr [si],'0'
 008E  46			      inc   si
 008F  E2 FA			      loop  put0
 0091  E9 FF71			      jmp   loopagain
 0094				loopend:
 0094  B4 4C			      mov   ah,4ch
 0096  CD 21			      int   21h
 0098				      main  endp
				      

				;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;   字符串转化为数字的子程序 
 0098				asctobin proc  near
 0098  50			      push  ax
 0099  51			      push  cx
 009A  80 3E 005A R 00		      cmp   actlen,0
 009F  74 F3			      je    loopend   ;没有输入 
 00A1  80 3E 005A R 01		      cmp   actlen,1  ;输入各位数 
 00A6  74 02			      je    l2
 00A8  EB 0D			      jmp   l3
 00AA				l2:
 00AA  32 E4			      xor   ah,ah
 00AC  A0 005B R		      mov   al,[chinput]
 00AF  2C 30			      sub   al,48  ;48=30h 
 00B1  01 06 0000 R		      add   bin,ax
 00B5  EB 18			      jmp   out1
 00B7				l3:
 00B7  32 E4			      xor   ah,ah
 00B9  A0 005C R		      mov   al,[chinput+1]
 00BC  2C 30			      sub   al,48
 00BE  01 06 0000 R		      add   bin,ax
 00C2  A0 005B R		      mov   al,[chinput]
 00C5  2C 30			      sub   al,48
 00C7  B1 0A			      mov   cl,10
 00C9  F6 E1			      mul   cl
 00CB  01 06 0000 R		      add   bin,ax
 00CF				out1:
 00CF  59			      pop   cx
 00D0  58			      pop   ax
 00D1  C3			      ret
 00D2				asctobin  endp



				;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;    hanoi子程序 
 00D2				hanoi proc  near
 00D2  50			      push  ax      ;保存工作 
 00D3  52			      push  dx
 00D4  55			      push  bp
				      
 00D5  8B EC			      mov   bp,sp  ;堆栈顶指针 发到bp 
 00D7  B8 0001			      mov   ax,1
 00DA  3B 46 0E			      cmp   ax,word ptr [bp+14]   ;将个数和1比较,前面工push了7次 
 00DD  74 02			      je    equal
 00DF  EB 33			      jmp   unequal
 00E1				equal:  ;个数为1  则输出 第2个参数符号-->第4个参数符号 


				;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;下面是进行步骤记数 
 00E1  8D 36 000C R		      lea   si,chnum+10    
 00E5				loopnum0:
 00E5  32 E4			      xor   ah,ah
 00E7  4E			      dec   si
 00E8  8A 04			      mov   al,[si]
 00EA  04 01			      add   al,1
 00EC  37			      aaa              ;如果有进位ah=1    ,al=相加后的树,如:3+9 -> al=2.ah=1 
 00ED  88 04			      mov   [si],al
 00EF  80 FC 01			      cmp   ah,1
 00F2  74 F1			      je    loopnum0   ;如果ah=1,说明有进位,将si向前移动一位,进行加1 
				      
				;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;     
				      
				      
 00F4  8B 56 0C			      mov   dx,word ptr[bp+12]    ;输出'a'      
 00F7  B4 02			      mov   ah,2  ;输出字符 
 00F9  CD 21			      int   21h
				      
 00FB  8D 16 0013 R		      lea   dx,strshow   ;输出键号 
 00FF  B4 09			      mov   ah,09h
 0101  CD 21			      int   21h
				      
 0103  8B 56 08			      mov   dx,word ptr [bp+8]   ;输出'c' 
 0106  B4 02			      mov   ah,02h
 0108  CD 21			      int   21h
				      
 010A  8D 16 0017 R		      lea   dx,chline
 010E  B4 09			      mov   ah,09h
 0110  CD 21			      int   21h
 0112  EB 57			      jmp   exit
				      
				      
 0114				unequal:                                                 ;个数>1 
 0114  8B 46 0E			      mov   ax,[bp+14]  ;个数发到AX 
 0117  83 E8 01			      sub   ax,1        ;个数-1 
				      
 011A  50			      push  ax          ;参数 
 011B  FF 76 0C			      push  [bp+12]
 011E  FF 76 08			      push  [bp+8]
 0121  FF 76 0A			      push  [bp+10]     
 0124  E8 FFAB			      call  hanoi     ;n-1个移动到b 
				    
				    
				      
 0127  8D 36 000C R		      lea   si,chnum+10  ;下面是把a->c, 
 012B				loopnum1:
 012B  32 E4			      xor   ah,ah
 012D  4E			      dec   si
 012E  8A 04			      mov   al,[si]
 0130  04 01			      add   al,1
 0132  37			      aaa
 0133  88 04			      mov   [si],al
 0135  80 FC 01			      cmp   ah,1
 0138  74 F1			      je    loopnum1
				      
 013A  8B 56 0C			      mov   dx,word ptr [bp+12]    ;下面是输出 
 013D  B4 02			      mov   ah,2
 013F  CD 21			      int   21h
 0141  8D 16 0013 R		      lea   dx,strshow
 0145  B4 09			      mov   ah,09h
 0147  CD 21			      int   21h
 0149  8B 56 08			      mov   dx,word ptr [bp+8]
 014C  B4 02			      mov   ah,02h
 014E  CD 21			      int   21h
 0150  8D 16 0017 R		      lea   dx,chline
 0154  B4 09			      mov   ah,09h
 0156  CD 21			      int   21h
				      
 0158  8B 46 0E			      mov   ax,[bp+14]     ;然后再把n-1个由 第2个参数符号-->第4个参数符号 
 015B  83 E8 01			      sub   ax,1
 015E  50			      push  ax
 015F  FF 76 0A			      push  [bp+10]
 0162  FF 76 0C			      push  [bp+12]
 0165  FF 76 08			      push  [bp+8]
 0168  E8 FF67			      call  hanoi
 016B				exit:
 016B  5D			      pop   bp
 016C  5A			      pop   dx
 016D  58			      pop   ax
 016E  C2 0008			      ret   8
 0171				hanoi endp
 0171				      code  ends
				            end   start
Microsoft (R) Macro Assembler Version 6.11		    04/25/08 08:59:01
C:\DOCUME~1\ADMINI~1\桌面\243200~2\hanoi\hanoi.asm	     Symbols 2 - 1




Segments and Groups:

                N a m e                 Size     Length   Align   Combine Class

code . . . . . . . . . . . . . .	16 Bit	 0171	  Para	  Private 
data . . . . . . . . . . . . . .	16 Bit	 0061	  Para	  Private 


Procedures,  parameters and locals:

                N a m e                 Type     Value    Attr

asctobin . . . . . . . . . . . .	P Near	 0098	  code	Length= 003A Private
hanoi  . . . . . . . . . . . . .	P Near	 00D2	  code	Length= 009F Private
main . . . . . . . . . . . . . .	P Far	 0000	  code	Length= 0098 Private


Symbols:

                N a m e                 Type     Value    Attr

actlen . . . . . . . . . . . . .	Byte	 005A	  data	
bin  . . . . . . . . . . . . . .	Word	 0000	  data	
chinput  . . . . . . . . . . . .	Byte	 005B	  data	
chline . . . . . . . . . . . . .	Byte	 0017	  data	
chnum  . . . . . . . . . . . . .	Byte	 0002	  data	
chtimes1 . . . . . . . . . . . .	Byte	 003F	  data	
chtimes2 . . . . . . . . . . . .	Byte	 0051	  data	
equal  . . . . . . . . . . . . .	L Near	 00E1	  code	
exit . . . . . . . . . . . . . .	L Near	 016B	  code	
inputlist  . . . . . . . . . . .	Byte	 0059	  data	
l2 . . . . . . . . . . . . . . .	L Near	 00AA	  code	
l3 . . . . . . . . . . . . . . .	L Near	 00B7	  code	
loopagain  . . . . . . . . . . .	L Near	 0005	  code	
loopend  . . . . . . . . . . . .	L Near	 0094	  code	
loopnum0 . . . . . . . . . . . .	L Near	 00E5	  code	
loopnum1 . . . . . . . . . . . .	L Near	 012B	  code	
maxlen . . . . . . . . . . . . .	Byte	 0059	  data	
multfact . . . . . . . . . . . .	Word	 005F	  data	
notadd . . . . . . . . . . . . .	L Near	 005C	  code	
one  . . . . . . . . . . . . . .	Word	 000D	  data	
out1 . . . . . . . . . . . . . .	L Near	 00CF	  code	
prompt . . . . . . . . . . . . .	Byte	 001A	  data	
put0 . . . . . . . . . . . . . .	L Near	 008B	  code	
shownum  . . . . . . . . . . . .	L Near	 0054	  code	
start  . . . . . . . . . . . . .	L Near	 0000	  code	
strshow  . . . . . . . . . . . .	Byte	 0013	  data	
three  . . . . . . . . . . . . .	Word	 0011	  data	
two  . . . . . . . . . . . . . .	Word	 000F	  data	
unequal  . . . . . . . . . . . .	L Near	 0114	  code	

	   0 Warnings
	   0 Errors

⌨️ 快捷键说明

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