質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

Q&A

解決済

1回答

1287閲覧

Mipsで配列の領域の動的確保の方法がわからない。また、エラーの箇所が分からない。

aoba-purines

総合スコア13

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

0グッド

0クリップ

投稿2022/07/04 05:02

次のmipsを用いる課題について質問があります。

入力された複数の整数値を入力と逆順に出力するプログラムをサブルーチンを用いずに作成せよ。このとき、最大値および最小値を出力する際はそれぞれ "(max)"、"(min)" の注釈を合わせて出力すること。入力の終端は0の入力で表すものとする(0は入力値とは見なさない)。入力値の個数は不明であり、必要に応じてスタック上に領域を確保して記憶すること。少なくとも1つ以上の有効な入力値があると仮定してよい(最初の入力が0であることに配慮する必要はない)。
あらかじめN(N>0)個分のデータ領域を確保するような実装はN+1個目の入力に対応できないので不適切なプログラムである。

(1)入力が1つの場合、(2)入力が2つの場合、(3)入力が十分多数の場合、いずれの場合も正しく動作すること。

入力の1つが最大値かつ最小値の場合、複数の入力が最大値かつ最小値の場合、"(max)"と"(min)"の注釈を併記すること。

例) 2, -1, 5, 4, -2, 3, 0 を入力した場合の端末の表示 ("0"までが入力。次の行以降が出力)。 2 -1 5 4 -2 3 0 3 -2 (min) 4 5 (max) -1 2 例) -3, 0 を入力した場合の端末の表示 ("0"までが入力。次の行以降が出力)。 (spim) run -3 0 -3 (max) (min) 例) 1, 1, 0 を入力した場合の端末の表示 ("0"までが入力。次の行以降が出力)。 (spim) run 1 1 0 1 (max) (min) 1 (max) (min)

条件にあるような、配列の動的確保の方法がわかりません。また配列の要素数を今回は仮に5として以下のようなプログラムを実行したのですが、

.data to: .space 5 nl: .asciiz "\n" max: .asciiz "(max)" min: .asciiz "(min)" .text .globl main main: addi $sp, $sp, -4 sw $ra, 0($sp) la $t0, to li $t1, 1 li $v0, 5 syscall move $t2, $v0 move $t3, $v0 sb $v0, 0($t0) addi $t0, $t0, 4 loop: li $v0, 5 syscall beq $v0, $zero, return sb $v0, 0($t0) addi $t0, $t0, 4 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, -4 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, 4 jr $ra
(spim) run 2 3 0 695755117 671091203

となってしまいます。この解決方法をどうか教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

条件にあるような、配列の動的確保の方法がわかりません。

配列用の領域をスタックのトップに置いて、サイズが増えるときにスタックポインタを必要なだけ減らしましょう。

ぱっと見で気づいたところを:

syscall で破壊されるレジスタを把握していますか?

to: .space 5

5で足りますか?

sb $v0, 0($t0) addi $t0, $t0, 4

ここで8ビットの値を $t0 のアドレスに書き込んでいますが、$t0 のアドレスを1ではなく4進めています。これでいいんでしょうか。

lw $a0, 0($t0)

初めてこの行を実行するとき、0($t0) はどこを指しているかよく考えてください。
さきほどは8ビットの値を書いたのに、ここでは32ビットの値を読んでます。

投稿2022/07/04 05:26

int32_t

総合スコア21927

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問