@aoba0526

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

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

No Answers yet.

Your answer might help someone💌