x64レジスタ名の「R」は何を表していますか?


27

32ビットのレジスタは、拡張を意味する 'E'プレフィックスが付いた16ビットのレジスタのように名前が付けられていました。私はそれが明示的に述べられたことを見たことがなかったが、16ビットから32ビットに拡張されることを意味すると常に考えてきました。

私は「R」が何を意味するのかを見つけようとしていましたが、私のグーグルスキルは私を失敗させました。知ってる?


回答:


32

それはregisterを意味し、歴史的な理由ですべてではありません。

歴史的な部分は、Intelが8008(AからEに加えてHおよびL)の文字でレジスターを列挙する習慣になったことです。マイクロプロセッサのレジスタは非常に少なく、多くのレジスタを取得する可能性が低いため、その方式は当時では十分でした。当時の一般的な感情は、新しいCPUが登場したときにソフトウェアが書き換えられることでした。そのため、モデル間でレジスタの命名スキームを変更することは大したことではありませんでした。IBM PCに組み込まれた後、8088が「ファミリー」に進化することを誰も予見しませんでした。

非歴史的な部分はすべて実用的です。汎用レジスターに文字を使用すると、プログラムカウンター、フラグ、スタックポインターなどの専用レジスターの名前と混同する可能性のあるものを除外する場合、26個に制限されます。

私はそれを確認するソースを持っていませんが、Rプレフィックスとしての選択を疑い、64ビットCPUでR8からR15を導入すると、32ビットの標準である番号付きレジスタへの移行を通知します-ほぼ半世紀にわたって8008から派生したものではない、より大きなアーキテクチャ。IBMは1960年代に360でそれを行い、それに続いてPowerPC、DEC Alpha、MIPS、SPARC、ARM、Intelのi860およびi960、そして長い間忘れられていた他の多くが続きました。

既存のレジスタが存在する場合、R0からR7にうまく収まり、内部でそのように扱われても少し驚かないことに注意してください。既存の長いレジスター(RAX / EAX / AX / AL、RBX / EBX / BX / BLなど)は、おそらく太陽が燃えるまで残ります。


1
少々クライマックスですが、あまり驚かないでください。ありがとう。
マット

3
それがすべてのドラマでした。:-)
Blrfl

非常に興味深い読み物には+1。しかし、それを1行で要約するとしたら、それが答えだったでしょう。これらの豊富で興味深い情報はすべて、要約すると「歴史的理由」にまとめられます。
マイクナキス

6
AMDはなかったに低い8のレジスタの名前を変更するか、エイリアシングを検討r0- r7、または使用するUAX代わりにr8、など。「レジスタに最適な名前を​​付ける方法を見つけることは、実際にはレジスタ拡張を行う上で最も難しい部分の1つでした。」(その他のきちんとしたx86-64履歴については、stackoverflow.com / a / 35619528/224132を参照してください。)また、バイナリエンコーディングの順序はRAX / RBX / ...ではなく、AX、CX、DX、BX
Peterです。 Cordes

9

以前のプロセッサでは、すべてのレジスタが同じではありませんでした。

  • チップには、各レジスタに加算ユニットを配置するのに十分なスペースがありませんでした。
  • 8ビットでは、ソースとデスティネーションのすべての可能な組み合わせに使用できる十分なオペコードがありませんでした。

そのため、加算器が関係するときに特定の1つのレジスタが常に関係していると仮定すると、チップの複雑さが軽減され、オペコードが短くなります。

例えば、6510(Commodore 64で使用)はレジスタAを使用してのみ追加でき、インデックス付けはXまたはYのいずれかを使用しました。INCXおよびINC Y命令はありますが、INC Aはありません。

レジスタの使用法が異なるため、ニーモニックはその使用法を反映して選択されました。たとえば、6510のA、X、およびY(A、B、およびCの代わり)。

8086の名前は、その使用方法も反映するように選択されています。4つの汎用レジスタを使用して、AX、BX、CX、およびDXという名前を付けることは論理的でした。追加のインデックスレジスタはBPおよびSPと呼ばれました(ニーモニック:ベースポインター、スタックポインター)。

多くのオペコードが16ビットに拡張されたため、4つのレジスタのうちの1つが使用されたことを示すためのスペースがありました。ただし、CXは少し特別であったため、歴史的な理由のいくつかが依然として適用されます。REPおよび8ビットオペコードである同類は、常にCXをカウンターとして使用します。単純なニーモニック、CX = Counterは、どちらが使用されているかを覚えるのに役立ちます。

8086の後継のオペコードは後方互換性がなければならず、可変長オペコードの結果として混乱します。32ビットバスがより一般的になると、固定オペコード長のプロセッサが試されました。これにより、CPUのデコード部分が簡素化され、たとえばより多くのレジスタに使用できるスペースが解放されます。

この考え方に従ったプロセッサは、RISCプロセッサ(縮小命令セットCPU)と呼ばれ、CISC(複雑な命令セットCPU)とは対照的です。

レジスタを増やすと、メモリへのスピルオーバーが少なくなります。基本的に、レジスタは利用可能な最速のキャッシュであるため、現在でもレジスタの数を増やすことをお勧めします。特殊な命令の欠如は、単純な命令のより高速なスループットによって(できればそれ以上に)補償されました。

固定長の32ビットオペコードには、ソース、2番目のソース、操作、および宛先を含めるのに十分なスペースがあります。SPARCは、送信元、2番目の送信元、および送信先ごとに5ビットを圧縮することができたため、同時に32個のレジスタが表示されました。

32個のレジスタは文字を使用するには多すぎるため、とにかくほとんど同じであったため、番号を付けることは明らかな選択でした。'R'は定数0..31と区別するために使用され、 'R'はレジスタの簡単なニーモニックでした。したがって、R0..R31。

長年にわたり、Pentiumとその後継機は後方互換性を維持してきました。しかし、より成功したRISCアイデアの多くも組み込まれました。多くの場合、これらの新しいRISCのような命令は、後方互換バージョンよりも高速に実行されます。

レジスタの数もIntelによって増加し、メモリアクセスの数を減らしました。

そして明らかに、IntelはついにR記法の使用を開始しました。下位互換性により、AX、BX、...が確実に維持されますが、AXはR0などの単なる同義語であるに違いありません。


免責事項:上記は私の歴史に関する見解です。歴史の初期の部分を直接目撃したわけではないので、それは不完全です。それにもかかわらず、私はそれが一部に役立つことを願っています。


1
6500ファミリでは、コードが追加のバイトを占有していましたが、即時モードの加算1がINXor と同じ2サイクルかかったため、アキュムレータをインクリメントする専用の命令は本当に必要ありませんでしたINY。私はそのチップ用に多くのアセンブリを作成しましたが、実際には、それを必要とする数学を行う以外では、そのような増分はまれでした。
Blrfl

@Blrflあなたは正しい:ADD 1動作するので、特別な「Increase A」は必要ありませんでした。そして、私はそれを必要としていたことも覚えていません。
シェード

1
x86のレジスタの数を増やして名前を付けたのはIntelではなく、x86の64ビット拡張がAMDによって作成されたAMDであったことに注意してください。Intelの64ビット設計はItaniumでしたが、Itaniumはそれほどうまくいっていませんが、多くの(128の汎用整数に加えて)多くのレジスタを入れました。
8bittree

5

それは単に「登録」を意味します。歴史的な理由から。


現在レジスタを参照している場合、実際にはそれほど歴史的ではありませんか?レジスタのその他の名前(AX、EAXなど)は、歴史的な理由によるものだと思います。しかし、RAXの「R」は実際には非常に現在適用可能です。
カールG

1
(+1)ミーム:「長く説明できるなら、短く説明できます。」
user7813604
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.