1

我试图将十个数字平均输入到一个数组中。我在add $a2, $a2, $a1.

不知道我做错了什么。帮助将不胜感激。

另外,我尝试将限制切换为 2 个整数,因为它不会很快溢出。它将地址加在一起,而不是整数。这是我对为什么它不断溢出的猜测。不过,我如何将地址更改为整数?

这是我的代码。

.data
  nums:
    .word   0,0,0,0,0,0,0,0,0,0
  prompt:
    .asciiz  "Please enter 10 positive integers:\n"
  avg:
    .asciiz "Avg = "
  result:
    .asciiz "      "

.text
.globl main
  main:
li      $v0, 4
la      $a0, prompt
syscall

li  $t1, 10
la  $a1, nums

getnums:  
addi    $t1, $t1, -1  
li  $v0, 5  
syscall

sw      $v0, ($a1)
addi    $a1, $a1, 4
bnez    $t1, getnums

#avg  
move    $a2, $zero  
move    $t0, $zero
addi    $a1, $a1, -4    
getavg:   
lw  $t0, 0($a1)  
addi    $t1, $t1, 1       
add $a2, $a2, $t0   #arithmetic overflow      
addi    $a1, $a1, -4  
bne     $t1, 10, getavg  

li      $v0, 4
la      $a0, avg
div $a2, $a2, 10 
syscall

la  $a0, ($a2) 
li  $v0, 1
syscall

li  $v0, 10
syscall

(编辑以修复代码格式 - RobertB)

4

1 回答 1

0

看起来您正在$a1用作指向内存中当前单词的指针。但是当你这样做时add $a2, $a2, $a1,你添加的是寄存器 $a1的内容,而不是它指向的内存地址的内容。在遇到溢出之前,将 32 位内存地址值添加到自身不会花费很多周期。

缺少的链接是加载字指令,它将获取内存位置的内容:

lw $t0, 0($a1)

这会将 ,指向的内存位置的内容加载$a1$t0.

于 2013-11-13T20:42:27.243 回答