Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
命令:コンピュータの言葉
Arch2016年春 輪講ya-y
前提として
・C及びJavaの変数に対応するレジスタ →$s0, $s1,…・プログラムをMIPSの命令にコンパイルするために必要な一時レジスタ→$t0,$t1,…
前提として
• ハードウェアの設計に関する基本原則は3つ 1、単純性は規則性につながる。 2、小さければ小さいほど高速になる。 3、優れた設計は適度な妥協が必要。
コンピュータ内での命令表現
コンピュータ内での命令表現
• 命令は高と低の電気信号系列で保持されるので、数値として表現可能。
• 命令を構成する信号一つ一つは一個の数値
とみなすことができる。→つまり、数値を並べたものも命令とみなすことができる。
コンピュータ内での命令表現
MIPSのアセンブリ言語では、・レジスタの$s0から$s7は→レジスタ16から23に対応
・レジスタの$t0から$t7は→レジスタの8から15に対応
コンピュータ内での命令表現
このような命令は
10進数なら
2進数なら
このような枠取りを命令形式(instrucConformat)と呼ぶ。
MIPS命令の長さはちょうど32ビットである。
コンピュータ内での命令表現
• 命令を数値で表したものをアセンブリ言語と区別して機械語(machinelanguage)
→ これらの命令を連ねたものマシンコード・ コンピュータのデータ・サイズは4の倍数 →16進数が採用されている。 → 2進数を4ビットごとに区切って16進数に置き換えれば簡単に変換可能
コンピュータ内での命令表現
2進数と16進数の対応表
MIPSのフィールド
それぞれのフィールドに名前が付いている
・op: 命令操作コード(opcode)→命令の基本操作・rs:第1のソース・オペランドのレジスタ・rt:第2のソース・オペランドのレジスタ・rd:デスティネーション・オペランドのレジスタ。結果を収める先・shamt:シフト量・funct:機能コード→機能、命令操作フィールドのバリエーションを表す。
設計原則の3
• 優れた設計には適度な妥協が必要である。MIPSの設計者が選択したのは・・・→全ての命令長を同じに保つこと結果・・・→命令の種類によって命令形式が異なる場合が存在する。
解決策
先ほど示した命令形式がR形式(レジスタ用)解決策→I形式即値及びデータ転送命令用であり、下記のフィールド形式をとる。
例えば
lw$t0,32($s3)#A[8]が一時レジスタ$t0に代入されるこの場合`rtフィールド`は転送されるデータを受け取るデスティネーション・レジスタ(desCnaConregister)
R形式とI形式の区別の仕方
最初のフィールドの値によって区別される。
論理演算
シフト(shiT)
• 後中の全てのビットを左右にずらして開いた部分に0を詰める操作
シフト(shiT)
• R形式におけるshamtはshiTamoutの略 → シフトする量を表す↑上記の例では
sll$t2,$s0,4# レジスタ$t2=レジスタ$s0<<4ビット
ShiTleTlogical(sll)なので4ビット左にシフトする
条件判定用の命令
条件判定用の命令
• プログラミング言語ではif文など →MIPSのアセンブリ言語では条件判定用の命令が二つ用意されている。1. beqregister1,register2,L1 →レジスタ1と2が等しい時にL1にプログラム実行の流れを分岐 (branchifequal)の略
2. bneregister1,register2,L1 →レジスタの1と2が等しくない時にL1にプログラム実行の流れを分岐 (branchifnotequal)の略
ループ
• 条件判定の重要な2つの局面
1. If文においてどちらの処理を選択するか
2. ループにおける繰り返し制御どちらも同じアセンブラ命令を用いて制御を行う。
forループの判定
• 値が0よりも小さいかそうでないかアセンブリにおける比較のための命令setonlessthan命令(slt)→Ex)slt$t0,$s3,$s4 # $s3が$s4よりも小さい場合に$t0を1に設定即値版のsetonlessthan命令(slC)→Ex)slC$t0,$s2,10#$s2が10よりも小さい場合.$t0を1に設定
MIPSコンパイラの条件判定
・ slt,slC,beq,bneの命令・ 「等しい」「等しくない」「より小」「以下」「より大」「以上」が判定可能。
case文,switch文
• If-then-elseをつなげる方法
• ジャンプ・アドレス・テーブル(jumpadresstable)を使う
→それぞれの処理のアドレスをテーブル化 →そのどれを取るかを示すインデックスに従って該当処理にジャンプする
ジャンプ・レジスタ命令(jumpregister:jr)
• ジャンプアドレステーブルを利用するための命令
→該当するアドレスをレジスタにロード →レジスタ中のアドレスを使用してジャンプ
コンピュータ・ハードウェア内での手続きのサポート
手続き、関数
• プログラムを構成する方法の一つ<メリット>・可読性の向上・コードの再利用が可能手続き→プログラマはタスクの一部だけに専念できる
手続きとはスパイのようなものである
• 秘密裏に計画を立て、情報を入手• 仕事を遂行• 自分の足跡を消す• 要求された結果を手元に元の場所に戻ってくる• 使命をかんすいした後に何の痕跡も残してはならな
い• 「知る必要」のみに基づいて活動する。• 自分の雇い主に関して想定を行うことはできない。
手続き
• ソフトウェアにおいて抽象化を実現
1. 手続きからアクセスできる場所にパラメータを置く2. 手続きに制御を移す3. 手続きに必要なメモリ資源を入手する4. 必要なタスクを実行する5. 呼び出し元のプログラムからアクセスできる場所に結果を
置く6. 制御を元の位置に戻す.
手続き
• コンピュータにデータを保持する場所としてはレジスタが最高速
→可能な限りレジスタを使用したい・$a0-$a3:4本の引数レジスタ.パラメータを渡すために使用・$v0-$v1:2本の値レジスタ.結果の値を返すために使用・$ra:1本の戻りアドレス・レジスタ.制御を元に戻すために使用
アセンブリ言語:手続き専用命令
ジャンプ&リンク命令(Jump-and-link)命令→アセンブリ:jal [手続きのアドレス]• アドレスにジャンプする• 次の命令のアドレスをレジスタ$raに退避する命
令歴史的な経緯上、このレジスタはプログラムカウンタと呼ばれることが多い。
さらに多くのレジスタを使用する場合
• レジスタをスピル・アウトする →理想はスタック(stack)1.手続きがジャンプした処理の直後のアドレスをスタックに積む2.ジャンプ先のアドレスに実行の流れを移す3.処理が終わったらスタックに積んであったアドレスにジャンプして続きの手続きを実行する。
入れ子にされた手続き
• レジスタの$a0の使用に関して競合が発生• 同様にレジスタ$raの中の戻りアドレスも競合
解決策
・保存されるべき他の全てのレジスタをスタック上にプッシュ(push)すること手続きの呼びだしの間に保持されるもの
新しいデータ用のスペースのスタック上での割り当て
• 手続きないの変数であるがレジスタに割り付けられないものを格納するためにスタックが使用される。
→Ex)配列・データ構造
新しいデータ用のスペースのスタック上での割り当て
• 手続きフレーム(アクティベーション・レコード)
新しいデータ用のスペースのヒープ上での割り当て
• Cプログラマは静的変数及び動的なデータ構造のためのメモリを必要とする。
• リンクト・リストのようなデータ構造は使用中に伸縮する。
→ヒープと呼ばれる
MIPSのレジスタ使用規約
目的:一般的な場合を高速化する