実現したいこと
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 119) 120 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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。