题意描述:  

用汇编语言实现汉诺塔。只需要显示移盘次序,不必显示所移盘的大小,例如: 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. 虚拟化 - Hyper-V

    不能和VMware.VirtualBox同时使用 网络 交换机其实就是指网卡,只不过是虚拟的 内部交换机 外部交换机

  2. WPF 新手引导

    参考了https://www.cnblogs.com/ZXdeveloper/p/8391864.html,自己随便实现了一个,记录下,比较丑 <Window x:Class="Use ...

  3. 加固apk的开发者最常面对的十种问题

    欢迎访问网易云社区,了解更多网易技术产品运营经验. 因为工信部对移动App应用安全过检要求日益增多,不加固大都达不到工信部的要求,同时开发者加固App大都是为了防止以下10个检测项出现问题,影响App ...

  4. Android TextView 嵌套图片及其点击,TextView 部分文字点击,文字多颜色

    1. TextView 中嵌套图片的方法 TextView textView... textView.setText("..."); textView.append(Html.fr ...

  5. 多个音频audio2

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. python全栈开发_day31_OSI七层协议和c/s架构

    一:OSI七层协议 应用层 =>表示层 =>会话层 =>传输层 =>网络层 =>数据链路层 =>物理连接层 二:c/s架构 b/s的本质也是c/s 手机端:好像cs ...

  7. leecode刷题(16)-- 字符串转换整数

    leecode刷题(16)-- 字符串转换整数 字符串转换整数 描述: 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格 ...

  8. jQuery入门讲解

    jQuery设计思想: (1)选择页面元素 css选择器: $(document) 选择整个文档对象, $("#myId") 选择id为myId的页面元素, $("div ...

  9. 技巧方法 - CentOS6将Python2.6.6升级到Python2.7.6

    1.首先使用“python -V”命令查看python版本,我们测试主机显示的是2.6.6版,于是下面就着手将python2.6.6升级到Python2.7.6.python -V #查看python ...

  10. 常用的re正则

    常用的正则表达式: 用户名:/^[a-z0-9_-]{3,16}$/ 密码:/^[a-z0-9_-]{6,18}$/ 十六进制值:/^#?([a-f0-9]{6}|[a-f0-9]{3})$/ 电子邮 ...