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

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

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

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

Q&A

1回答

381閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア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

回答1

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.47%

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

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

質問する

関連した質問