最近、x86 アセンブリ言語と CPU アーキテクチャを学び始めました。int レジスタの総数が 8 であることに気付きましたが、x86-64 では 16 です。
なんで?なんらかの説明が必要です。
最近、x86 アセンブリ言語と CPU アーキテクチャを学び始めました。int レジスタの総数が 8 であることに気付きましたが、x86-64 では 16 です。
なんで?なんらかの説明が必要です。
x86 アーキテクチャは、1970 年代初頭の8008としての初期の化身から進化しました。当時、メモリバイト、つまりオペコードスペースは非常に貴重でした。(当時) A、B、C、D、E、F、(および IIRC) H および L レジスター (すべて 8 ビット) 用に 3 ビットのみが確保されていました。(私は、これらのマシンがプログラミングするのがどれほど大変で、どれほど遅いかを覚えています! メモリの読み取りまたは書き込みの前に、H と L にメモリ アドレスをロードする必要がありました!)
それ以来、Intel は 1980 年代後半の 8080、8086、80186、80286、80386、80486 アーキテクチャを通じて命令セットを進化させ、レジスタを 16 ビットと 32 ビットに拡張しましたが、レジスタを選択するために同じ 3 ビットを維持しました。
AMD が 80486 アーキテクチャの 64 ビット バージョンを設計するまでは、命令プレフィックス バイトを追加することによって 4 番目のレジスタ ビットが追加されました (現在はメモリとオペコード バイトが安価であるため)。このプレフィックス バイトは、本質的に、同じ 3 つのレガシー レジスタ ビットによって選択されたレジスタ番号に「8」を追加します。これは、「レジスタ番号」が命令全体に分散されていることを意味します。これは醜いデコーダになりますが、トランジスタも安価になりました。
16レジスターの言い訳は「レジスタープレッシャー」です。理想的な CPU は、必要なすべての演算をレジスタで実行し、常に十分な数を持っているため、別の計算のためのスペースを確保するためにレジスタをメモリにスピル (格納して後で再ロード) する必要がありません。測定 (および経験) によると、このようなスピルを回避するには 8 つのレジスタでは十分ではなく、スピルがメモリに触れるため、プロセッサの速度が大幅に低下します。32 は (慎重に測定して) 十分な数のレジスターであると考えられていると思いますが、それには2ビットが必要であり、16 は非常に実用的であるために理想に十分近いです。また、AMD はしばらくの間、効果的なハイテク マーケティング機能として、64 ビット製品と、単なる 8 個ではなく 16 個のレジスタを使用することができました。
Intel は、64 ビット プロセッサ戦争で AMD に敗れつつあることを発見し、x86 の独自の 64 ビット拡張を作成しようとしましたが、Microsoft は、AMD 命令セットをサポートしており、2 つの異なる x86 64 ビット命令セットをサポートしないと述べました。Intel は折りたたまれ、AMD が提供した基本的な 64 ビット命令セットと基本的に同じになりました。
これらの CPU の非常に最新のバージョンには、16 個と 32 個の (私が思うに) レジスタのベクトル レジスタ セットがあることがわかります。現在、オペコード ビットははるかに安価であり、命令フェッチ レートは驚異的です。
1978 年のオリジナルの 8086 には数万個のトランジスタが搭載されていたため、すべての命令がマイクロコード化されていました。これは、16 ビット プロセッサの機能を方程式に押し込むために多くの妥協点があることを意味します。これまでで最も成功した 16 ビット プロセッサは、8 つの汎用レジスタを備えた Digital Equipment の PDP-11 でした。8086 では、16 ビット レジスタのうちの 4 つに 8 つのバイト レジスタがあり、これが改善されました。
アドレス変換もマイクロコード化されていました。命令に必要な平均サイクル数は 17 でした。286 ではより多くのトランジスタ (および完全にマイクロコード化されていないアドレス変換ユニット) のおかげでこれが 7 に減少し、386 では 4.4 に、486 では 1.8 になりました。その間、クロック速度は 5 MHz から 100 MHz に増加しました (486 DX-3 で)。
8086 はリアルタイム アプリケーションを対象としており、レジスタが少ないということは、割り込み処理とタスク スイッチが高速であることを意味します。これは、現在の 32 ビット、32 レジスタ RISC プロセッサと比較するのではなく、歴史的な文脈で見る必要があります。
386 は最初の 32 ビット対応プロセッサであり、それは 8086 から 10 年後のことです。16 ビット サブレジスタを持つ汎用レジスタは 8 つしかなく、そのうち 4 つが 8 ビット サブレジスタを持ちます。
8 レジスタ、32 ビット アーキテクチャは、トランジスタを投入しても高速化できないという点に到達しました。むしろ、より多くのトランジスタを使用して 8 レジスタ、32 ビット ソリューションを改善し、それぞれ 64 ビットの 16 レジスタに拡張し、改訂された命令セットを実装するという規模でした。後者が勝った。