• 締切済み

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

命令セットとコンパイルの問題です. 問)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/17068)
回答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% (295/459)
回答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% (295/459)
回答No.2

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

playtag
質問者

補足

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

noname#77845
noname#77845
回答No.1

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

playtag
質問者

補足

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

関連するQ&A

  • アセンブリ言語の分岐命令の動作の問題です。

    以下のプログラム実行後のレジスタ$v0の値を書け,16進の数値には0xをつけること 問題0: addi $s0,$zero,2 addi $s1,$zero,5 slt $at,$s1,$s0 bne $at,$zero,L1 sub $v0,$s0,$s1 beq $zero,$zero,L2 L1: add $v0,$s0,$s1 L2: addi $v0,$v0,1 分かる方がいましたら回答お願いいたします

  • MIPSのアセンブルコードが解りません(ノД`)・゜・。

      sll $a2 , $a2 , 2   sll $a3 , $a3 , 2   add $v0 , $zero , $zero   add $t0 , $zero , $zero outher : add $t4 , $a0 , $t0   lw $t4 , 0($t4)   add $t1 , $zero , $zero inner ; add $t3 , $a1 , $t1   lw $t4 , 0($t3)   beq $t3 , $t4 , skip   addi $v0 , $v0 , 1 skip: addi $t1 , $t1 , 4   bne $t1 , $t2 , inner   addi $t0 , $t0 , 4   bne $t0 , $a2 , outher 自分は大学生でコンピュータのネットワークを専攻しているのですが… アーキテクチャの授業はハードウェアの内容であまり知識がありません。 上記のコードは一体何をするものなのでしょうか? 手続きとして呼び出せないカタチなので実行できずに困っています。 〆切がもう間近で非常に困っています。 詳しい方よろしくお願い致します。

  • アセンブリ言語の問題です。

    以下のプログラム実行後のレジスタ$v0の値を書け,16進の数値には0xをつけること 問題0: addi $s0,$zero,0 addi $s1,$zero,2 beq $s0,$s1,L1 sub $v0,$s0,$s1 beq $zero,$zero,L2 L1: add $v0,$s0,$s1 L2: addi $v0,$v0,1 分岐命令の動作の問題です。分かる方がいましたら回答をよろしくお願いいたします。 sub:減算 addi:即値付き演算命令 beq:等しい L:ラベル

  • アセンブリ言語の問題です。

    長い内容になっていますがご了承ください 演算命令の動作 以下のプログラム実行後のレジスタ$v0の値を書け,16進の数値には0xをつけること 問題0: addi $s0,$zero,8 addi $s1,$zero,8 addi $s2,$zero,3 addi $s3,$zero,11 add $t0,$s0,$s1 add $t1,$s2,$s3 sub $v0,$t 論理演算命令の動作 以下のプログラム実行後のレジスタ$v0の値を書け,16進の数値には0xをつけること 問題0: addi $s0,$zero,0x8 addi $s1,$zero,0x8 addi $s2,$zero,0xd addi $s3,$zero,0x2 and $t0,$s0,$s1 and $t1,$s2,$s3 or $v0,$t0,$t1 以上です。この問題が分かる方がいましたら回答お願いします。

  • MIPSでクイックソート

    MIPSアセンブリ言語でクイックソートを書いているのですが、うまく動作しません。以下のソース文では、loop2の所がずっとループし、終わる気配がありません。アドバイスをお願いします。 .text .globl main main: li $v0, 0 li $t0, 0 li $t1, 28 loop: slti $s0, $t0, 28 beq $s0, $0, reset lw $t2, list($t0) sw $t2, array($t0) addi $t0, $t0, 4 j loop reset: move $t0, $0 lw $t2, array($t0) lw $t3, array($t1) ave: add $t4, $t2, $t3 li $t5, 2 div $t6, $t4, $t5 loop1: ble $t6, $t2, loop2 addi $t0, $t0, 4 j loop1 loop2: bgt $t6, $t3, change addi $t1, $t1, -4 j loop2 change: bge $t2, $t3, small sw $t2, array($t1) sw $t3, array($t0) j loop1 small: move $s2, $t1 addi $s2, $s2, -4 lw $t3, array($s1) bge $s2, $t0, big j ave big: move $s2, $t0 addi $s2, $s2, 4 bge $s2, $t1, reset2 j ave exit: jr $ra .data list: .word 3, 5, 1, 8, 9, 7, 2 array: .space 128

  • アセンブラに関する質問

    アセンブラに関する質問 現在アセンブラの勉強をしている者ですが2つ質問があります (1)以下のサイトの分岐とジャンプ命令の説明にPC+4という記述があるのですがこれはメモリアドレスを指しているのですか?そうだとしたら、4というのはデータ語長が4バイトだとだからという意味だと思うのですがPCというのは何なんでしょうか? R3000 URI:http://ja.wikipedia.org/wiki/R3000#.E5.91.BD.E4.BB.A4.E3.82.BB.E3.83.83.E3.83.88.E3.81.AE.E6.A6.82.E8.A6.81 (2)レジスタr1がレジスタr2の値より小さいとき処理Aと処理Bをさせる方法はどうしたらいいでしょうか?自分が思うに addi r2, r2, 100 ?←ループの始まりを知らせる命令を用意する 処理A 処理B addi r1, r1, 1 ble r1, r2, ?←ループの始まりに行く値をセットする という命令を書けばいいと思うのですが?の部分の書き方が分かりません。 使用できる無条件、条件分岐命令は以下のものが指定されています。 無条件分岐:j, jr, jal 条件分岐:beq, bne, blt, ble

  • 機械語を用いて2のx乗を求める

    機械語を用いて2のx乗を足していったものを作りたいです。 1+2+4+8+16~~~2^x となる感じです。 xはこちらからあらかじめ入力してあるということにしています。 一応途中まではできました。 命令とオペランドだけを書くと、 LD A,(9000H) LD C,01 LD B,A LD A,00 SLA C LOOP ADD A,C DEC B JP NZ,LOOP LD (9100H),A HALT ここまではできたのですが、 これだと0を代入した際答えが正しく出ませんでした。 習っている内容もまだ始めたばかりなので、 LD、ADD,SUB、DEC,INC、JP(NZ)、SLA.SRA、SRLなどのものしか習っておらず、 他の者は使わないようにと言われています。 どこを直せばいいでしょうか?

  • 至急お願いしたい事があります

    初めての質問、失礼致します。 私は理工学部に通う大学生なのですが、もうすぐ期末試験を迎えようとしています。 そこで先輩方から以下の過去テスト問題を頂いたのですが、テストは返却されていないため、回答もございません。 同じ授業の期末をまもなく迎えようとしているため、なんとかこの問題をテスト勉強に活かしたいと考えています。 そこでお願いなのですが、どなたかこの問題を解いて頂ける方を探しています。 勿論、解ける範囲で結構ですし、解答の正否にも拘りません。 明日の夕方からテストなので、明日の午前までに解いて頂ければ助かります。 都合の良いお願いに加えて誠に差し出がましく申し訳ないのですが、何卒よろしくお願い致します。 プロセッサ性能 (1)現在使用しているプロセッサAlpha に対してその対象とする分野のベンチマークを実行して調べ たところ,シフト命令の次に加算命令が来る頻度が非常に多く,全命令の20%に達することが分か った.そこで,シフトと加算を一緒に行う命令を追加したプロセッサBeta を開発した.しかし, Beta はCPI こそ変わらなかったが,Alpha ほどクロックを高速にできず,fAlpha / fBeta = 1.1 という関 係になった.Alpha とBeta はどちらがどれだけ高速か. (2)君がコンピュータH-0 を用いて処理している負荷は3 種あって,浮動小数点演算の比率は下の 表のようになっている. 負荷              W1  W2  W3 浮動小数点の比率      1%  25%  60% (a) H-0 は浮動小数点演算が遅いので,それを2 倍高速化したH-1 を開発した.それぞれの負荷にお ける速度向上比を求めよ. (b) よく調べてみると,H-1 の浮動小数点演算以外の命令は5%遅くなっていることが分かった.こ の場合でも,H-0 の代わりにH-1 を使用することで処理を高速化できるか.それぞれの負荷につ いて調べよ. (c) [extra credit] もし,浮動小数点演算がH-0 に対して2k 倍高速であるが他の命令は5k(%)遅くなる コンピュータH-k (k = 1,2,3,…)が開発できるとすると,負荷W2 の処理が最も高速化されるのはど のコンピュータか. 【3】 演算方式 (1)32 ビットの整数の乗算について以下の問に答えよ. (a) ハードウェアによる,加算,シフト,判定等の基本操作にそれぞれh 時間かかるとすると,ス ライド5-29 の構成で乗算器を作成した場合,乗算にどれだけの時間がかかるか.但し,レジスタ のセット等初期設定は考えなくてよい. (b) MIPS のソフトウェアによる乗算(スライド5-33)を高速化するために,新しい命令を追加して ループ内の命令数を減らしたい.どのような命令を追加すれば良いか.クロックを遅くしないた めに新命令は他の命令と同程度の手間で実行できなければならない. (c) スライド5-29 の構成では1 個の加算器を繰り返し使用しているが,最初の2 個の部分積を第1 の加算器で加算し,その和と第3 の部分積を第2 の加算器で加算し,その和を次の部分積と加算 するというようにすれば,1クロックで全部分積を加算して積を求めることができる.1 回の加 算時間をa とするとき,この構成の乗算の時間を求めよ. (d) (c)の方法は工夫すれば,乗算時間を短くすることができる.その構成を提案し,(c)の方法に比 べてどれだけ高速化されるか計算せよ. (e) (d)において,最初に基数4 のBooth recoding を適用してから乗算を行った場合の乗算時間を求め よ. (2)次の数を小さい順位並べよ.理由を明記すること.なお,float はIEEE 表現とする. A. 0xF0000000 (float) B. 0xF0000000 (int) C. 0xF0000000 (符号+絶対値表現int) D. 0xFFFFFFFF (int) E. 0xFFFFFFFF (1の補数表現int) F. 0xF1000000 (float) G. 0x70000000 (float) H. 0x7FFFFFFF (int) I. 0x80000010 (float) (3)IEEE754 標準浮動小数点数に関して以下の問に答えよ. (a) 2 個のfloat 数をMIPS のslt 命令で比較する場合,正しい結果が得られないことがあるか. あればどういう場合か説明せよ.但し,どちらの数も±0 やNAN ではないものとする. (b) 次の2 個の数のfloat 表現を16 進数で示し,次にその積のfloat 表現を求めよ.なお,ま るめはIEEE default を用いよ. A = 1 + 2-23 B = 1 + 2-22 (c) 2 個のfloat 数,A, B を加算したところ,和はA に等しかった.これから,B = 0 と結論で きるか.Yes ならその理由を述べ,No ならどういう場合にこうなるかを説明せよ. (d) ある正のfloat 数A の次に大きいfloat 数をB,その次に大きい数をC,更にその次の数 をD とする.それぞれの数の指数部を調べたところ,C,D の指数部はA,B の指数部より1 大 きかった.このとき,B-A,C-B,D-C の値を比較せよ. [1] MIPS (1)下に示すのは,無符号整数内の1のビットの個数を再帰的に数える関数である.この関数をMIPS の機械命令(マニュアルで青色になっている命令)によるアセンブリコードに変換せよ.レジスタ は使用規約に従って利用すること.また,コードの動作が分かるように明確なコメントをつけよ int bitCount(unsigned x) { int bit; if (x == 0) return 0; bit = x & 0x1; return bit + bitCount(x >> 1); } (2)下の左側に示すMIPSのコードは,右側にその基本構造を示したCの関数をコンパイルした結果で ある.これについて後の問に答えよ.但し,内部でコールしている関数mallocはC言語のmalloc 関数を実装したもので,指定バイト数の領域を確保してその先頭ポインタを返す. foo:     addiu   $sp,$sp,-12        sw    $a0,0($sp)   # src    ____ foo(____ src, _____ size){        sw    $a1,4($sp)   # size        sw    $ra,0($sp)        move  $a0,$a1        addiu  $a0,$a0, 1        jal    malloc     # v0:dst    for(_____; _______; _____)        move  $t0,$v0    # cur        lw    $t1,0($sp)        lw    $t2,4($sp)        addu   $t2,$t2,$t1  # end  } loop:     beq   $t2,$t1,end        lbu    $t4,0($t1)        ori    $t4,$t4,0x20        sb    $t4,0($t0)        addiu  $t0,$t0,1        addiu  $t1,$t1,1         j    loop end:      sb    $zero,0($t1)         lw    $ra,8($sp)        addiu   $sp,$sp,12         jr     $ra (a) このMIPSのコードに対応するCのコードを示せ.変数名はコメントに指定したものを使用せよ. (b) srcが指す領域にchar文字の配列(文字ストリング)が格納されているとすると,この関数の 名称として適当なものを提案せよ.即ち,コーラーから見てこの関数が行うことが分かるよう な名前を示せ. (c) この関数がprintfのような頻繁に使用される関数内からコールされるとすると,問題が生じる. それを指摘せよ. (d) 今,最後から4行目の命令(sb $zero, 0($t1))を忘れたとする.この場合, char *str = “computer science”; printf(“%s”, foo(str, 8)); のようにコールするときに発生する可能性がある現象を全てあげよ.

  • 物理の問題

    学校の物理の問題で初歩ながらも全くわかりません>< だれか教えてください。 問1   ある物体がx軸に沿って速度v(t)=3t^2-6t-9(m/s)で運動している。その物体はt=0sに11mの位置を通過した。  時刻tのときの位置x(t)と加速度a(t)を求める。 問2   ある止まっている列車が動きだし、3.0kmを走る間、一様に加速して最高速度240km/sに達する  0km/hから出発し、240km/hに達するまでの時間tとこの列車の加速度は何m/s^2か。 問3   一定の速さ30m/sで走っている車が突然丘の下でエンジンを停止し、車は一定の加速度-2.0m/s^2で丘を登る。丘の下をx=0m,速度をv0=30m/sとする。  時間tのとき位置xを時間tの関数で表しなさい。 どうか早急にお願いします。

  • 正しく書けていますか?

    私が書いた(1)から(12)までの文章は、正しく書けているでしょうか?詳しい皆さんのご意見をいただきたいです。どこか誤った部分があれば、教えていただきたいです。 (1)次のプログラムを実行すると、8200H番地に40Hが格納される。 ORG 8000H LD HL,8200H LD A,08H LD B,A ADD A,A ADD A,A ADD A,B LD (HL),A HALT (2)次のプログラムを実行すると、8200H番地に55Hが格納される。 ORG 8000H LD HL,8200H LD A,AAH CPL LD (HL),A HALT (3)HLレジスタで示されるメモリ番地の内容をCレジスタに転送する命令は以下のとおりである。 LD C,HL (4)サインフラグは、ある命令を実行した結果、Aレジスタ等が負であれば1に、正であれば0に設定される。 (5)以下のプログラムを実行すると8A00Hには0AHが格納される。 ORG 8000H LD A,0D LD B,10D LOOP; ADD A,B DJNZ LOOP LD(TOTAL),A JP $ ORG 8A00H TOTAL;DEFB 0 END (6)CP/Mは6800や68000などをCPUにもつマイコンのためのD0Sである。 (7)16BIT算術演算グループではレジスタペアとしてBC,DE,HLがある。 (8)次のプログラムを実行すると、8200H番地にOFHが格納される。 ORG 8000H LD HL,8200H LD A,05H LD B,A SLA A ADD A,B LD (HL),A HALT (9)オペコードとは、命令の操作を表すコードをいう。 (10)以下のプログラムにおいて、8005Hにデータは08Hである。 ORG 8000H TABLD1;DEFB 1 DEFB 2 DEFB 0FEH DEFB4 TABLE2;DEFW 0506H TABLE3;DEFFW 8 END (11)サブルーチン内で演算などにレジスタを使用する場合、あらかじめレジスタ内のデータをPUSH命令などで退避する必要がある。 (12)ソフトウエアー上で無視できる割り込み要求と要求を無視できない割り込み要求を総称してノンマスカブルインタラプト(NMI)という