题意描述:  

用汇编语言实现汉诺塔。只需要显示移盘次序,不必显示所移盘的大小,例如: 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语言、实现--汉诺塔--的更多相关文章

  1. 用C语言实现汉诺塔自动递归演示程序

    用C语言实现汉诺塔自动递归演示程序 程序实现效果 1.变界面大小依照输入递归数改变. 2.汉诺塔自动移动演示. 3.采用gotoxy实现流畅刷新. 4.保留文字显示递归流程 程序展示及实现 githu ...

  2. 关于C语言解决汉诺塔(hanoi)问题

    C语言解决汉诺塔问题 汉诺塔是典型的递归调用问题: hanoi简介:印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣 ...

  3. 【C语言】汉诺塔问题

    之前遇见这个问题,非常费劲地理解了,并写出代码,然后过段时间,再遇见这个问题,又卡住了,如此反反复复两三次,才发现自己对递归的理解依然很肤浅.今天无聊,重温<算法:c语言实现>一书,又遇见 ...

  4. C语言 递归 汉诺塔问题 最大公约数问题

    函数不能嵌套定义,但能嵌套调用(在调用一个函数的过程中再调用另一个函数) 函数间接或直接调用自己,称为递归调用  汉诺塔问题 思想:简化为较为简单的问题 n=2 较为复杂的问题,采用数学归纳方法分析 ...

  5. C语言实现汉诺塔

    汉诺塔 要把A柱子上的盘子移动到C柱子上,在移动过程中可以借助B柱子,但是要求小的盘子在上大的盘子在下. 解题思路: 1.把A柱子上的前N-1个盘子借助C柱子,全部移动到B柱子上(过程暂不考虑),再把 ...

  6. 如何用Go语言实现汉诺塔算法

    package main import ( "fmt" ) func print(n int,x rune,y rune)(){ fmt.Printf("moving d ...

  7. C语言实现汉诺塔问题

    代码如下: #include <stdio.h> #include <stdlib.h> void move(int n,char x,char y,char z) { ) { ...

  8. C语言解决汉诺塔问题!

    很难受,看了很多资料才明白..... 对这个问题分析,发现思路如下:有n个黄金盘,要先把n-1个弄到B柱上,再把第n个弄到C柱上,然后把n-1个借助A柱弄到C柱上. 实现的函数如下: void f(i ...

  9. 汉诺塔(河内塔)算法 ----C语言递归实现

    汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子, 在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺 ...

随机推荐

  1. .net 开发者尝试Apache Spark™

    本文编译自一篇msdn magazine的文章,原文标题和链接为: Test Run - Introduction to Spark for .NET Developers https://msdn. ...

  2. SQL Server—— 如何创建定时作业

    在做SQL server 管理时,往往需要每日执行定时任务,但是如果每天都去人工执行,非常不方便,而且一般定时操作,都应该是在数据库压力不大时,一般是在夜间.所以我们需要创建定时作业来代替人工的执行定 ...

  3. web api 请求结果中页面显示的json字符串与json对象结果不一致

    我在前端调用这个api的时候也是百思不得其解,明明看到页面上的结果ID是不一样的,但是在js中使用的时候,却一直有重复ID的情况 后来才发现原来是long这个类型的原因,JavaScript中Numb ...

  4. 跨域处理之Jsonp

    一.认识Jsonp JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式 ...

  5. Neutorn LBaaS 原理

    Load Balance as a Service(LBaaS)是 Neutron 提供的一项高级网络服务.LBaaS 允许租户在自己的网络中创建和管理 load balancer. load bal ...

  6. day05.2-一个文件的增删改查实例

    一. 测试程序   #INFO.txt源文件内容 global log 127.0.1 local2 daemon maxconn 256 log 127.0.0.1 local2 info defa ...

  7. Prim算法---最小生成树

    最小生成树的Prim算法也是贪心算法的一大经典应用.Prim算法的特点是时刻维护一棵树,算法不断加边,加的过程始终是一棵树. Prim算法过程: 一条边一条边地加, 维护一棵树. 初始 E = {}空 ...

  8. LOJ#6360. 复燃「恋之埋火」(最小圆覆盖+高斯消元)

    题面 传送门 题解 不难发现最小圆覆盖的随机增量法复杂度还是正确的 所以现在唯一的问题就是给定若干个点如何求一个\(m\)维的圆 其实就是这一题 //minamoto #include<bits ...

  9. VS中工程的“依赖”,“库目录”,“包含目录”

    写多了Vs中的工程,就会遇到很多环境配置问题,例如“依赖项”,“库目录”,“包含目录”等等等等. 今天要记录的就是这些的基本含义:我们拿一个例子来看,更加清晰易懂一些: 例如在Opencv3.0+VS ...

  10. linux互传文件nc命令

    使用nc命令可以很快的在两台主机传递文件,且不需要在同一网段,只要设置好端口即可. 一.安装(CentOS下) yum install -y nc  (需要root权限,可以用加上sudo) 二.使用 ...