VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > 汇编语言 >
  • 汇编语言、与C语言、实现--汉诺塔--

题意描述:  

   用汇编语言实现汉诺塔。只需要显示移盘次序,不必显示所移盘的大小,例如: X>Z,X>Y,Z>Y,X>Z,....。

(n阶Hanoi塔问题)假设有三个分别命名为X、Y、Z的塔座,在塔座X上插有n个直径大小各不相同、依小到大编号为1,2,…,n的圆盘。现要求将X轴上的n个圆盘移至塔座Z上并仍按同样顺序叠排,圆盘移动时必须遵循下列规则:

1)每次只能移动一个圆盘;

2)圆盘可以插在X、Y、Z中的任一塔座上;

3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。

 

汉诺塔的实现,用C语言来解释就是函数递归调用实现

如果转为汇编实现,就直接进入栈进行相应的操作就行(当然你也可以用汇编语言宏实现高级的递归调用..)

C语言方式:

复制代码
void move(char one,char three){    //one 移到thre

printf("%c--->%c",one,three);

}

void HANOI(int n,char one,char two,char three){

if(n==1){                          //如果只有一个圆盘,直接将这个圆盘从one移到three

move(one,three);
}

else{                                 //如果大于一个圆盘

HANOI(n-1,one,three,two); //首先将n-1个从one经过three移到two上,此时one上剩最大的一个圆盘

move(one,three);               //将最大的圆盘从one移到three上

HANOI(n-1,two,one,three); //之后将n-1个从two经过one移到three上,完成。

}

}               // end of void

HANOI(5,'X','Y','Z');  //即可5阶汉诺塔从X盘移到Z盘

 
复制代码

递归操作仔细想想就可以了,这样栈的操作逐渐明朗,你就可以用汇编语言实现它了(通过bp栈指针的运算进栈push出栈pop就可以实现相应递归调用)。

汇编代码实现如下:

复制代码
  1 DATA    SEGMENT
  2         n db ?
  3         msg db 0dh,0ah,'Enter the number you want : $'
  4         msg1 db 0dh,0ah,'HANOI-MOVE Procedure with : $',0ah,0dh
  5         to db '--->$'
  6         count dw 0   ; 5个一组输出显示
  7 DATA    ENDS
  8 
  9 CODE    SEGMENT
 10         ASSUME CS:CODE,DS:DATA
 11 START: 
 12         MOV     AX,DATA
 13         MOV     DS,AX
 14         
 15         LEA DX,msg
 16         CALL intro
 17 KEYIN:        
 18         MOV AH,01H         ;字符输入并回显
 19         INT 21H
 20         MOV byte ptr[n],Al         ;接收键入的n值
 21         
 22         LEA DX,msg1
 23         CALL intro
 24         MOV DL,0ah
 25         CALL DISPLAY
 26         
 27         MOV AL,byte ptr[n]
 28         SUB AL,30H
 29         CBW
 30         MOV DX,AX
 31         MOV AX,'X'
 32         MOV BX,'Y'
 33         MOV CX,'Z'
 34         ;MOV DX,[n]
 35         
 36         PUSH DX
 37         PUSH CX
 38         PUSH BX
 39         PUSH AX
 40         
 41         CALL HANOI_MOVE
 42         ADD SP,8
 43         
 44         MOV DL,0ah
 45         CALL DISPLAY
 46         LEA DX,msg
 47         CALL intro
 48         JMP KEYIN
 49         
 50 GroupMake:
 51         INC [count]
 52         MOV AX,[count]
 53         MOV BL,5           ;5 个一组
 54         DIV BL
 55         CMP AH,0
 56         JNE SPACE
 57         MOV DL,0ah
 58         CALL DISPLAY        ;输出换行       
 59         JMP CLOSE
 60     SPACE:
 61         MOV DX,20H
 62         CALL DISPLAY        ;输出空格
 63     CLOSE:
 64           RET
 65 
 66 STEP:     ;输出步骤号
 67         MOV AX,[count]  ;防止count多位数不正确输出--hexTOdec
 68         MOV CX,0
 69         MOV BX,10
 70 DISP1:
 71         MOV DX,0
 72         DIV BX
 73         PUSH DX
 74         INC CX
 75         OR AX,AX
 76         JNZ DISP1    
 77         
 78         MOV DL,5BH    ; 输出显示[
 79         CALL DISPLAY            
 80 DISP2:  
 81         POP DX
 82         ADD DL,30H    ; 输出显示对应十进制
 83         CALL DISPLAY    
 84         LOOP DISP2   
 85         
 86         MOV DL,5DH    ; 输出显示]
 87         CALL DISPLAY
 88         RET        
 89         
 90 intro proc near          ;提示语
 91          MOV AH,09H
 92          INT 21H
 93          ret
 94 intro endp
 95      
 96 DISPLAY proc near        ;输出字符
 97         MOV AH,02H
 98         INT 21H
 99         RET
100 DISPLAY endp
101       
102 HANOI_MOVE proc near
103         MOV BP,SP
104         MOV AX,[BP+8]
105         CMP AX,1
106         JG moreThanOne    ;n 不等于1则跳转
107         CALL STEP
108         MOV DX,[BP+2]     ;取第一个值
109         CALL DISPLAY
110         LEA DX,to           
111         CALL intro
112         MOV DX,[BP+6]     ;取第三个值
113         CALL DISPLAY    
114         CALL GroupMake
115         
116           RET
117 
118 
119 moreThanOne:
120         MOV AX,[BP+2]
121         MOV BX,[BP+4]
122         MOV CX,[BP+6]
123         MOV DX,[BP+8]
124         DEC DX              ;n-1
125         PUSH DX
126         PUSH BX
127         PUSH CX
128         PUSH AX
129         CALL HANOI_MOVE      ;递归一次,进行下一循环
130         ADD SP,8
131         
132         MOV BP,SP
133         CALL STEP
134         MOV DX,[BP+2]     ;取第一个值
135         CALL DISPLAY
136         LEA DX,to           
137         CALL intro
138         MOV DX,[BP+6]     ;取第三个值
139         CALL DISPLAY    
140         CALL GroupMake
141         
142         MOV AX,[BP+2]
143         MOV BX,[BP+4]
144         MOV CX,[BP+6]
145         MOV DX,[BP+8]  
146         DEC DX              ;n-1
147         PUSH DX
148         PUSH CX
149         PUSH AX
150         PUSH BX
151         CALL HANOI_MOVE      ;递归一次,进行下一循环
152         ADD SP,8
153         
154         RET
155 HANOI_MOVE endp
156 
157 EXIT:   MOV     AH,4CH      ;退出系统
158         INT    21H 
159 CODE    ENDS
160         END START
复制代码

耐心看看就行了,不是很难,栈的第一个参数是从bp+2开始的,别搞错了。
此为MASM语言格式汇编程序,链接成功后生成相应exe文件,打开即有如下执行效果..

============================此为原创文章,转载请注明。谢谢。======================================

出  处:https://www.cnblogs.com/imwtr/p/4105160.html


相关教程