MIPS汇编双进制回文数查找时数组0值变1异常排查
根因分析
核心异常原因是数组空间分配错误:
你代码中写的array: .byte 32、array2: .byte 32的作用是分配1字节内存、存储值为32,并不是你预期的分配32字节长度的数组。两个数组实际仅各占1字节,后续写入除基取余的结果时直接越界访问相邻内存,数据互相覆盖,就会出现存入值为0、读取后变成1的异常。
另外存在多个次要逻辑隐患:
isPalindrome分支返回逻辑错误:十进制/二进制回文判断通过后,跳回isPalindrome入口执行的move $a2, $t5是无意义操作,存在返回逻辑异常隐患。- 使用
s0寄存器未做入栈保存:MIPS调用约定中s系列寄存器属于被调用者保存寄存器,直接修改会破坏上层函数的上下文。
修复方案
- 修正数组空间分配,将原数组定义替换为以下内容:
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
- 优化
isPalindrome的返回逻辑,删除入口下的无用代码:
isPalindrome: beq $a1, 10, checkDec beq $a1, 2, checkBin jr $ra # 直接返回,删除原有li $t4, 0、move $a2, $t5两段无用代码
修复完成后即可解决内存越界导致的数值异常问题,回文判断逻辑也可正常运行。
内容的提问来源于stack exchange,提问作者evbrown
相关产品推荐
相关产品推荐

