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

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

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

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

Q&A

2回答

697閲覧

素数以外をふるい落とすsieve関数をアセンブリ言語に翻訳することができない。

caffeine-xox

総合スコア1

アセンブリ言語

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

0グッド

0クリップ

投稿2022/06/16 05:14

C言語における、次のようなsieve関数

void sieve(int *p, int n) { int i, k; for (i = 2; i < n; i++) if (*(p+i) == 1) for (k = i + i; k < n; k += i) *(p+k) = 0; }

をMIPSのアセンブリ言語に翻訳する、という課題です。

MIPSにおけるmain関数及びsieve関数以外の関数は以下のようになっています。

.data nl: .asciiz "\n" .align 2 a: .space 4*10000 # int a[10000] .text .globl main main: add $sp, $sp, -36 sw $ra, 0($sp) sw $s0, 4($sp) sw $s1, 8($sp) sw $s2, 12($sp) sw $s3, 16($sp) sw $s4, 20($sp) sw $s5, 24($sp) sw $s6, 28($sp) sw $s7, 32($sp) li $s0, 19 li $s1, 17 li $s2, 13 li $s3, 11 li $s4, 7 li $s5, 5 li $s6, 3 li $s7, 2 la $t0, a # a li $t1, 0 # i li $t2, 1 main_loop1: bge $t1, 10000, main_exit1 sw $t2, 0($t0) add $t0, $t0, 4 add $t1, $t1, 1 j main_loop1 main_exit1: la $a0, a li $a1, 10000 jal sieve # sieve(a, 10000) la $t0, a # a li $t1, 2 # i = 2 add $t0, $t0, 8 # $t0 = a + 2*4 li $t2, 0 # c = 0 main_loop2: bge $t1, 10000, main_exit2 lw $t3, 0($t0) bne $t3, 1, main_exit3 add $t2, $t2, 1 main_exit3: add $t1, $t1, 1 add $t0, $t0, 4 j main_loop2 main_exit2: move $a0, $t2 jal print_int # 1229<改行>が表示されればOK move $t0, $s0 mul $t0, $t0, $s1 mul $t0, $t0, $s2 mul $t0, $t0, $s3 mul $t0, $t0, $s4 mul $t0, $t0, $s5 mul $t0, $t0, $s6 mul $t0, $t0, $s7 sub $a0, $t0, 9699690 jal print_int # 最後に0<改行>が表示されれば恐らく$snの使用法ミスはなし($snの使用法チェックコードの実行結果) lw $ra, 0($sp) lw $s0, 4($sp) lw $s1, 8($sp) lw $s2, 12($sp) lw $s3, 16($sp) lw $s4, 20($sp) lw $s5, 24($sp) lw $s6, 28($sp) lw $s7, 32($sp) add $sp, $sp, 36 jr $ra print_int: li $v0, 1 syscall la $a0, nl li $v0, 4 syscall jr $ra

ここにsieve関数を導入し、実行結果として

1229 0

と表示されれば成功となります。
私は、以下のsieve関数を作成しました。

sieve: li $t4, 2 move $t5, $zero loop: bge $t4, 10000, loopend move $t5, $t4 sll $t5, $t5, 2 add $a0, $a0, $t5 lw $t6, 0($a0) bnez $t6, loop2 add $t4, $t4, 1 j loop loop2: sub $a0, $a0, $t5 add $t5, $t5, $t4 add $t5, $t5, $t4 add $t5, $t5, $t4 add $t5, $t5, $t4 bge $t5, 40000, loop add $a0, $a0, $t5 sw $zero, 0($a0) j loop2 loopend: jr $ra

この関数を導入し実行したのですが、どれだけ待っても計算が終わらなかったため、どこかの箇所で無限ループに入ってしまっているのではないかと考えました。

これに対する改善方法はありますでしょうか。宜しければご教授の程、よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

わざわざこんなところで聞かずとも、
MIPSのCコンパイラ持ってきて、それでアセンブラ出力させてみればどうなんでしょうか

投稿2022/06/16 09:03

y_waiwai

総合スコア87719

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

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

Zuishin

2022/06/16 12:04

> MIPSのアセンブリ言語に翻訳する、という課題です。
guest

0

無限ループの原因かどうかはわかりませんが、メモリの範囲外アクセスしてますね。

外側のループだけを見ても、a0 の値が
1順目: 初期値 ⇨ 初期値 + 2 * 4 (合ってる)
2順目: 初期値 + 2 * 4 ⇨ 初期値 + 2 * 4 + 3 * 4 (間違い: 初期値+3*4 のはず)
と増えすぎています。

投稿2022/06/16 07:29

編集2022/06/16 07:31
int32_t

総合スコア20659

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問