Assembly 数据/堆栈读取中的MIPS错误地址

Assembly 数据/堆栈读取中的MIPS错误地址,assembly,mips,spim,Assembly,Mips,Spim,我花了好几个小时看这个,打印出地址,却弄不明白。这是一个通过QTSpim运行的简单汇编程序。该程序用于为大小为20的数组获取值,在数组中找到两个最小的整数,将它们相加并返回到main,然后将它们存储在数组后面的内存中 程序接收数组的20个值,然后尝试计算并在数据/堆栈读取中吐出错误地址:0x10040000。我的所有其他数据都在0x100xx内存位置,不知道为什么会出现40000 .data Fresh: .space 80 freshSmallestSum: space 4 .text su

我花了好几个小时看这个,打印出地址,却弄不明白。这是一个通过QTSpim运行的简单汇编程序。该程序用于为大小为20的数组获取值,在数组中找到两个最小的整数,将它们相加并返回到main,然后将它们存储在数组后面的内存中

程序接收数组的20个值,然后尝试计算并在数据/堆栈读取中吐出错误地址:0x10040000。我的所有其他数据都在0x100xx内存位置,不知道为什么会出现40000

.data
Fresh: .space 80
freshSmallestSum: space 4

.text
sumMin:
    lw      $t2, 0($a0) # $t2 = smallest array[i]
    addi    $t4, $t0, 1 # $t4 = i + 1
    sll     $t4, $t4, 2 # $t4 = i * (2^2)
    add     $t4, $t4, $a0   # $t4 = absolute address array[i+1]
    lw      $t3, 0($t4) # $t3 = array[i+1]
    li      $t4, 2      # i = 2
    ble     $t2, $t3, loopSmall # if $t2 <= t3 jump
    move    $t9, $t2
    move    $t2, $t3
    move    $t3, $t9
loopSmall:
    bge     $t4, $t1, ret1
    sll     $t5, $t4, 2 # $t5 = i * (2^2)
    add     $t5, $t5, $a0   # absolute address array[i]
    lw      $t5, 0($t5) # $t5 = array[i]
    ble     $t3, $t5, next2 # if $t3 <= array[i], jump
    move    $t3, $t5    # else $t3 = array[i]
    ble     $t2, $t3, next2 # if $t2 <= $t3, jump
    move    $t9, $t2    # else swap two smallest
    move    $t2, $t3
    move    $t3, $t9
next2:
    addi    $t4, $t4, 1 # i++
    j   loopSmall
ret1:
    add     $v0, $t2, $t3   # $v0 = smallest + secondSmallest
    jr      $ra

.text
.globl main
main: 
    li      $t3, 0
    li      $t0, 0      # i = 0
    li      $t1, 20     # $t1 = 20
    la      $s2, Fresh

inLoop: 
    bge $t3, $t1, next  # If $t3 > array length, jump
    sll     $t2, $t3, 2
    add     $t4, $t2, $s2   # Absolute address of fresh
    li      $v0, 5
    syscall
    sw      $v0, 0($t4)
    addi    $t3, $t3, 1 # Increment counter
    j       inLoop      
move        $a0, $s2    # $a0 = address Fresh
    jal     sumMax      # Get max sum of Fresh
    la      $t1, freshLargestSum
    sw      $v0, 0($t1) # Store sum in freshLargestSum

    move    $a0, $s2
    jal     sumMin      # Get min sum of Fresh
    la      $t1, freshSmallestSum
    sw      $v0, 0($t1) # Store sum in freshSmallestSum

exit:       li  $v0, 10
    syscall

这里的大部分代码看起来很棒,但这不是完整的文件

您的sumMin函数似乎希望数组大小为t1,但它给出的是freshLargestSum地址

你试过逐行逐行地检查代码吗? 特别是对于MIPS,大多数错误通常会覆盖我们以后在代码中需要的寄存器;尤其是当我们向后跳的时候

良好的调试技术还包括测试所有功能是否独立地按预期工作;如果是这样,您知道错误存在于主代码中;这可能与:

覆盖寄存器 日航到错地方了 覆盖返回寄存器 错误逻辑
希望这能帮助你解决你的问题

使用模拟器单步执行代码,并查看哪条指令出错。然后检查寄存器值并找出哪个是坏的,然后向后看它是如何得到坏值的。PS:我甚至找不到下一个标签,复制粘贴错误或者你真的没有它?此外,sumMin似乎期望数组大小为$t1,但此时包含freshLargestSum的地址。抱歉-肯定是复制粘贴错误-程序比此代码段长得多。试图只切割相关的部分。而$t1就是错误!非常感谢-在代码中,很少的寄存器更改与sumMin片段不接近,所以我没有抓住它。未来的几个小时由你的评论修正,谢谢!您应该始终测试实际发布的代码以获得调试帮助,特别是如果您是初学者。