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

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

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

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

C

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

Q&A

解決済

2回答

577閲覧

MIPS 数字を入力して、その数字を逆に出力するときに入力していないのに出力される数字を取り除きたい

wanwanko

総合スコア14

アセンブリ言語

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

C

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

0グッド

0クリップ

投稿2022/11/03 12:34

編集2022/11/04 09:57

前提

C言語からMIPSに直しています。
入力はうまくいきますが
出力するときに予期しない数字が発生してしまいます。
自分でもサイズが記述ミスが見つかりません。
得意な方どうぞ知恵を貸していただきたいです。

実現したいこと

入力した10個の数字を逆から順に出力したときに、一番前にある入力していないのに発生した数字を取り除きたい。

発生している問題・エラーメッセージ

入力した10個の数字を逆から順に出力したとき
例:
Input
5 3 7 8 6 3 4 2 1 4

1668048215 4 1 2 4 3 6 8 7 3 5

一番前の1668048215という大きな数字が入力していないのに出力されます

該当のソースコード

MIPS

1.data 2 3 array: .space 40 4 prompt:.asciiz "Welcome:)\nPlease enter 10 integers:" 5 point:.asciiz "." 6 colon:.asciiz ":" 7 Nextline:.asciiz "\n" 8 Spacing:.asciiz "," 9 spaceChar:.asciiz " " 10.text 11main: 12 addi $t0,$t0,40 13 addi $t4,$t4,90 14 addi $t9,$t9,1 15 addi $s5,$s5,10 16 move $t1,$zero 17 li $v0,4 18 la $a0,prompt 19 syscall 20 21 li $v0,4 22 la $a0,Nextline 23 syscall 24 25input: 26 27 beq $t1,$t0,whileOutput 28 29 move $a0,$t9 30 li $v0,1 31 syscall 32 33 li $v0,4 34 la $a0,colon 35 syscall 36 37 li $v0,5 38 syscall 39 move $t2,$v0 40 41 sw $t2,array($t1) 42 addi $t1,$t1,4 43 addi $t9,$t9,1 44 45 j input 46 47 48 #print in reversed order 49 50whileOutput: 51 beq $t1, 0 exitOutput 52 lw $t6, array($t1) 53 #print Integer 54 li $v0, 1 55 move $a0, $t6 56 syscall 57 #print space 58 li $v0, 4 59 la $a0, spaceChar 60 syscall 61 addi $t1, $t1, -4 62 j whileOutput 63

C

1#include <stdio.h> 2 3int main() 4{ 5 int array[10]; 6 7 for(int i=0;i<10;++i){ 8 scanf("%d",&array[i]); 9 } 10 11 for(int j=9;j>=0;--j){ 12 printf("%d ",array[j]); 13 } 14 printf("\n"); 15 16 17 return 0; 18}

試したこと

サイズの記述ミスかと思い、配列のサイズをarray: .space 40からarray: .space 36に変更すると9個の数字が入力でき一番前に0が出てきます。
必ずどこかしら入力していないのに出力してしまう数字があります。

補足情報(FW/ツールのバージョンなど)

MarsでMIPSのコードをRunしました。

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

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

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

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

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

jimbe

2022/11/03 17:27

問題があるのは c では無いようで…。MIPS とかアセンブラとかのタグの方が良いのでは無いでしょうか。
wanwanko

2022/11/03 18:26

mipsのタグがありませんでした😭
jimbe

2022/11/03 18:48

確かヘルプ辺りにタグの追加申請?に付いて書かれた文があった気がします。良かったら申請してみては如何でしょうか。
int32_t

2022/11/03 23:40

現状では「アセンブリ言語」というタグを使ってください。
wanwanko

2022/11/04 09:58

タグをつけました。お二方ご指摘ありがとうございます、
guest

回答2

0

j whileOutput の直前の addi $t1, $t1, -4
beq $t1, 0 exitOutput の直後に移動してください。

投稿2022/11/10 14:14

編集2022/11/10 14:25
kazuma-s

総合スコア8224

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

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

0

ベストアンサー

sw $t2,array($t1) addi $t1,$t1,4

最後の入力を array($t1) にストアしたあと、$t1 はその時点より 4 増やした値になります。

whileOutput: beq $t1, 0 exitOutput lw $t6, array($t1)

出力ループの最初では、array($t1) は最後の入力が入った位置より4ずれたところを読み出しています。

投稿2022/11/03 13:17

int32_t

総合スコア20882

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

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

wanwanko

2022/11/03 18:31

ありがとうございます、$t1が40になった時点でループを抜けてそれが最後の位置かと思ってました。
wanwanko

2022/11/04 09:55

すみません、4ずれたところというとサイズ10個分入力したら、サイズ11個目から出力ということでしょうか? beq $t1,$t0,whileOutputの行で10回インプットしたら$t0が40でinputループから抜けてwhileOutputループから$t0が44になってるのでしょうか?
int32_t

2022/11/04 13:46

> サイズ11個目から出力ということでしょうか? そうです。 > beq $t1,$t0,whileOutputの行で10回インプットしたら$t0が40でinputループから抜けて はい。$t0 も $t1 も40で抜けます。 > whileOutputループから$t0が44になってるのでしょうか? いいえ。$t0 も $t1 も 40 です。表示すべきは array(36) から array(0) の10個です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問