题意描述:  

用汇编语言实现汉诺塔。只需要显示移盘次序,不必显示所移盘的大小,例如: 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. ADO.NET批量添加数据到SQL Server—BulkCopy使用指南

    BulkCopy位于System.Data.SqlClient命名空间,允许你使用其他源的数据有效地批量加载 SQL Server 表. 属性: BatchSize :每个批处理中的行数. 在每个批处 ...

  2. cesium编程中级(二)源码编译

    cesium编程中级(二)源码编译 有些情况下,比如我们自己从Github下载了最新的代码,或者自己临时修改了一点代码,想要编译后的Build文件夹的内容,需要自行编译源码,这里介绍一下编译的方法 下 ...

  3. WPF带小箭头的按钮

    XAML代码: <ControlTemplate x:Key="btnTpl" TargetType="RadioButton"> <Stac ...

  4. jdk-7u40-windows-i586的安装

    1.预备知识: i586 指的是windows 32bit版本 Oracle.微软.IBM这些大佬们最“贵族”了-----他们都很喜欢 C盘 2.关键 JDK必须装在C盘目录下,才能在命令行下正确运行 ...

  5. kvm虚拟化存储池配置

    1.创建基于文件夹的存储池(目录) 2.定义存储池与其目录 # virsh pool-define-as vmdisk --type dir --target /data/vmfs 3.创建已定义的存 ...

  6. 【git】——简单用法

    git 更新远程代码到本地 git fetch origin master git merge origin/master 冲突: Your local changes to the followin ...

  7. [CISCO] VLAN、TRUNK 和 VTP 简介

    VLAN.TRUNK 和 VTP 简介 VLAN 如图,虚拟局域网 VLAN ( Virtual LAN ) 是交换机端口的逻辑组合. VLAN 工作在 OSI 的第 2 层(数据链路层),一个 VL ...

  8. Ubuntu下实现socks代理转http代理

    代理(英语:Proxy),也称网络代理,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接.一些网关.路由器等网络设备具备网络代理功能. ...

  9. json和csv文件存储

    一. json 1:基本概念 1.1 Json和Javascript JSON, 全称JavaScript Object Notation,它通过对象和数组的组合来表示数据.在JavaScript中一 ...

  10. 实例的初始化由JVM装载类的时候进行,保证了线程的安全性

    在23种设计模式中,单例是最简单的设计模式,但是也是很常用的设计模式.从单例的五种实现方式中我们可以看到程序员对性能的不懈追求.下面我将分析单例的五种实现方式的优缺点,并对其在多线程环境下的性能进行测 ...