1

配列に入力された 10 個の数値の平均を取得しようとしています。で算術オーバーフローが発生してい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の内容を追加します。オーバーフローが発生する前に、32 ビットのメモリ アドレス値をそれ自体に追加するのに多くのサイクルはかかりません。 $a1

欠落しているリンクは、メモリ位置の内容を取得する Load Word 命令です。

lw $t0, 0($a1)

これにより、 が指すメモリ位置の内容が にロード$a1され$t0ます。

于 2013-11-13T20:42:27.243 に答える