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

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

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

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

Q&A

解決済

1回答

911閲覧

mipsでパスカルの三角形を計算して表示することができない。

aoba-purines

総合スコア13

アセンブリ言語

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

0グッド

0クリップ

投稿2022/06/12 09:29

Mipsによるプログラミングについて質問です。

階乗と組み合わせの数を計算するサブルーチンfactとcombi を作成し、これを用いてn個からr個を取り出す時の組合せnCrを計算できるようにする. これを利用してパスカルの三角形を計算するプログラム pascalTri.s を作成せよ。メインルーチンの処理は以下のようなものとする。

  1. 番号リスト リストパスカルの三角形の高さmをキーボードから読み込む.
  2. 番号リストmの値が0以下の場合は何も出力しない.
  3. 番号リストmの値が1以上の場合はパスカルの三角形を計算して表示する(表示例は以下参照).
  4. 番号リスト三角形の各段、各列に対応するnCrをサブルーチンcombiを呼び出して計算
  5. 番号リストm≦13に対応すればよい.

サブルーチンfact
【機能】引数$a0で指定された非負整数の階乗を求め、その値を$v0で返す。再帰計算ではなく,繰り返し計算を用いること。

サブルーチンcombi
【機能】引数$a0を n、引数$a1をrとした時の組合せの数nCrを上記のサブルーチンfactを用いて求め、その値を$v0で返す。

実行例

SPIM Version 8.0 of January 8, 2010 Copyright 1990-2010, James R. Larus. All Rights Reserved. See the file README for a full copyright notice. Loaded: /usr/lib/spim/exceptions.s (spim) load "pascalTri.s" spim) run m = -1 (spim) run m = 0 (spim) run m = 1 1 (spim) run m = 2 1 1 1 (spim) run m = 3 1 1 1 1 2 1 (spim) run m = 4 1 1 1 1 2 1 1 3 3 1 (spim) run m = 13 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 1 10 45 120 210 252 210 120 45 10 1 1 11 55 165 330 462 462 330 165 55 11 1 1 12 66 220 495 792 924 792 495 220 66 12 1

これに対し次のようにプログラム、実行したのですが、

newln: .asciiz "\n" .text .globl main main: addi $sp, $sp, -24 sw $ra, 0($sp) sw $s0, 4($sp) sw $s1, 8($sp) li $v0, 5 sw $a0, 12($sp) sw $a1, 16($sp) sw $v0, 20($sp) syscall lw $v0, 20($sp) lw $a1, 16($sp) lw $a0, 12($sp) blez $v0, zero move $a0, $v0 addi $s0, $a0, -1 move $s1, $zero move $a1, $zero loop: bgt $a1, $s1, case move $a0, $s1 sw $a0, 12($sp) sw $a1, 16($sp) sw $v0, 20($sp) jal combi lw $v0, 20($sp) lw $a1, 16($sp) lw $a0, 12($sp) move $a0, $v0 li $v0, 1 sw $a0, 12($sp) sw $a1, 16($sp) sw $v0, 20($sp) syscall lw $v0, 20($sp) lw $a1, 16($sp) lw $a0, 12($sp) addi $a1, $a1, 1 b loop case: bgt $s1, $s0, end li $v0, 4 la $a0, newln # 引数として改行の文字列データを指定 sw $a0, 12($sp) sw $a1, 16($sp) sw $v0, 20($sp) syscall lw $v0, 20($sp) lw $a1, 16($sp) lw $a0, 12($sp) addi $s1, $s1, 1 move $a1, $zero b loop zero: end: lw $s1, 8($sp) lw $s0, 4($sp) lw $ra, 0($sp) # 戻り先アドレスの復元 addi $sp, $sp, 24 # スタックに確保した領域の開放 jr $ra # ここから fact と combi の定義を書く fact: addi $sp, $sp, -12 sw $s0, 0($sp) sw $s1, 4($sp) sw $s2, 8($sp) move $s0, $a0 beq $s0, $zero, ZERO li $s1, 1 loop1: mul $s2, $s0, $s1 addi $s0, $s0, -1 move $s1, $s2 bne $s0, $zero, loop1 move $v0, $s1 b end1 ZERO: li $v0, 1 end1: lw $s2, 8($sp) lw $s1, 4($sp) lw $s0, 0($sp) add $sp, $sp, 12 jr $ra combi: addi $sp, $sp, -24 sw $ra, 0($sp) sw $s0, 0($sp) sw $s1, 4($sp) sw $s2, 8($sp) sw $a0, 12($sp) sw $a1, 16($sp) sw $v0, 20($sp) jal fact lw $v0, 20($sp) lw $a1, 16($sp) lw $a0, 12($sp) move $s0, $v0 sub $a0, $a0, $a1 sw $a0, 12($sp) sw $a1, 16($sp) sw $v0, 20($sp) jal fact lw $v0, 20($sp) lw $a1, 16($sp) lw $a0, 12($sp) move $s1, $v0 move $a0, $a1 sw $a0, 12($sp) sw $a1, 16($sp) sw $v0, 20($sp) jal fact lw $v0, 20($sp) lw $a1, 16($sp) lw $a0, 12($sp) move $s2, $v0 mul $s1, $s1, $s2 div $v0, $s0, $s1 lw $s2, 8($sp) lw $s1, 4($sp) lw $ra, 0($sp) addi $sp, $sp, 24 jr $ra
(spim) load "pascalTri.s" (spim) run 5 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 Bad address in text read: 0x0000000c Exception 6 [Bad instruction address] occurred and ignored Exception occurred at PC=0x00000010

となってしまい、上手くいきません。なぜうまくいかないのかわからないので、間違えているところの指摘をお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

combi: addi $sp, $sp, -24 sw $ra, 0($sp) sw $s0, 0($sp)

$ra を保存した場所に $s0 で上書きしてます。これが原因で $ra を復帰できていないのでしょう。

実際の実行ログより「PCが0近くというおかしな値になっているということは、ジャンプや $ra の処理に問題がありそうだ」と推測ができますので、そのあたりのコードを調べて上の問題を見つけました。

投稿2022/06/12 22:06

編集2022/06/12 23:20
int32_t

総合スコア20832

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問