web-dev-qa-db-ja.com

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

32ビットレジスタは、拡張を意味する接頭辞「E」が付いた16ビットレジスタのように名前が付けられたことを知っています。私はそれが16ビットから32ビットに拡張されていることを常に想定していましたが、明示的に述べられているのを見たことはありません。

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

28
Matt

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

歴史的な部分は、Intelが8008(AからEに加えてHとL)の文字でレジスタを列挙する習慣を身につけたことです。マイクロプロセッサには非常に少数のレジスタがあり、それ以上取得する可能性は低く、ほとんどの設計でそれが可能だったため、そのスキームは当時は十分以上でした。そのときの一般的な感情は、ソフトウェアが登場したときに新しいCPU用に書き直されるというものだったので、モデル間でレジスターの命名体系を変更することは大したことではなかったでしょう。 8088がIBM PCに組み込まれた後に「ファミリー」に進化することを予見する人は誰もいませんでした。下位互換性のヨークにより、インテルは32ビットレジスタに「E」のようなスキームを採用してそれを維持することを余儀なくされました。

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

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

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

33
Blrfl

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

  • 各レジスタに加算ユニットを配置するのに十分なスペースがチップ上にありませんでした。
  • 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つのレジスタのうちどれが使用されたかを示すためのスペースがありました。ただし、CXが少し特殊だったので、歴史的な理由のいくつかはまだ適用されています。8ビットのオペコードであるREPなどは、常にCXをカウンターとして使用します。単純なニーモニック、CX = Counterは、どちらが使用されているかを覚えておくのに役立ちます。

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

この考え方に従ったプロセッサーは、CISC(Complex Instruction Set CPU)とは対照的に、RISCプロセッサー(Reduced Instruction Set CPU)と呼ばれます。

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

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

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

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

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

そしてどうやら、インテルはついにR表記を使い始めました。下位互換性により、AX、BX、...が残ることが保証されますが、AXは単なる同義語だと思います。 R0。


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

9
Sjoerd

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

5
Mike Nakis