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
相关产品推荐
相关产品推荐

