You need to enable JavaScript to run this app. MIPS汇编双进制回文数查找时数组0值变1异常排查
优惠活动
大模型
产品
解决方案
定价
更多

MIPS汇编双进制回文数查找时数组0值变1异常排查

根因分析

核心异常原因是数组空间分配错误:
你代码中写的array: .byte 32、array2: .byte 32的作用是分配1字节内存、存储值为32,并不是你预期的分配32字节长度的数组。两个数组实际仅各占1字节,后续写入除基取余的结果时直接越界访问相邻内存,数据互相覆盖,就会出现存入值为0、读取后变成1的异常。
另外存在多个次要逻辑隐患:

  • isPalindrome分支返回逻辑错误:十进制/二进制回文判断通过后,跳回isPalindrome入口执行的move $a2, $t5是无意义操作,存在返回逻辑异常隐患。
  • 使用s0寄存器未做入栈保存:MIPS调用约定中s系列寄存器属于被调用者保存寄存器,直接修改会破坏上层函数的上下文。

修复方案

  1. 修正数组空间分配,将原数组定义替换为以下内容:
array: .space 32
array2: .space 32

.space 32的作用是连续分配32字节未初始化内存,完全匹配你定义32字节数组的需求。
2. 补全s0寄存器的上下文保存逻辑,在checkBin入口处将s0入栈,使用完成后出栈恢复:

checkBin:
    addi $sp, $sp, -4
    sw $s0, 0($sp)
    # 原有checkBin逻辑保持不变
    # ...
    # checkEquality判断结束、跳回isPalindrome之前添加恢复代码
    lw $s0, 0($sp)
    addi $sp, $sp, 4
    j isPalindrome
  1. 优化isPalindrome的返回逻辑,删除入口下的无用代码:
isPalindrome:
    beq $a1, 10, checkDec
    beq $a1, 2, checkBin
    jr $ra # 直接返回,删除原有li $t4, 0、move $a2, $t5两段无用代码

修复完成后即可解决内存越界导致的数值异常问题,回文判断逻辑也可正常运行。

内容的提问来源于stack exchange,提问作者evbrown

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 02:06:08