-1

この宿題の問題があります。

次のシーケンスを生成するプログラムを作成します。1、2、2、4、8、32、256、… ユーザーが選択した用語の数に応じて、配列に格納します。シーケンス内の各要素は、その前の 2 つの要素を乗算することによって計算できます。換言すれば、n番目のシーケンス番号Snは、方程式Sn=Sn-1×Sn-2によって計算される。

やってみたけど動かなかった

私のコード

^ ^

# UNTITLED PROGRAM

    .data   # Data declaration section
str1: .ascii "Please enter the number of terms to produce: "
arr: .space 40

    .text

main:       # Start of code section


li $v0, 4   # system call code for printing string = 4
la $a0, str1    # load address of string to be printed into $a0
syscall         # call operating system to perform print operation


li $v0, 5   # get ready to read in integers
syscall     # system waits for input
move $s0,$v0    # store the result of the read (returned in $v0) in num1


la $s1,arr
addi $t2,$zero,2    # i=2
addi $t0,$zero,1
add $t1,$t0,$t0
sw $t0,0($s1)
sw $t1,0($s1)

L1:
addi $t2,$t2,1       #i++
addi $s1,$s1,4
lw $t4,0($s1)        #A[i-1]
lw $t5,4($s1)
mul $t3,$t4,$t5
sw $t3,8($s1)
beq $t2,$s0,print 
j L1

print:
lw $t3,0($s1)
li $v0, 1   # system call code for print_int
move $a0, $t3   # integer to print
syscall     # print it
addi $s1,$s1,4
beq $t2,$s0,Exit 
j print


Exit:
li $v0, 10      # exits program
syscall




# END OF PROGRAM
4

1 に答える 1

4

MARS エラー メッセージ:

26 行目のエラー: 0x00400030 でのランタイム例外: ストア アドレスがワード境界 0x1001002d に配置されていません

エラー メッセージは、この命令で不正な (ワード アラインされていない) アドレスでメモリにアクセスしようとしていることを示しています。

sw $t0,0($s1)

このような問題が発生した場合は、デバッガを使用する必要があります。まず、例外がスローされる命令にブレークポイントを設定します。

brkpt

プログラムを実行し、ブレークポイントで停止したら、アクセスしようとしているアドレス ($s1 内) を確認します。268501037orであることがわかります。0x1001002dまた、7 で終わるため、単語境界ではありません。

regfile

$s1には正しい配列アドレスがありますが、データセグメントに配列を作成したときに、ワード境界で整列されたアドレスから始まると想定していると思います。これはそうではありません。これを解決するには、データを整列する必要があります。

    .data   # Data declaration section
str1: .ascii "Please enter the number of terms to produce: "
    .align 2
arr: .space 40
于 2012-04-15T23:21:39.380 に答える