オペコード
オペコード (英: opcodeあるいはOpCodeあるいはoperation code) は、操作(operation)に関する命令のコードという意味で、具体的には
- プロセッサに与える、操作に関する(機械語の)命令の識別番号[1]。操作対象を示すオペランドと対比される。
- (機械語に限らず)操作に関する命令のコード。やはり操作対象を示すオペランドと対比される。アセンブリ言語や仮想機械などの用語として用いられる。
操作(operation)に関する命令のコード(code) だからオペレーションコード(operation code)と呼ばれ、通常は略してオペコード(opcode, OpCode)と呼ばれている。
機械語のオペコード
[編集]機械語関連の用語としては、操作命令の識別番号である。
例えば、Intel 8086の「指定されたレジスタの値を、指定されたメモリ番地に書き込め」という命令に割り当てられたオペコードは二進表記(ビット列)では「10001000」であり、16進表記では「0x88」であり、十進表記では「136」である[1]。8086のオペコードの一覧表はこちら[1]に掲載されている。
各CPUごとに、命令セットアーキテクチャ(ISA:Instruction Set Architecture)が定められており、その中でオペレーションコードが定められている[1]。
オペコードの多くは、操作対象のデータを示すオペランド(被演算子)と組み合わせて使う。
喩えるなら、オペコードは数式における演算子のようなものであり、一方、オペランドは数のようなものである。演算子は基本的には数と組み合わせて使うように、オペコードは基本的にはオペランドと組み合わせて使う。
ただし、オペコードの中には暗黙的なオペランドを持つものもある。
オペコードが示す操作命令は、主にはレジスタ、コールスタック、他のメモリなどへデータを書き込む命令である。I/Oポートに関する命令もある。アドレッシングモードを利用して指定されアクセスされる。またCPUIDのような特別な命令や、算術、データコピー、論理演算の命令や、プログラム制御命令(分岐命令など)もある。
命令セットアーキテクチャとの関係
[編集]機械語命令の仕様やフォーマットは当該プロセッサ(CPUやGPU) の《命令セットアーキテクチャ》 (instruction set architecture, ISA) 内で定められる。オペコードの多くはオペランド(操作対象のデータ)と組み合わせて使う。
オペコードとオペランドは、もともとはx86のもののように、長さが変化する複雑な構造のものが一般的だったが、その後、ほぼ固定された構造で少数のバリエーションのみを持つもの(いわゆるRISCなど)も登場した。[2]
アセンブリ言語のオペコード
[編集]アセンブリ言語はニーモニックで記述されるが、ニーモニックのうち操作に関する命令を示すものはやはりopcode(オペコード)と呼ばれる[3][4][5]。やはりオペランド(操作対象を示すコード)と対比される。
仮想機械におけるオペコード
[編集]ソフトウェアで実装されたいわゆる仮想機械や抽象機械にもオペコードは存在する。具体的には、いわゆるバイトコードやその他の中間表現の中にある。これらのコードは、しばしば相当するハードウェアより高い水準のデータ型と操作をおこなう命令セットに基づいているが、それでも類似のラインに沿って構築される。たとえばJava仮想マシン (JVM) により解釈されるJavaクラスファイルのバイトコード、EmacsのコンパイルされたEmacs Lispバイトコード、.NET 共通中間言語 (CIL) 、そして多くの他のコードなどがある。[6]