Mipsで配列の領域の動的確保の方法がわからない。また、エラーの箇所が分からない。
解決したいこと
次のmipsの課題について質問があります。
入力された複数の整数値を入力と逆順に出力するプログラムをサブルーチンを用いずに作成せよ。このとき、最大値および最小値を出力する際はそれぞれ "(max)"、"(min)" の注釈を合わせて出力すること。入力の終端は0の入力で表すものとする(0は入力値とは見なさない)。入力値の個数は不明であり、必要に応じてスタック上に領域を確保して記憶すること。少なくとも1つ以上の有効な入力値があると仮定してよい(最初の入力が0であることに配慮する必要はない)。
あらかじめN(N>0)個分のデータ領域を確保するような実装はN+1個目の入力に対応できないので不適切なプログラムである。
(1)入力が1つの場合、(2)入力が2つの場合、(3)入力が十分多数の場合、いずれの場合も正しく動作すること。
入力の1つが最大値かつ最小値の場合、複数の入力が最大値かつ最小値の場合、"(max)"と"(min)"の注釈を併記すること。
この課題に対するプログラムを作成し、実行したのですが、エラーが出ました。syscallで破壊されると困るcaller-saveレジスタは確認した所ないので、スタックポインタと配列の領域の確保について問題があると思います。配列の領域の動的確保は、配列用の領域をスタックのトップに置いて、サイズが増えるときにスタックポインタを必要なだけ減らせば良いことは大まかにわかりますが、プログラムを作るとなると難しく感じてしまいます。$t0はスタックポインタを用いた配列として機能していないでしょうか?具体的な解決策があれば教えてください。よろしくお願いします。
発生している問題・エラー
(spim) run
2
3
0
Exception occurred at PC=0x00400090
Unaligned address in inst/data fetch: 0x7ffffc06
Exception 4 [Address error in inst/data fetch] occurred and ignored
0
Exception occurred at PC=0x00400090
Unaligned address in inst/data fetch: 0x7ffffc05
Exception 4 [Address error in inst/data fetch] occurred and ignored
0
Exception occurred at PC=0x00000000
Bad address in text read: 0x00000000
Exception 6 [Bad instruction address] occurred and ignored
Exception occurred at PC=0x00000004
Bad address in text read: 0x00000004
Exception 6 [Bad instruction address] occurred and ignored
Exception occurred at PC=0x00000008
Bad address in text read: 0x00000008
Exception 6 [Bad instruction address] occurred and ignored
Exception occurred at PC=0x0000000c
該当するソースコード
.data
nl: .asciiz "\n"
max:.asciiz "(max)"
min:.asciiz "(min)"
.text
.globl main
main:
addi $sp, $sp, -20
sw $ra, 0($sp)
addi $t0, $sp, 4
li $t1, 1
li $v0, 5
syscall
move $t2, $v0
move $t3, $v0
sb $v0, 0($t0)
addi $sp, $sp, -4
addi $t0, $t0, 1
loop:
li $v0, 5
syscall
beq $v0, $zero, return
sb $v0, 0($t0)
addi $sp, $sp, -4
addi $t0, $t0, 1
addi $t1, $t1, 1
bgt $v0, $t2, remax
ble $v0, $t3, remin
j loop
remax:
move $t2, $v0
j loop
remin:
move $t3, $v0
j loop
return:
lw $a0, 0($t0)
li $v0, 1
syscall
addi $t0, $t0, -1
addi $t1, $t1, -1
beq $a0, $t2, MAX
beq $a0, $t3, MIN
la $a0, nl
li $v0, 4
syscall
beq $zero, $t1, end
j return
MAX:
la $a0, max
li $v0, 4
syscall
j return
MIN:
la $a0, min
li $v0, 4
syscall
j return
end:
lw $ra, 0($sp)
addi $sp, $sp, 20
jr $ra
0 likes