汇编语言、与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==){ //如果只有一个圆盘,直接将这个圆盘从one移到three
move(one,three);
}
else{ //如果大于一个圆盘
HANOI(n-,one,three,two); //首先将n-1个从one经过three移到two上,此时one上剩最大的一个圆盘
move(one,three); //将最大的圆盘从one移到three上
HANOI(n-,two,one,three); //之后将n-1个从two经过one移到three上,完成。
}
} // end of void
HANOI(,'X','Y','Z'); //即可5阶汉诺塔从X盘移到Z盘
递归操作仔细想想就可以了,这样栈的操作逐渐明朗,你就可以用汇编语言实现它了(通过bp栈指针的运算进栈push出栈pop就可以实现相应递归调用)。
汇编代码实现如下:
DATA SEGMENT
n db ?
msg db 0dh,0ah,'Enter the number you want : $'
msg1 db 0dh,0ah,'HANOI-MOVE Procedure with : $',0ah,0dh
to db '--->$'
count dw ; 5个一组输出显示
DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX LEA DX,msg
CALL intro
KEYIN:
MOV AH,01H ;字符输入并回显
INT 21H
MOV byte ptr[n],Al ;接收键入的n值 LEA DX,msg1
CALL intro
MOV DL,0ah
CALL DISPLAY MOV AL,byte ptr[n]
SUB AL,30H
CBW
MOV DX,AX
MOV AX,'X'
MOV BX,'Y'
MOV CX,'Z'
;MOV DX,[n] PUSH DX
PUSH CX
PUSH BX
PUSH AX CALL HANOI_MOVE
ADD SP, MOV DL,0ah
CALL DISPLAY
LEA DX,msg
CALL intro
JMP KEYIN GroupMake:
INC [count]
MOV AX,[count]
MOV BL, ;5 个一组
DIV BL
CMP AH,
JNE SPACE
MOV DL,0ah
CALL DISPLAY ;输出换行
JMP CLOSE
SPACE:
MOV DX,20H
CALL DISPLAY ;输出空格
CLOSE:
RET STEP: ;输出步骤号
MOV AX,[count] ;防止count多位数不正确输出--hexTOdec
MOV CX,
MOV BX,
DISP1:
MOV DX,
DIV BX
PUSH DX
INC CX
OR AX,AX
JNZ DISP1 MOV DL,5BH ; 输出显示[
CALL DISPLAY
DISP2:
POP DX
ADD DL,30H ; 输出显示对应十进制
CALL DISPLAY
LOOP DISP2 MOV DL,5DH ; 输出显示]
CALL DISPLAY
RET intro proc near ;提示语
MOV AH,09H
INT 21H
ret
intro endp DISPLAY proc near ;输出字符
MOV AH,02H
INT 21H
RET
DISPLAY endp HANOI_MOVE proc near
MOV BP,SP
MOV AX,[BP+]
CMP AX,
JG moreThanOne ;n 不等于1则跳转
CALL STEP
MOV DX,[BP+] ;取第一个值
CALL DISPLAY
LEA DX,to
CALL intro
MOV DX,[BP+] ;取第三个值
CALL DISPLAY
CALL GroupMake RET moreThanOne:
MOV AX,[BP+]
MOV BX,[BP+]
MOV CX,[BP+]
MOV DX,[BP+]
DEC DX ;n-1
PUSH DX
PUSH BX
PUSH CX
PUSH AX
CALL HANOI_MOVE ;递归一次,进行下一循环
ADD SP, MOV BP,SP
CALL STEP
MOV DX,[BP+] ;取第一个值
CALL DISPLAY
LEA DX,to
CALL intro
MOV DX,[BP+] ;取第三个值
CALL DISPLAY
CALL GroupMake MOV AX,[BP+]
MOV BX,[BP+]
MOV CX,[BP+]
MOV DX,[BP+]
DEC DX ;n-1
PUSH DX
PUSH CX
PUSH AX
PUSH BX
CALL HANOI_MOVE ;递归一次,进行下一循环
ADD SP, RET
HANOI_MOVE endp EXIT: MOV AH,4CH ;退出系统
INT 21H
CODE ENDS
END START
耐心看看就行了,不是很难,栈的第一个参数是从bp+2开始的,别搞错了。
此为MASM语言格式汇编程序,链接成功后生成相应exe文件,打开即有如下执行效果..
============================此为原创文章,转载请注明。谢谢。======================================
汇编语言、与C语言、实现--汉诺塔--的更多相关文章
- 用C语言实现汉诺塔自动递归演示程序
用C语言实现汉诺塔自动递归演示程序 程序实现效果 1.变界面大小依照输入递归数改变. 2.汉诺塔自动移动演示. 3.采用gotoxy实现流畅刷新. 4.保留文字显示递归流程 程序展示及实现 githu ...
- 关于C语言解决汉诺塔(hanoi)问题
C语言解决汉诺塔问题 汉诺塔是典型的递归调用问题: hanoi简介:印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣 ...
- 【C语言】汉诺塔问题
之前遇见这个问题,非常费劲地理解了,并写出代码,然后过段时间,再遇见这个问题,又卡住了,如此反反复复两三次,才发现自己对递归的理解依然很肤浅.今天无聊,重温<算法:c语言实现>一书,又遇见 ...
- C语言 递归 汉诺塔问题 最大公约数问题
函数不能嵌套定义,但能嵌套调用(在调用一个函数的过程中再调用另一个函数) 函数间接或直接调用自己,称为递归调用 汉诺塔问题 思想:简化为较为简单的问题 n=2 较为复杂的问题,采用数学归纳方法分析 ...
- C语言实现汉诺塔
汉诺塔 要把A柱子上的盘子移动到C柱子上,在移动过程中可以借助B柱子,但是要求小的盘子在上大的盘子在下. 解题思路: 1.把A柱子上的前N-1个盘子借助C柱子,全部移动到B柱子上(过程暂不考虑),再把 ...
- 如何用Go语言实现汉诺塔算法
package main import ( "fmt" ) func print(n int,x rune,y rune)(){ fmt.Printf("moving d ...
- C语言实现汉诺塔问题
代码如下: #include <stdio.h> #include <stdlib.h> void move(int n,char x,char y,char z) { ) { ...
- C语言解决汉诺塔问题!
很难受,看了很多资料才明白..... 对这个问题分析,发现思路如下:有n个黄金盘,要先把n-1个弄到B柱上,再把第n个弄到C柱上,然后把n-1个借助A柱弄到C柱上. 实现的函数如下: void f(i ...
- 汉诺塔(河内塔)算法 ----C语言递归实现
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子, 在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺 ...
随机推荐
- 虚拟化 - Hyper-V
不能和VMware.VirtualBox同时使用 网络 交换机其实就是指网卡,只不过是虚拟的 内部交换机 外部交换机
- WPF 新手引导
参考了https://www.cnblogs.com/ZXdeveloper/p/8391864.html,自己随便实现了一个,记录下,比较丑 <Window x:Class="Use ...
- 加固apk的开发者最常面对的十种问题
欢迎访问网易云社区,了解更多网易技术产品运营经验. 因为工信部对移动App应用安全过检要求日益增多,不加固大都达不到工信部的要求,同时开发者加固App大都是为了防止以下10个检测项出现问题,影响App ...
- Android TextView 嵌套图片及其点击,TextView 部分文字点击,文字多颜色
1. TextView 中嵌套图片的方法 TextView textView... textView.setText("..."); textView.append(Html.fr ...
- 多个音频audio2
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- python全栈开发_day31_OSI七层协议和c/s架构
一:OSI七层协议 应用层 =>表示层 =>会话层 =>传输层 =>网络层 =>数据链路层 =>物理连接层 二:c/s架构 b/s的本质也是c/s 手机端:好像cs ...
- leecode刷题(16)-- 字符串转换整数
leecode刷题(16)-- 字符串转换整数 字符串转换整数 描述: 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格 ...
- jQuery入门讲解
jQuery设计思想: (1)选择页面元素 css选择器: $(document) 选择整个文档对象, $("#myId") 选择id为myId的页面元素, $("div ...
- 技巧方法 - CentOS6将Python2.6.6升级到Python2.7.6
1.首先使用“python -V”命令查看python版本,我们测试主机显示的是2.6.6版,于是下面就着手将python2.6.6升级到Python2.7.6.python -V #查看python ...
- 常用的re正则
常用的正则表达式: 用户名:/^[a-z0-9_-]{3,16}$/ 密码:/^[a-z0-9_-]{6,18}$/ 十六进制值:/^#?([a-f0-9]{6}|[a-f0-9]{3})$/ 电子邮 ...