前提・実現したいこと
MIPSのアセンブリ言語について質問です.
下のプログラムをC言語で書き直すと,どのような感じで書くことができるでしょうか?
また,これは何をしているソースコードでしょうか?
該当のソースコード
main:
addi $s2, $zero, 0
addi $s3, $zero, 0
addi $s4, $zero, 0
addi $s5, $zero, 0
L1:
slt $t0, $s5, $s1
beq $t0, $zero, L4
lw $s7, 0($s6)
addu $s2, $s2, $s7
slt $t0,$zero,$s7
beq $t0,$zero,L2
addu $s3, $s3, $s7
j L3
L2:
slt $t0, $s7, $zero
beq $t0, $zero, L3
addu $s4, $s4, $s7
L3:
addi $s5, $s5, 1
addi $s6, $s6, 4
j L1
L4:
($s1にはある自然数が, $s6にはある配列の先頭アドレスが割り当て済み)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
MIPS のコードはうろ覚えです。
C
1#include <stdio.h> 2 3const int zero = 0; 4int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 5int s1 = 10, s2, s3, s4, s5, *s6 = array, s7, t0; 6 7int main(void) 8{ 9 s2 = zero + 0; // addi $s2, $zero, 0 10 s3 = zero + 0; // addi $s3, $zero, 0 11 s4 = zero + 0; // addi $s4, $zero, 0 12 s5 = zero + 0; // addi $s5, $zero, 0 13L1: 14 t0 = s5 < s1; // slt $t0, $s5, $s1 15 if (t0 == zero) goto L4; // beq $t0, $zero, L4 16 s7 = s6[0]; // lw $s7 = 0($s6) 17 s2 = s2 + s7; // addu $s2, $s2, $s7 18 t0 = zero < s7; // slt $t0, $zero, $s7 19 if (t0 == zero) goto L2; // beq $t0, $zero, L2 20 s3 = s3 + s7; // addu $s3, $s3, $s7 21 goto L3; // j L3 22L2: 23 t0 = s7 < zero; // slt $t0, $s7, $zero 24 if (t0 == zero) goto L3; // beq $t0, $zero, L3 25 s4 = s4 + s7; // addu $s4, $s4, $s7 26L3: 27 s5 = s5 + 1; // addi $s5, $s5, 1 28 s6 = (int *)((char *)s6 + 4); // addi $s6, $s6, 4 29 goto L1; // j L1 30L4: 31 for (int i = 0; i < 10; i++) 32 printf("array[%d] = %d\n", i, array[i]); 33 printf("s1 = %d\n", s1); 34 printf("s2 = %d\n", s2); 35 printf("s3 = %d\n", s3); 36 printf("s4 = %d\n", s4); 37 printf("s5 = %d\n", s5); 38 printf("s6 = %p\n", s6); 39 printf("s7 = %d\n", s7); 40 printf("t0 = %d\n", t0); 41}
何をしているかは実行結果から考えてみてください。
追記
配列の中に負の値を入れておくべきでした。
5 と 6 を -5 と -6 に変えて試してください。
追記2
「C言語で書き直す」というのは、アセンブリ言語と一対一という意味ではなく、
次のように書き直すということかもしれません。
C
1int array[] = { 1, 2, 3, 4, -5, -6, 7, 8, 9, 10 }; 2int s1 = 10, s2, s3, s4, s5, *s6 = array, s7; 3 4int main(void) 5{ 6 s2 = s3 = s4 = 0; 7 for (s5 = 0; s5 < s1; s5++) { 8 s7 = s6[0]; 9 s2 += s7; 10 if (0 < s7) s3 += s7; 11 if (s7 < 0) s4 += s7; 12 s6++; 13 } 14}
何をしているか分かりますよね。
コメントをお願いします。
投稿2020/08/03 00:17
編集2020/08/04 01:40総合スコア8224
0
MIPS のコードはうろ覚えです。
C
1#include <stdio.h> 2 3const int zero = 0; 4int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 5int s1 = 10, s2, s3, s4, s5, *s6 = array, s7, t0; 6 7int main(void) 8{ 9 s2 = zero + 0; // addi $s2, $zero, 0 10 s3 = zero + 0; // addi $s3, $zero, 0 11 s4 = zero + 0; // addi $s4, $zero, 0 12 s5 = zero + 0; // addi $s5, $zero, 0 13L1: 14 t0 = s5 < s1; // slt $t0, $s5, $s1 15 if (t0 == zero) goto L4; // beq $t0, $zero, L4 16 s7 = s6[0]; // lw $s8 = 0($s6) 17 s2 = s2 + s7; // addu $s2, $s2, $s7 18 t0 = zero < s7; // slt $t0, $zero, $s7 19 if (t0 == zero) goto L2; // beq $t0, $zero, L2 20 s3 = s3 + s7; // addu $s3, $s3, $s7 21 goto L3; // j L3 22L2: 23 t0 = s7 < zero; // slt $t0, $s7, $zero 24 if (t0 == zero) goto L3; // beq $t0, $zero, L3 25 s4 = s4 + s7; // addu $s4, $s4, $s7 26L3: 27 s5 = s5 + 1; // addi $s5, $s5, 1 28 s6 = (int *)((char *)s6 + 4); // addi $s6, $s6, 4 29 goto L1; 30L4: 31 for (int i = 0; i < 10; i++) 32 printf("array[%d] = %d\n", i, array[i]); 33 printf("s1 = %d\n", s1); 34 printf("s2 = %d\n", s2); 35 printf("s3 = %d\n", s3); 36 printf("s4 = %d\n", s4); 37 printf("s5 = %d\n", s5); 38 printf("s6 = %p\n", s6); 39 printf("s7 = %d\n", s7); 40 printf("t0 = %d\n", t0); 41}
何をしているかは、実行結果から考えてみてください。
投稿2020/08/03 00:13
総合スコア8224
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
なにをしてるコードかわからないものを書き直しても無駄なだけです。
まずは、あなたがなにをしたいのかはっきりさせましょう。
投稿2020/08/02 06:45
総合スコア88042
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/02 06:49
2020/08/02 06:53
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。