题意描述:  

用汇编语言实现汉诺塔。只需要显示移盘次序,不必显示所移盘的大小,例如: 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. Asp.NetCore取配置信息

    本文简单介绍Asp.NetCore取自定义配置信息的方法,要取配置信息首先得有配置文件. 1, 本例新建了一个TimeOut.json配置文件,和其对应的一个TimeOut类 2, 首先在Startu ...

  2. Pi 实现VLC网络视频监控

    安装摄像头 将Pi的原装摄像头安装在pi上面 ssh连接pi 通过xshell或者putty等工具连接ssh 安装VLC $ sudo apt-get update $ sudo apt-get in ...

  3. Android intent 传值不更新的原因和解决办法

    当 Activity 的启动模式是 singleTask 或者 singleInstance 的时候.如果使用了 intent 传值,则可能出现 intent 的值无法更新的问题.也就是说每次 int ...

  4. ASPNETPager常用属性(近来用到分页属性)

    ASPNETPager常用属性 建议去封装好,然后调用这样比较容易 <webdiyer:aspnetpager id="AspNetPager1" runat="s ...

  5. Elasticsearch(八)【NEST高级客户端--Mapping映射】

    要使用NEST与Elasticsearch进行交互,我们需要能够将我们的解决方案中的POCO类型映射到存储在Elasticsearch中的反向索引中的JSON文档和字段.本节介绍NEST中可用的所有不 ...

  6. multiprocessor(中)

    一.进程同步(锁) 通过之前的学习,我们千方百计实现了程序的异步,让多个任务可以同时在几个进程中并发处理,他们之间的运行没有顺序,一旦开启也不受我们控制.尽管并发编程让我们能更加充分的利用IO资源,但 ...

  7. day01 --class --home

    # 1.简述变量命名规范# 2.name = input(“>>>”) name变量是什么数据类型?# 3.if条件语句的基本结构? # 4.用print打印出下面内容:# ⽂能提笔 ...

  8. mysql 查询小技巧

    数据字段中存放的是id集,形如  1,2,15,35   也可类推json格式 查询时不用拆分了, 用上 instr.concat搜索和连接字符串 查询fids中包含15的 select * from ...

  9. shell-012:批量创建用户

    # #!/bin/bash # 批量创建用户 # 分析:用命令给用户创建密码的方法有两种 # . 可以直接用echo的方法 # echo "abc-123" |passwd roo ...

  10. python学习,day3:函数式编程,带参数

    # coding=utf-8 # Author: RyAn Bi def test(x,y,z): print(x) print(y) print(z) test(y=2,z =3,x=1) #形参与 ...