请求实现基于MIPS汇编的汉诺塔算法(杆标识为A/B/C)
把MIPS汉诺塔的数字杆改成A/B/C标识的实现方案
你已经把汉诺塔的核心递归逻辑跑通了,就差把数字杆换成字母标识这一步对吧?我帮你调整了代码,直接就能输出你想要的A>C A>B C>B...这种格式的移动序列,下面是完整代码和关键修改点的说明:
完整修改后的代码
.data NewLine: .asciiz "\n" To: .asciiz ">" Space: .asciiz " " # 用于分隔移动步骤 A: .asciiz "A" B: .asciiz "B" C: .asciiz "C" .globl main .text main: li $v0, 5 # 读取输入的圆盘数量 syscall move $a0, $v0 # $a0 = 圆盘数 li $a1, 1 # 源杆:1对应A li $a2, 3 # 目标杆:3对应C li $a3, 2 # 中间杆:2对应B jal hanoi # 调用汉诺塔递归函数 li $v0, 10 # 程序退出 syscall # 汉诺塔递归函数: # $a0 = 圆盘数量 # $a1 = 源杆编号 # $a2 = 目标杆编号 # $a3 = 中间杆编号 hanoi: addi $sp, $sp, -20 # 栈帧:保存返回地址+4个寄存器 sw $ra, 16($sp) sw $a0, 12($sp) sw $a1, 8($sp) sw $a2, 4($sp) sw $a3, 0($sp) li $t0, 1 bgt $a0, $t0, recursive_case # 圆盘数>1时进入递归 # 基准情况:移动1个圆盘,输出移动步骤 move $a0, $a1 jal print_rod # 输出源杆字母 la $a0, To li $v0, 4 syscall # 输出">" move $a0, $a2 jal print_rod # 输出目标杆字母 la $a0, Space li $v0, 4 syscall # 输出空格分隔 j hanoi_exit recursive_case: # 第一步:把n-1个圆盘从源杆移到中间杆,目标杆当中间 lw $a0, 12($sp) addi $a0, $a0, -1 lw $a1, 8($sp) lw $a3, 4($sp) lw $a2, 0($sp) jal hanoi # 第二步:移动第n个圆盘,输出步骤 lw $a0, 8($sp) jal print_rod la $a0, To li $v0, 4 syscall lw $a0, 4($sp) jal print_rod la $a0, Space li $v0, 4 syscall # 第三步:把n-1个圆盘从中间杆移到目标杆,源杆当中间 lw $a0, 12($sp) addi $a0, $a0, -1 lw $a1, 0($sp) lw $a2, 4($sp) lw $a3, 8($sp) jal hanoi hanoi_exit: lw $ra, 16($sp) addi $sp, $sp, 20 # 释放栈帧 jr $ra # 辅助函数:根据杆编号输出对应字母 # $a0 = 杆编号(1=A,2=B,3=C) print_rod: li $t0, 1 beq $a0, $t0, print_A li $t0, 2 beq $a0, $t0, print_B li $t0, 3 beq $a0, $t0, print_C print_A: la $a0, A li $v0, 4 syscall jr $ra print_B: la $a0, B li $v0, 4 syscall jr $ra print_C: la $a0, C li $v0, 4 syscall jr $ra
关键修改点说明
- 新增数据段内容:在
.data里加了A/B/C三个字母字符串,还有用来分隔步骤的空格字符串,确保输出格式和你给的示例一致。 - 新增
print_rod辅助函数:这个小函数负责把数字1/2/3映射成对应的字母输出,替换了你原来直接输出数字的逻辑。 - 调整输出逻辑:在递归的基准情况和第二步移动中,不再输出数字,而是调用
print_rod输出字母,再配合To(">")和Space(空格)来拼接成X>Y的格式。
当你输入3的时候,程序会输出:A>C A>B C>B A>C B>A B>C A>C,完全符合你的要求~
内容的提问来源于stack exchange,提问作者Itay4
相关产品推荐
相关产品推荐

