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

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

新規登録して質問してみよう
ただいま回答率
85.37%
MIPS

MIPSは、コンピュータの処理速度を表す単語。1MIPSは、1秒間に100万命令実行であることを表します。CPU/MPUなどのプロセッサの性能を反映するため、プロセッサの性能指標としても用いられます。

Q&A

2回答

539閲覧

プログラムのエラーの解決法がわからない。

退会済みユーザー

退会済みユーザー

総合スコア0

MIPS

MIPSは、コンピュータの処理速度を表す単語。1MIPSは、1秒間に100万命令実行であることを表します。CPU/MPUなどのプロセッサの性能を反映するため、プロセッサの性能指標としても用いられます。

0グッド

0クリップ

投稿2023/06/22 06:09

実現したいこと

2進数にするmipsプログラムを作る

前提

binary関数のみを書き換えることで正常に動くプログラムにする。

発生している問題・エラーメッセージ

Memory address out of bounds

該当のソースコード

MIPS

1 2 3 .data 4a: .space 10 5zero: .asciiz "0" 6one: .asciiz "1" 7sp: .asciiz " " 8nl: .asciiz "\n" 9 .text 10 .globl main 11main: 12 add $sp, $sp, -36 13 sw $ra, 0($sp) 14 sw $s0, 4($sp) 15 sw $s1, 8($sp) 16 sw $s2, 12($sp) 17 sw $s3, 16($sp) 18 sw $s4, 20($sp) 19 sw $s5, 24($sp) 20 sw $s6, 28($sp) 21 sw $s7, 32($sp) 22 23 li $s0, 19 24 li $s1, 17 25 li $s2, 13 26 li $s3, 11 27 li $s4, 7 28 li $s5, 5 29 li $s6, 3 30 li $s7, 2 31 32 # 下記で0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111<改行>と表示されればOK 33 li $t0, 0 34loop_main: 35 bge $t0, 16, exit_main 36 la $a0, a 37 move $a1, $t0 38 sw $t0, 4($sp) 39 jal binary 40 lw $t0, 4($sp) 41 move $a0, $v0 42 li $v0, 4 43 syscall 44 la $a0, sp 45 syscall 46 add $t0, $t0, 1 47 j loop_main 48exit_main: 49 li $v0, 4 50 la $a0, nl 51 syscall 52 53 move $t0, $s0 54 mul $t0, $t0, $s1 55 mul $t0, $t0, $s2 56 mul $t0, $t0, $s3 57 mul $t0, $t0, $s4 58 mul $t0, $t0, $s5 59 mul $t0, $t0, $s6 60 mul $t0, $t0, $s7 61 sub $a0, $t0, 9699690 62 jal print_int # 最後に0<改行>が表示されれば恐らく$snの使用法ミスはなし($snの使用法チェックコードの実行結果) 63 64 lw $ra, 0($sp) 65 lw $s0, 4($sp) 66 lw $s1, 8($sp) 67 lw $s2, 12($sp) 68 lw $s3, 16($sp) 69 lw $s4, 20($sp) 70 lw $s5, 24($sp) 71 lw $s6, 28($sp) 72 lw $s7, 32($sp) 73 add $sp, $sp, 36 74 jr $ra 75 76strcpy: 77 move $v0, $a0 # 返値をここでセットしておく(スライド版との違い) 78strcpyloop: 79 lb $t0, 0($a1) 80 sb $t0, 0($a0) 81 addi $a1, $a1, 1 82 addi $a0, $a0, 1 83 bne $t0, 0, strcpyloop 84 jr $ra 85 86strlen: 87 move $v0, $zero 88strlenloop: 89 lb $t0, 0($a0) 90 beq $t0, $zero, strlenexit 91 add $v0, $v0, 1 92 add $a0, $a0, 1 93 j strlenloop 94strlenexit: 95 jr $ra 96 97strcat: 98 add $sp, $sp, -12 99 sw $ra, 0($sp) 100 sw $a0, 4($sp) 101 sw $a1, 8($sp) 102 jal strlen 103 lw $a0, 4($sp) 104 lw $a1, 8($sp) 105 add $a0, $a0, $v0 106 jal strcpy 107 lw $v0, 4($sp) 108 lw $ra, 0($sp) 109 add $sp, $sp, 12 110 jr $ra 111 112print_int: 113 li $v0, 1 114 syscall 115 li $v0, 4 116 la $a0, nl 117 syscall 118 jr $ra 119120 121 122binary: 123 addi $sp, $sp, -36 124 sw $ra, 0($sp) 125 sw $s0, 4($sp) 126 sw $s1, 8($sp) 127 sw $s2, 12($sp) 128 sw $s3, 16($sp) 129 sw $s4, 20($sp) 130 sw $s5, 24($sp) 131 sw $s6, 28($sp) 132 sw $s7, 32($sp) 133 134 135 move $t9, $a1 ## 136 137 #li $t9,0 138 # add $t9, $t9, $a1 139 140 141 142 143 loop: 144 li $t8, 0 #t0 == 0 145 li $t1, 0 146 li $t2, 0 147 addi $t1, $t1, 1 #t1 == 1 148 addi $t2, $t2, 2 #t2 == 2 149 150 151 beq $t9, $t8, if_z 152 beq $t9, $t1, if_z 153 div $t9, $t2 154 mflo $t3 #t3に2で割ったあまりを格納 155 mfhi $t7 156 move $t9, $t7 #商を格納 157 beq $t3, $t8, if_even 158 j if_odd 159 160 161 162 163 if_z: 164 la $t4, zero # "0" のアドレスを $t0 にロード 165 lb $t5, ($t4) # "0" の文字を $t2 にロード 166 sb $t5, ($a0) # $t2 の値 ("0") を配列の要素に格納 167 addiu $a0, $a0, 1 # 配列の次の要素に移動 168 169 j end 170 if_one: 171 la $t4, one # "1" のアドレスを $t4 にロード 172 lb $t5, ($t4) # "1" の文字を $t5 にロード 173 sb $t5, ($a0) # $t5 の値 ("1") を配列の要素に格納 174 addiu $a0, $a0, 1 # 配列の次の要素に移動 175 176 j end 177 178 if_even: 179 la $t4, zero # "0" のアドレスを $t4 にロード 180 lb $t5, ($t4) # "0" の文字を $t5 にロード 181 sb $t5, ($a0) # $t5 の値 ("0") を配列の要素に格納 182 addiu $a0, $a0, 1 # 配列の次の要素に移動 183 184 185 186 j loop 187 188 189 190 191 192 if_odd: 193 la $t4, one # "1" のアドレスを $t4 にロード 194 lb $t5, ($t4) # "1" の文字を $t5 にロード 195 sb $t5, ($a0) # $t5 の値 ("1") を配列の要素に格納 196 addiu $a0, $a0, 1 # 配列の次の要素に移動 197 198 199 200 j loop 201 202 203 204 205 end: 206 207 lw $ra, 0($sp) 208 lw $s0, 4($sp) 209 lw $s1, 8($sp) 210 lw $s2, 12($sp) 211 lw $s3, 16($sp) 212 lw $s4, 20($sp) 213 lw $s5, 24($sp) 214 lw $s6, 28($sp) 215 lw $s7, 32($sp) 216 add $sp, $sp, 36 217 jr $ra

試したこと

・バイト数の変更
・レジスタの取り方の変更
・スタック領域の大きさの変更

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

プログラムは機能が同じであれば冗長なものより短いほうがより良いとされるので下記のようなものを提案させていただきます。
なお、MIPSの行儀の良いプログラムは関数(サブルーティン)へのジャンプするとき引数は$a0~$a3を使うことが推奨されていますのでそうしました。

どこか適当なところに
li $a1, 43 # 変換する数
la $a0, a # array のアドレスを渡す
としてください。

binary:
addi $sp, $sp, -4 #-36
sw $ra, 0($sp)
# $s0~$s7は使用していないので削除
move $t9, $a1 #t9 = 被除数
li $t2,2 # 除数セット
loop:
div $t9, $t2
mflo $t9 # t9に2で割った商を格納
mfhi $t3 # 余り
addiu $t3, $t3, 48 # ascii code 変換
sb $t3, ($a0) # $t3 の値 (ascii code) を配列の要素に格納
addiu $a0, $a0, 1 # 配列の次の要素に移動

beq $t9, $0, end # 商 = 0? 計算終わり j loop

end:
add $sp, $sp, 4 #36
jr $ra

投稿2024/11/03 23:33

ajari

総合スコア18

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

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

0

この回答はGPT-4による自動生成回答です

以下の修正を行いました。

  1. binary関数の最後に、配列の終端にnull文字を追加しました。
  2. binary関数の最後に、$v0に返り値を設定しました。
  3. binary関数の最後に、スタックポインタを元に戻しました。

修正後のコードは以下の通りです。

MIPS

1binary: 2 addi $sp, $sp, -36 3 sw $ra, 0($sp) 4 sw $s0, 4($sp) 5 sw $s1, 8($sp) 6 sw $s2, 12($sp) 7 sw $s3, 16($sp) 8 sw $s4, 20($sp) 9 sw $s5, 24($sp) 10 sw $s6, 28($sp) 11 sw $s7, 32($sp) 12 13 move $t9, $a1 14 15 loop: 16 li $t8, 0 17 li $t1, 0 18 li $t2, 0 19 addi $t1, $t1, 1 20 addi $t2, $t2, 2 21 22 beq $t9, $t8, if_z 23 beq $t9, $t1, if_z 24 div $t9, $t2 25 mflo $t3 26 mfhi $t7 27 move $t9, $t7 28 beq $t3, $t8, if_even 29 j if_odd 30 31 if_z: 32 la $t4, zero 33 lb $t5, ($t4) 34 sb $t5, ($a0) 35 addiu $a0, $a0, 1 36 j end 37 if_one: 38 la $t4, one 39 lb $t5, ($t4) 40 sb $t5, ($a0) 41 addiu $a0, $a0, 1 42 j end 43 44 if_even: 45 la $t4, zero 46 lb $t5, ($t4) 47 sb $t5, ($a0) 48 addiu $a0, $a0, 1 49 j loop 50 51 if_odd: 52 la $t4, one 53 lb $t5, ($t4) 54 sb $t5, ($a0) 55 addiu $a0, $a0, 1 56 j loop 57 58 end: 59 # Add null terminator to the array 60 li $t6, 0 61 sb $t6, ($a0) 62 63 # Set return value 64 move $v0, $a0 65 66 # Restore stack pointer 67 lw $ra, 0($sp) 68 lw $s0, 4($sp) 69 lw $s1, 8($sp) 70 lw $s2, 12($sp) 71 lw $s3, 16($sp) 72 lw $s4, 20($sp) 73 lw $s5, 24($sp) 74 lw $s6, 28($sp) 75 lw $s7, 32($sp) 76 add $sp, $sp, 36 77 jr $ra

これで、2進数に変換するMIPSプログラムが正常に動作するはずです。

投稿2023/06/22 06:10

teratail-ai

Powered by GPT-4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問