このコードが浮動小数点数の格納時に例外を発生させる理由。私は問題を理解することができません。コードは次のとおりです。
li $t1,0
Loop:
add $t0,$t1,$s0
li $v0,6
syscall
mov.s $f1,$f0
swc1 $f1,0($t0)
addi $t1,$t1,4
beq $t1,20,Mult
j Loop
このコードが浮動小数点数の格納時に例外を発生させる理由。私は問題を理解することができません。コードは次のとおりです。
li $t1,0
Loop:
add $t0,$t1,$s0
li $v0,6
syscall
mov.s $f1,$f0
swc1 $f1,0($t0)
addi $t1,$t1,4
beq $t1,20,Mult
j Loop
おそらく unalignment exception execution が発生していますswc1 $f1,0($t0)
。この命令swc1
では、2 番目の引数が、ワード境界に位置合わせされた有効なメモリ アドレスである必要があります。これは、この有効なメモリ アドレス (この場合は に格納されているアドレス) の最下位 2 ビット$t0
がゼロである必要があることを意味します。
$s0
あなたが投稿したコードは、2つの最下位ビットのうち少なくとも1つが1である可能性が高い初期化を示していません。
コードを修正するに$s0
は、これらのビットが 0 で始まることを確認して、で使用される実効メモリ アドレスswc1
がワード アラインされるようにします。
の初期化$s0
が完了した場合、データを格納するバッファを宣言するときにディレクティブla $s0, label
を使用することができます。たとえば、次のようになります。.align 2
label: .align 2
.space ...