コンピュータ命令とは|定義・命令語長・オペコードとアドレッシング解説
コンピュータサイエンスでは、命令とは、プロセッサ命令セットによって定義されたプロセッサの単一の操作のことである。
命令のサイズや長さは大きく異なり、マイクロコントローラの中には4ビットのものもあれば、非常に長い命令語(VLIW)システムの中には1バイトの数倍にもなるものもあります。パーソナルコンピュータ、メインフレーム、およびスーパーコンピュータで使用されている最新のプロセッサのほとんどは、16ビットから64ビットの命令サイズを持っています。いくつかのアーキテクチャ、特に縮小命令セットコンピュータでは、命令の長さが固定されており、通常はそのアーキテクチャのワードサイズに対応しています。
従来のアーキテクチャでは、命令は、「メモリの内容をレジスタに追加する」などの実行される操作を指定するオペコードと、レジスタ、メモリの位置、またはリテラル・データを指定するゼロまたはそれ以上のオペランド指定子を含みます。オペランド指定子は、その意味を決定するアドレッシング・モードを持っていてもよいし、固定フィールドであってもよい。
多くのマイクロコードアーキテクチャを含むVLIWアーキテクチャでは、複数の同時演算とオペランドが1つの命令で指定されます。
命令がマシンコードの形で指定されることはほとんどありません。
プロセッサの命令セットに関連したものだけでなく、「命令」のより一般的な定義がもう一つあります。命令」は、実行可能なコンピュータプログラムの要素を表現したものである可能性があります。
命令(Instruction)の基本的な定義と役割
命令は、プロセッサが実行する「基本的な操作」を表す最小単位です。典型的には、ある演算(加算、比較、ロード/ストア、分岐など)と、その操作対象(オペランド)を指定します。命令はCPUの内部でフェッチ(取り出し)→デコード(解釈)→実行という段階を経て処理されます。
命令語長(命令サイズ)とその違い
命令語長はアーキテクチャによって大きく異なります。短い命令語長はメモリ節約やキャッシュ効率の向上に寄与しますが、複雑なオペランド指定や多くの機能を表現するには長い命令語が必要になることがあります。代表的な傾向は次のとおりです:
- 小型の組み込み系や一部のマイクロコントローラでは、非常に短い命令(4ビット〜8ビット)を採用することがある。
- 多くのデスクトップ/サーバ向けプロセッサは、16〜64ビット程度の命令フィールドを基本としている(ただし可変長命令を持つ場合も多い)。
- RISC(縮小命令セットコンピュータ)系では命令長が固定され、デコードが単純でパイプライン化が容易になる(例:32ビット固定長)。
- VLIWや一部のCISC系(例:x86)は可変長命令で、命令の長さが用途に応じて増減する。
命令形式:オペコードとオペランド
従来の命令は主に次の2つの部分で構成されます。
- オペコード(opcode):実行する操作を指定するフィールド。たとえば「加算」「ロード」「ジャンプ」など。
- オペランド(operand):オペコードが作用するデータの位置や値を示すフィールド。レジスタ番号、メモリアドレス、即値(リテラル)などが含まれる。
オペランドはゼロ個のものもあれば複数個のものもあり、命令フォーマットは各アーキテクチャで定義されています。オペランドの解釈にはアドレッシング・モードが関係します。
アドレッシング・モード(主な種類)
アドレッシング・モードは、命令内のオペランドがどのようにデータを参照するかを決めます。代表的なモード:
- 即値(Immediate):命令内に値が直接埋め込まれる。
- レジスタ(Register):レジスタ番号で指定されたレジスタを参照。
- 直接(Direct or Absolute):命令内に格納されたメモリアドレスを直接参照。
- 間接(Indirect):レジスタやメモリに格納された値をアドレスとして使用して参照。
- インデックス(Indexed)/ベース+オフセット:ベースアドレスにオフセットを加算して参照。
- 相対(Relative):現在の命令位置(プログラムカウンタ)からの相対位置で分岐先を指定。
命令セット設計の考慮点:RISCとCISC
- RISC:命令数は少なく単純(固定長命令が多い)。デコードが簡単でパイプラインや高クロック化に有利。
- CISC:複雑な命令を1つで表現できる場合があり、コード密度が高くなる。x86のように可変長命令を持つものが典型。
VLIW、マイクロコード、マイクロオペレーション
VLIWアーキテクチャでは、1命令語に複数の演算を並列で記述でき、コンパイラが並列度を高めるようスケジューリングします。これに対し、マイクロコードを持つアーキテクチャでは複雑な上位命令を内部の単純なマイクロオペレーション列(マイクロ命令)に分解して実行します。現代の複雑なCPUは、CISC命令を内部的に複数の簡単なマイクロオペ(micro-ops)に分解して処理することが一般的です。
マシンコードとアセンブリ、プログラム上の「命令」
命令は通常、バイナリ形式のマシンコードの形でメモリに配置されますが、開発者は人間に読みやすいアセンブリ言語で命令を記述し、アセンブラがマシンコードに変換します。さらに広い意味では、実行可能なコンピュータプログラムの「命令」は、関数呼び出しやスレッド制御、システムコールなど高レベルな操作も含むことがあり、抽象的な「命令(指示)」として扱われることがあります。
実例(簡潔)
- x86(CISC):可変長命令。単一命令で複雑なメモリ操作を行える反面、デコード回路は複雑。
- ARM(RISC):従来は32ビット固定長命令。省メモリのために16ビット短命令セット(Thumb)も提供。
- 組み込み向けMCU:命令語長が短く、限られたリソースで効率良く動くよう設計されている。
要点のまとめ
- 命令はCPUが実行する基本操作を表す単位で、オペコードとオペランドから構成される。
- 命令語長や形式はアーキテクチャに依存し、固定長か可変長かで設計思想が分かれる。
- アドレッシング・モードはオペランドの参照法を定義し、命令の柔軟性に大きく関わる。
- VLIWやマイクロコードといった内部実装の違いにより、同じ高位の命令が内部で異なる実行形態になる。
- マシンコードとアセンブリの違い、そしてプログラム上の「命令」の広い意味も理解しておくとよい。
さらに詳しい例や各アーキテクチャ固有の命令フォーマットについて知りたい場合は、用途に応じて具体的なプロセッサ名(例:x86、ARM、RISC-V、MIPS など)を指定してください。設計思想や命令フォーマットの図解、実際のバイナリ例を用いて説明します。
関連ページ
質問と回答
Q:コンピュータサイエンスにおけるインストラクションとは何ですか?
A:コンピュータサイエンスにおける命令とは、プロセッサ命令セットで定義されたプロセッサの単一演算のことです。
Q:命令の長さはどれくらいですか?
A:命令の長さは様々で、マイクロコントローラでは4ビット、VLIWシステムでは数バイトになります。パーソナルコンピュータ、メインフレーム、スーパーコンピュータに使用されている最新のプロセッサの命令サイズは16ビットから64ビットの間である。一部のアーキテクチャ、特に縮小命令セットコンピュータ(RISC)では、命令はそのアーキテクチャのワードサイズに対応した固定長になっています。
Q:命令には何が含まれますか?
A: 命令には、「メモリの内容をレジスタに追加する」などの実行する操作を指定するオペコードと、レジスタ、メモリ位置、またはリテラルデータを指定できるゼロまたはそれ以上のオペランド指定子が含まれます。オペランド指定子は、その意味を決定するアドレス指定モードを持つこともあれば、固定フィールドにあることもあります。VLIWアーキテクチャでは、1つの命令で複数の同時演算とオペランドを指定します。
Q:命令は通常どのように指定されるのですか?
A:命令は機械語コードで指定されることはほとんどありません。プログラマがアセンブリ言語を用いて指定するか、より一般的にはコンパイラが生成します。
Q:「命令」には別の定義があるのですか?
A:はい、「命令」には、プロセッサ命令セットに関連するものだけでなく、より一般的な定義があります。それは、実行可能なコンピュータ・プログラムの要素を表すあらゆる表現です。
Q:すべての命令は同じ大きさですか?
A:いいえ、命令のサイズは使用するプロセッサの種類によって大きく異なり、4ビットからVLIWシステムでは複数バイトまで、最近のプロセッサでは16ビットから64ビットまでのものが多く、RISCアーキテクチャではそのアーキテクチャのワードサイズに対応した固定長の命令が一般的です。