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

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

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

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

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

2527閲覧

MIPSのアセンブリ言語をC言語に書き直したい

waijepompom

総合スコア1

アセンブリ言語

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

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/08/02 06:43

前提・実現したいこと

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ページで確認できます。

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

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

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

guest

回答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
kazuma-s

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

kazuma-s

総合スコア8224

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

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

kazuma-s

2020/08/03 00:18

投稿に失敗したようです。
guest

0

ベストアンサー

なにをしてるコードかわからないものを書き直しても無駄なだけです。
まずは、あなたがなにをしたいのかはっきりさせましょう。

投稿2020/08/02 06:45

y_waiwai

総合スコア87800

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

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

waijepompom

2020/08/02 06:49

アドバイスありがとうございます. 承知いたしました. これは,学校の課題です. 自分は学校の課題を解きたいだけです.
y_waiwai

2020/08/02 06:53

ガッコの課題なら、なおさら自分でやらないと意味ありません。 わからないならセンセに聞きましょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問