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

MIPS数组值打印程序运行异常 求错误原因及解决方法

MIPS汇编程序错误修复

你遇到的问题和$t0的使用无关,是系统调用参数、寄存器未初始化、数组基地址未关联的问题,核心错误如下:

  • 系统调用参数错误:MIPS打印字符串的syscall 4要求字符串地址必须存放在$a0寄存器,你打印str2、str3、str4时分别用了$a1、$a2、$a3,不符合调用规范;打印整数的syscall 1要求待打印数值必须存放在$a0,你的代码没有做对应赋值。
  • 数组访问未加基地址:你已经把A数组基地址存到$t2、B数组基地址存到$t3,但计算偏移后没有和基地址相加就直接取数,相当于访问了随机内存地址,必然触发段错误。
  • 未初始化寄存器滥用:代码中使用的$s5、$s6、$s7全程没有赋值,存储的是随机垃圾值,所有涉及这些寄存器的运算结果全错。
  • 运算结果被覆盖:第一个计算结果B[h]-g存到$s0后,没有做备份就被第二个运算的结果覆盖,打印时无法取到第一个结果的值。

修正后的完整代码

.globl main
.data
A:  .word 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
B:  .word 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

str1:.asciiz "Please, type a number for g:"
str2:.asciiz "Please, type a number for h:"
str3:.asciiz "The 1st result is:"
str4:.asciiz "\nThe 2nd result is:"

.text
main:
# 输入g
li $v0,4  
la $a0,str1 
syscall
li $v0, 5 
syscall
move $s1, $v0 # $s1 = g 

# 输入h
li $v0,4  
la $a0,str2 
syscall
li $v0, 5
syscall
move $s2, $v0 # $s2 = h 

la $t2, A # A数组基地址
la $t3, B # B数组基地址

# 计算第一个结果:B[h] - g
sll $t0,$s2,2 # 计算h的偏移:4*h
add $t0,$t0,$t3 # 加上B数组基地址,得到B[h]的物理地址
lw $t0,0($t0) # 取B[h]的值
sub $s3, $t0, $s1 # 保存第一个结果到$s3:B[h] - g

# 计算第二个结果:A[B[g]+1]
sll $t1,$s1,2 # 计算g的偏移:4*g
add $t1,$t1,$t3 # 加上B数组基地址,得到B[g]的物理地址
lw $t1,0($t1) # 取B[g]的值
addi $t1,$t1,1 # 得到B[g]+1的索引
sll $t1,$t1,2 # 计算对应偏移
add $t1,$t1,$t2 # 加上A数组基地址,得到A[B[g]+1]的物理地址
lw $s4,0($t1) # 保存第二个结果到$s4

# 打印第一个结果
li $v0,4  
la $a0,str3 
syscall
li $v0,1 
move $a0, $s3 # 把第一个结果放到$a0
syscall

# 打印第二个结果
li $v0,4  
la $a0,str4 
syscall
li $v0,1 
move $a0, $s4 # 把第二个结果放到$a0
syscall

li $v0,10
syscall

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:06:06