Assembly 数据/堆栈读取中的MIPS错误地址
我花了好几个小时看这个,打印出地址,却弄不明白。这是一个通过QTSpim运行的简单汇编程序。该程序用于为大小为20的数组获取值,在数组中找到两个最小的整数,将它们相加并返回到main,然后将它们存储在数组后面的内存中 程序接收数组的20个值,然后尝试计算并在数据/堆栈读取中吐出错误地址:0x10040000。我的所有其他数据都在0x100xx内存位置,不知道为什么会出现40000Assembly 数据/堆栈读取中的MIPS错误地址,assembly,mips,spim,Assembly,Mips,Spim,我花了好几个小时看这个,打印出地址,却弄不明白。这是一个通过QTSpim运行的简单汇编程序。该程序用于为大小为20的数组获取值,在数组中找到两个最小的整数,将它们相加并返回到main,然后将它们存储在数组后面的内存中 程序接收数组的20个值,然后尝试计算并在数据/堆栈读取中吐出错误地址:0x10040000。我的所有其他数据都在0x100xx内存位置,不知道为什么会出现40000 .data Fresh: .space 80 freshSmallestSum: space 4 .text su
.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片段不接近,所以我没有抓住它。未来的几个小时由你的评论修正,谢谢!您应该始终测试实际发布的代码以获得调试帮助,特别是如果您是初学者。