【发布时间】: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 部分并不接近,所以我没有抓住它。您的评论修复了未来的几个小时,谢谢!
-
您应该始终测试您实际发布的代码以获得调试帮助,尤其是如果您是初学者。