オペコード

機械語命令の一部

オペコード (: 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のような特別な命令や、算術、データコピー、論理演算の命令や、プログラム制御命令(分岐命令など)もある。

命令セットアーキテクチャとの関係 編集

機械語命令の仕様やフォーマットは当該プロセッサCPUGPU) の《命令セットアーキテクチャ》 (instruction set architecture, ISA) 内で定められる。オペコードの多くはオペランド(操作対象のデータ)と組み合わせて使う。

オペコードとオペランドは、もともとはx86のもののように、長さが変化する複雑な構造のものが一般的だったが、その後、ほぼ固定された構造で少数のバリエーションのみを持つもの(いわゆるRISCなど)も登場した。[2]

アセンブリ言語のオペコード 編集

アセンブリ言語はニーモニックで記述されるが、ニーモニックのうち操作に関する命令を示すものはやはりopcode(オペコード)と呼ばれる[3][4][5]。やはりオペランド(操作対象を示すコード)と対比される。

仮想機械におけるオペコード 編集

ソフトウェアで実装されたいわゆる仮想機械抽象機械にもオペコードは存在する。具体的には、いわゆるバイトコードやその他の中間表現の中にある。これらのコードは、しばしば相当するハードウェアより高い水準のデータ型と操作をおこなう命令セットに基づいているが、それでも類似のラインに沿って構築される。たとえばJava仮想マシン (JVM) により解釈されるJavaクラスファイルのバイトコード、EmacsのコンパイルされたEmacs Lispバイトコード、.NET 共通中間言語 (CIL) 、そして多くの他のコードなどがある。[6]

関連項目 編集

脚注 編集