• 締切済み

命令セットとコンパイルの問題です.

命令セットとコンパイルの問題です. 問)1次のプログラムは,何を計算するのか説明せよ begin: addi $v0,$zero,0 loop: lw $v1,0($a0) addi $v0,$v0,1 sw $v1,0($a1) addi $a0,$a0,1 addi $a1,$a1,1 bne $v1,$zero,loop finish: halt ;ここに来たら停止するもの

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

WEB照会して http://www.watalab.cs.uec.ac.jp/staff/vsuzuki/cnp-web/minips.pdf MinIPSというアセンブラで、C言語ではもちろんないようです。 (初めは試験問題用の模擬アセンブラかと思ったが、実際にあるもののようです。) 上記に詳細の説明があります。 変数名の前に$をつけるのかと思ったが、「特別な汎用レジスタ」の名前であった。 VはVariable(変数)を意識した記号と思ったが、「特別な汎用レジスタの名前」に一部であった。 Addiは整数(2進数)を加えるということでiが付いている。 Wはワード(32ビット)でワードバウンダリの番地に記憶。 $0-$31のレジスタがある。質問例の$a1,$a0 はレジスタ を識別していると思う。「特別な汎用レジスタ」の名前らしい。 :の付いているのは、「ラベルフィールド」で飛び先などに使う名称。 (例 begin: 、finish:、loop。BeginはPasical言語などのBegin Endと同じでなく、初めという意味でつけたものらしい。Loopも多言語の制御構造のLoopではなく、飛び先としてLoopという名前をつけただけ。) haltは言葉どおり停止(終了)指令。 swのsはメモリにStore(記憶)のs、Wはワードとしての意味。 Addiは即値加算命令とかで、即値とは「リテラル」(指令の中で表されていて、文字通りの数、定数のような意味)の意味でしょうか。 第3引数の1が「即値」なのでしょう。1を加えるということ。 BNEはBranch Not Equal、等しくないときはの意味で、$V1レジが$ZERO(内容は0)に等しくない間は、Loopに飛べ(繰り返すということ)となる。 小生はこのアセンブラを本番で使ったことは無いので、わかる範囲で説明しておきます。

  • m3_maki
  • ベストアンサー率64% (296/460)
回答No.3

> C言語です. いいえ、C言語ではありません。 MIPSのアセンブラですね。初めて見ました。 http://ocw.kyushu-u.ac.jp/0009/0006/lecture/10.pdf アセンブラは低級言語(?)ですから、文字列などという概念はありません。 ただ、動作が、C言語の文字列(必ず0で終わります)をコピーするようなものでしたから引き合いに出しただけです。 アセンブラをやるくらいなら、C言語をご存知かと思いましたが、 かえって混乱させたようですね。 > 後、$v1がゼロになることなんてあるんですか? $v1は、$a0の指すメモリの内容を一時的に保存しているだけです。 (それを、$a1の指すところに格納しています。) それぞれをインクリメントしながら繰り返しコピーしているのです。 そして。今コピーした値($v1に入っています)がゼロなら終了です。 $v1がゼロにならなかったら無限ループですが、 実際は、有効なメモリ空間からはみ出して、異常終了でしょう。 ハード系の学生さんならいいですが、 情報系の方なら、気合を入れて勉強しないとヤバそうですね。

  • m3_maki
  • ベストアンサー率64% (296/460)
回答No.2

これが、C言語なら *A0 の文字列を *A1 にコピーして その終端の0を含む長さを V0 に求めている。 というようなプログラムでしょう。

playtag
質問者

補足

申し訳ないです. C言語です. 文字列の長さを求めているのですか? 後、$v1がゼロになることなんてあるんですか?

noname#77845
noname#77845
回答No.1

なんで、このカテゴリ? もしかして、課題丸投げ? このアセンブラは、なんのアセンブラ? 「何を計算するのか説明せよ」なんで、命令調?

playtag
質問者

補足

申し訳ないです. C言語です. 過去問をそのまま載せてしまいました.

関連するQ&A