You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求实现基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:04:07