【问题标题】:MIPS Bad address in data/stack readMIPS 数据/堆栈读取中的错误地址
【发布时间】:2017-11-09 01:46:37
【问题描述】:

我花了好几个小时看这个,打印出地址,但无法弄清楚。这是一个通过 QTSimp 运行的简单汇编程序。程序旨在获取大小为 20 的数组的值,在数组中找到两个最小的整数,将它们相加并返回给 main,然后将它们存储到数组之后的内存中。

程序接受数组的 20 个值,但随后尝试计算并吐出数据/堆栈读取中的错误地址:0x10040000。我所有的其他数据都在 0x100100XX 内存位置,不知道为什么会出现 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

【问题讨论】:

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

标签: assembly mips spim


【解决方案1】:

这里的大部分代码看起来都不错,但这不是完整的文件?

您的 sumMin 函数似乎希望数组大小为 t1,但它提供了一个新的LargestSum 地址?

您是否尝试过逐行浏览代码? 特别是对于 MIPS,大多数错误通常是覆盖我们稍后在代码中需要的寄存器;尤其是当我们跳回来的时候。

一个好的调试技术也是测试函数是否都按预期独立工作;如果是这样,您知道错误存在于主代码中;并且可能与:

  • 覆盖的寄存器
  • jal 去错地方了
  • 覆盖返回寄存器
  • 不正确的逻辑

希望这可以帮助您解决问题!

【讨论】:

    猜你喜欢
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2023-03-20
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多