虚位以待(AD)
虚位以待(AD)
首页 > 软件编程 > C/C++编程 > 汇编语言、与C语言、实现--汉诺塔--

汇编语言、与C语言、实现--汉诺塔--
类别:C/C++编程   作者:码皇   来源:互联网   点击:

imwtr汇编语言、与C语言、实现--汉诺塔--题意描述: 用汇编语言实现汉诺塔。只需要显示移盘次序,不必显示所移盘的大小,例如: X>Z,X>Y,Z>Y,X>Z, 。(n阶Hanoi塔问题)假设有三个分别命名为X、Y、Z的塔座
imwtr 汇编语言、与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==1){                          //如果只有一个圆盘,直接将这个圆盘从one移到three   move(one,three); }   else{                                 //如果大于一个圆盘   HANOI(n-1,one,three,two); //首先将n-1个从one经过three移到two上,此时one上剩最大的一个圆盘   move(one,three);               //将最大的圆盘从one移到three上   HANOI(n-1,two,one,three); //之后将n-1个从two经过one移到three上,完成。   }   }               // end of void   HANOI(5,'X','Y','Z');  //即可5阶汉诺塔从X盘移到Z盘     复制代码 递归操作仔细想想就可以了,这样栈的操作逐渐明朗,你就可以用汇编语言实现它了(通过bp栈指针的运算进栈push出栈pop就可以实现相应递归调用)。   汇编代码实现如下:   复制代码   1 DATA    SEGMENT   2         n db ?   3         msg db 0dh,0ah,'Enter the number you want : $'   4         msg1 db 0dh,0ah,'HANOI-MOVE Procedure with : $',0ah,0dh   5         to db '--->$'   6         count dw 0   ; 5个一组输出显示   7 DATA    ENDS   8    9 CODE    SEGMENT  10         ASSUME CS:CODE,DS:DATA  11 START:   12         MOV     AX,DATA  13         MOV     DS,AX  14           15         LEA DX,msg  16         CALL intro  17 KEYIN:          18         MOV AH,01H         ;字符输入并回显  19         INT 21H  20         MOV byte ptr[n],Al         ;接收键入的n值  21           22         LEA DX,msg1  23         CALL intro  24         MOV DL,0ah  25         CALL DISPLAY  26           27         MOV AL,byte ptr[n]  28         SUB AL,30H  29         CBW  30         MOV DX,AX  31         MOV AX,'X'  32         MOV BX,'Y'  33         MOV CX,'Z'  34         ;MOV DX,[n]  35           36         PUSH DX  37         PUSH CX  38         PUSH BX  39         PUSH AX  40           41         CALL HANOI_MOVE  42         ADD SP,8  43           44         MOV DL,0ah  45         CALL DISPLAY  46         LEA DX,msg  47         CALL intro  48         JMP KEYIN  49           50 GroupMake:  51         INC [count]  52         MOV AX,[count]  53         MOV BL,5           ;5 个一组  54         DIV BL  55         CMP AH,0  56         JNE SPACE  57         MOV DL,0ah  58         CALL DISPLAY        ;输出换行         59         JMP CLOSE  60     SPACE:  61         MOV DX,20H  62         CALL DISPLAY        ;输出空格  63     CLOSE:  64           RET  65   66 STEP:     ;输出步骤号  67         MOV AX,[count]  ;防止count多位数不正确输出--hexTOdec  68         MOV CX,0  69         MOV BX,10  70 DISP1:  71         MOV DX,0  72         DIV BX  73         PUSH DX  74         INC CX  75         OR AX,AX  76         JNZ DISP1      77           78         MOV DL,5BH    ; 输出显示[  79         CALL DISPLAY              80 DISP2:    81         POP DX  82         ADD DL,30H    ; 输出显示对应十进制  83         CALL DISPLAY      84         LOOP DISP2     85           86         MOV DL,5DH    ; 输出显示]  87         CALL DISPLAY  88         RET          89           90 intro proc near          ;提示语  91          MOV AH,09H  92          INT 21H  93          ret  94 intro endp  95        96 DISPLAY proc near        ;输出字符  97         MOV AH,02H  98         INT 21H  99         RET 100 DISPLAY endp 101        102 HANOI_MOVE proc near 103         MOV BP,SP 104         MOV AX,[BP+8] 105         CMP AX,1 106         JG moreThanOne    ;n 不等于1则跳转 107         CALL STEP 108         MOV DX,[BP+2]     ;取第一个值 109         CALL DISPLAY 110         LEA DX,to            111         CALL intro 112         MOV DX,[BP+6]     ;取第三个值 113         CALL DISPLAY     114         CALL GroupMake 115          116           RET 117  118  119 moreThanOne: 120         MOV AX,[BP+2] 121         MOV BX,[BP+4] 122         MOV CX,[BP+6] 123         MOV DX,[BP+8] 124         DEC DX              ;n-1 125         PUSH DX 126         PUSH BX 127         PUSH CX 128         PUSH AX 129         CALL HANOI_MOVE      ;递归一次,进行下一循环 130         ADD SP,8 131          132         MOV BP,SP 133         CALL STEP 134         MOV DX,[BP+2]     ;取第一个值 135         CALL DISPLAY 136         LEA DX,to            137         CALL intro 138         MOV DX,[BP+6]     ;取第三个值 139         CALL DISPLAY     140         CALL GroupMake 141          142         MOV AX,[BP+2] 143         MOV BX,[BP+4] 144         MOV CX,[BP+6] 145         MOV DX,[BP+8]   146         DEC DX              ;n-1 147         PUSH DX 148         PUSH CX 149         PUSH AX 150         PUSH BX 151         CALL HANOI_MOVE      ;递归一次,进行下一循环 152         ADD SP,8 153          154         RET 155 HANOI_MOVE endp 156  157 EXIT:   MOV     AH,4CH      ;退出系统 158         INT    21H  159 CODE    ENDS 160         END START 复制代码 耐心看看就行了,不是很难,栈的第一个参数是从bp+2开始的,别搞错了。
相关热词搜索: 语言