可変長のバイナリデータで表現されています。
例えば、EAXというレジスタ(CPU内の変数)を操作する
基本的な命令だけでも、
0x40: EAXを1増やす
0x01 0xc8: EAXにECXを足す
0x08 0x78 0x56 0x34 0x12: EAXに0x12345678を代入する
など、命令によって長さはバラバラです。
さらに、あまり使わない命令には
0x3eなどをつけて区別しましょうとか、
最初に0x0fをつけて新しい命令を区別しましょうとか、
そういう「命令を区別するための1バイトのコード」によって、
命令コードはかなり複雑になってしまっています。
この、1バイトのコードはプリフィックスと呼ばれています。
複雑な可変長コードは、たぶん、昔メモリが足りなかった頃に、
なるべくバイナリコードが短くなるように工夫した結果なのでしょう。
当時はそれで良かったのでしょうけど。
最近のCPUだと、プリフィックスが大量についたために
命令の解析がとても大変になっているみたいです。
コンピュータに実行してもらう命令を解析する部分が、
クロックとか消費電力のボトルネックになっちゃうわけです。
インテルは64ビットCPUを作る時点で一度、
この複雑なプリフィックス命令を捨てた、
新しいCPUを作る試みをしていたのですけど。
この新しい64ビットCPUは結局、
x86をほとんどそのまま64ビットに拡張した、
AMDの64ビットCPUに負けてしまいました。
今のCore 2などに搭載された64ビット拡張は、
AMDのCPUと互換の64ビット拡張に対応したものです。
で。
インプレスの記事を見ていて気づいたのですけど。
インテルはもう一度、複雑な命令を捨てる試みをするみたい。
ただ、今度は命令をフルスクラッチするのではなくて、
新しい命令を区別する1バイトを最初において、
続くコードを綺麗に設計しなおしたものとするみたい。
たぶん、新しい命令にうまく移行できたときには、
古い命令をエミュレーションに切り替えるつもりなのでしょう。
今度はうまくいくのかしら。
同じコトができるのなら
無駄が少ないほうがうれしいのですけど。
【関連する記事】