命令 (コンピュータ)
![]() | この項目では、プロセッサの命令について説明しています。ユーザーが入力する指示については「コマンド (コンピュータ)」をご覧ください。 |
コンピュータにおける命令(めいれい、英: Instruction)はプロセッサに対する演算の指示である。
CPU等のプロセッサは加算・乗算・データ移動などのシンプルな演算をおこない、それを繰り返すことで複雑なソフトウェアを動作させている。ハードウェアであるプロセッサは事前に定められた演算群に含まれている演算のみ実行できるため、プロセッサを動かすにはそのプロセッサが受け付け可能な演算を実行するよう指示する必要がある。この演算指示がプロセッサの命令である。
命令は演算種類を指定する1つのオペコードと演算対象を指定する0個以上のオペランドからなる。
命令の集まりは命令セットと呼ばれる。
表現
命令はオペコードとオペランドの組み合わせで表現される。
オペコード
オペコード(英: opcode)はプロセッサで実行される操作の種類を指定する符号である。プロセッサが対応する各演算に対して1つのオペコードが割り付けられる。ほとんどの場合オペコードはバイナリ形式であり、そのビット長はプロセッサにより異なる(例: x64 ADD演算 0x01
)。
オペランド
オペランド(英: operand)はプロセッサで実行される操作の対象である。オペランドの内容・個数はオペコードごとに規定される。例えば二項演算であるADD演算であれば2つのオペランドを取るし、遷移先を指定するJUMP命令であれば1つのオペランドを取る。
命令の種類
通常、加算・減算・乗算・除算の四則演算、ロード・ストア命令、条件分岐命令などからなる。シフト演算・論理演算なども含まれることが多い。CPUによっては、さらに複雑な命令も多数持っている(平方根の逆数を求める命令など)。また、一般に、NOPと呼ばれる「なにもしない」命令も含まれる。これは、VLIW方式を採用しているCPUでは必須の命令である。極めて特殊な例として、未定義の命令を実行したときと同じ効果が得られる命令が定義されているCPUがある(IntelのUD2命令等)。
命令の方式
命令の方式は、CPUの種類によって大きく異なる。例えば、固定長命令のものと可変長命令のものがある。また、命令セットの設計方針では、CISCとRISCがある。さらに、主記憶メモリのアドレス指定方式に関しても、様々である。
オペランドの個数による分類
- 0アドレス命令形式
- 処理対象のデータがスタックに格納されているコンピュータで使用される。例えば、加算や乗算などの演算は、スタックの上二つを取り出して演算結果をスタックにプッシュする。よって、命令語は、ADD, MULのように一語で表現できる。
- 1アドレス命令形式
- 加算や乗算の対象となる二つのデータのうち、少なくとも一方がレジスタ上に存在しなくてはならない命令形式。たとえば、「ADD レジスタA メモリX」(レジスタAの中身とメモリXの中身の和をレジスタAに保存せよ)という命令は書けても、「ADD メモリX メモリY」などとは書けない。演算対象にしたいデータは、一旦、レジスタにロードする必要がある。
- 2アドレス命令形式
- 演算対象の二つの数値が共にメモリに存在していても、演算できる方式。例えば、「ADD メモリX メモリY」(メモリXの中身とメモリYの中身の和をメモリXに保存せよ)という命令が使える[1]。
- 3アドレス命令形式
- 2アドレス命令形式に対し、データの保存場所を指定できるようにしたもの。例えば、「ADD メモリX メモリY メモリZ」(メモリYの中身とメモリZの中身の和をメモリXに保存せよ)という命令が使える[1]。
命令の依存関係
近年のCPUは、パイプライン処理やアウト・オブ・オーダー実行を行うことが多い。こうしたCPUでは、先行命令より後続命令が先に処理を終える可能性があるので、命令の依存関係が問題になる。命令の依存関係は、以下のように分類できる。
- フロー依存
- 前の命令の結果を、後続の命令が使用する場合。
- 逆依存
- レジスタに関して、前の命令が読み出した後に、後続の命令が書き込まなくてはならない場合。これは、レジスタの個数が多ければ、後続の命令は別のレジスタに書き込めば問題ない(レジスタ・リネーミングという)。
- 出力依存
- レジスタに関して、前の命令と後続命令が結果を同じ場所に書き込む場合。これも、命令の結果を別の場所に書き込めるようにできれば問題ない。
脚注
- ^ a b Hisa Ando『コンピュータアーキテクチャ技術入門 : 高速化の追求×消費電力の壁』技術評論社、2014年6月5日、42頁。ISBN 978-4-7741-6426-7。