【发布时间】:2016-12-14 10:18:08
【问题描述】:
我想计算 MIPS 上列表的平均值。我已经尝试过隔离,如果我想打印总和或提示进行测试,它工作得非常好,但是当我把平均计算放回去时,它以某种方式给了我 size * 4 作为答案。我的汇编代码如下:
.data
size_prompt: .asciiz "Enter number of elements: "
element_prompt: .asciiz "Enter an element: "
size: .word 0
to_store: .word 0
sum: .word 0
avg: .word 0
.text
#Prints prompt
la $a0, size_prompt
addi $v0, $0, 4
syscall
#Gets input from user
addi $v0, $0, 5
syscall
sw $v0, size
addi $t0, $0, 0 #Initialise i = 0
#Creates the list
lw $s0, size
addi $t1, $0, 4
mult $s0, $t1
mflo $t2
add $a0, $t1, $t2
addi $v0, $0, 9
syscall
stack: beq $t0, $s0, list_sum
la $a0, element_prompt
addi $v0, $0, 4
syscall
addi $v0, $0, 5
syscall
sw $v0, to_store
lw $t5, to_store
addi $sp, $sp, -4
sw $t5, 0($sp)
addi $t0, $t0, 1
j stack
list_sum: beq $s0, 0, average
lw $t6, sum
lw $t7, 0($sp)
addi $sp, $sp, 4
add $t6, $t7, $t6
sw $t6, sum
addi $s0, $s0, -1
j list_sum
average: lw $t0, sum
div $t0, $s0
mflo $t0
sw $t0, avg
lw $a0, avg
addi $v0, $0, 1
syscall
【问题讨论】:
-
你的切入点是什么?我没有看到
main:,而且.text中的第一位代码根本没有标签。 -
@EOF 我的大学不知何故不需要我们这样做,它工作得很好。
-
@EOF:如果没有
_start标签,GNU 链接器默认将入口点设置为.text部分的开头。例如在 x86-64ld: warning: cannot find entry symbol _start; defaulting to 0000000008048060。所以我认为它在 MIPS 上是一样的。尽管如此,金伯利,.globl _start/_start:将是明确表达这一点的好习惯。 -
在调试器中单步执行循环时会看到什么?它通过循环的次数是否正确?如果您评论代码以在更高级别解释每个部分中发生的事情,这将是一个更好的问题。 (不过,至少它是可读的缩进并且有有用的标签名称,所以还不错。)添加有关您可以使用调试器找到的信息的信息对于可能会回答这个问题的人来说会缩小很多范围。
标签: assembly mips mars-simulator