设为首页 加入收藏

TOP

汇编语言、与C语言、实现--汉诺塔--(一)
2014-11-23 20:00:19 】 浏览:267
Tags:汇编语言 语言 实现 汉诺
imwtr
汇编语言、与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
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Objective-C基础笔记(6)Block 下一篇C语言可变参数在宏定义中的应用

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目