第12回LSIデザインコンテスト・イン沖縄 設計仕様書 - 4
4.命令フォーマット
さて、これまでの話でひとつの命令は32ビットであることは理解済みであると思います。また、命令には算術演算、論理演算、分岐など色々な種類があることも説明しました。またそれだけでなく、命令にはレジスタファイルのアドレスや、メモリのアドレスの一部を示す必要もあります。
通常は上記で述べた多数の意味を示すために、32ビットを分割して使用します。その分割された部分をフィールドと言います。このようなビットでの命令の表現をアセンブラー表現もしくは、機械語表現と言います。以下表2を用いて命令の機械語表現を説明します。
表2 命令フォーマット(各フィールドの値は10進数で示してある。)
まず、32ビットを表2のように分割しますが、その前に9つの命令を3つの形式に分類しています。R形式はレジスタアドレスを3つ示す必要のある命令用の形式で、add, sub, and, or, sltがこの形式を用います。レジスタは0番から31番の32種類があるので、5ビットを用いてレジスタのアドレスを示しています。また、R形式では左端の6ビットがすべて0であり、これがR形式であることを示しています。add, sub, and, or, sltの区別は右端の6ビットの値で区別されています。また、右から2つめの5ビットフィールドは用いられていません。
次にI形式ですが、これはレジスタアドレスを2つと、数値(2の補数表現を用いて、正もしくは0もしくは負の数を示す)を示しています。数値はなるべく大きな数値を示すことができる方が良いのですが、トータル32ビットの制限で、数値は16ビットです。2の補数表現を用いていますので、表3が表現可能な数値の範囲となります。
表3 16ビット(2の補数)の表現範囲
この16ビットフィールドはlw, swではデータメモリアドレスの計算(バイト単位)に用いられており、beqでは命令ワードの分岐数を示しています(ワード単位)。
最後にJ形式ですが、J形式でレジスタアドレスを示す必要がないので、26ビットの数値が用いられています。この数値を4倍すると、絶対メモリアドレスとなるので、負の数を表現する必要はなく、符号なし数で正または0が表現範囲です。
備考に、表1に対応する命令の例があり、表2に実際のフィールドの値(10進数表示)があり、機械語(表2)でのフィールドの順序が異なることに注意が必要です。
各フィールドには名前があり、それを表4に示す。
表4 フィールド名
opフィールドとfuncフィールドが操作を指定している。rsはソースレジスタ、rtも通常はソースレジスタ、rdはデスティネーションレジスタと呼ぶ。