2016-04-10 15 views
5

x64のインテルによれば、以下のレジスタは汎用レジスタ(RAX、RBX、RCX、RDX、RBP、RSI、RDI、RSP、R8~R15)https://software.intel.com/en-us/articles/introduction-to-x64-assemblyと呼ばれています。rpbとrspが汎用レジスタと呼ばれるのはなぜですか?

以下の記事では、RBPとRSPが専用レジスタ(RBPが現在のスタックフレームの基点を指し、RSPが現在のスタックフレームの先頭を指している)と書かれています。 https://www.recurse.com/blog/7-understanding-c-by-learning-assembly

私は2つの矛盾した声明を持っています。 Intelのステートメントは信頼できるものでなければなりませんが、何が正しいのですか、なぜRBPとRSPが汎用と呼ばれるのですか?

ありがとうございました。

+4

両方を汎用レジスタとして使用することができます。これは、通常の算術演算命令と論理命令で正常に動作することを意味します。 'rbp'はかなり一般的な目的ですが、フレームポインタは単なる慣習です。 – Jester

+0

一部の命令では、すべてのレジスタに特殊な機能(R8〜R15を除く)があります。 RSPの場合、 'push' /' pop'/'call' /' ret'のために特別なので、ほとんどのコードは決してそれを他のものに使うことはありません。しかし、制御された条件付き(シグナルハンドラなしのような)では、スタックポインタとして*使用する必要はありません。例えばこのコードを使用して、[this code-golf answer](https://codegolf.stackexchange.com/questions/133618/extreme-fibonacci/135618#135618)のように、 'pop 'というループで配列を読み込むことができます。 (私は実際には 'esp'を32ビットコードで使用しましたが、同じ違いです)。 –

+0

"specialness"の定義をエンコーディングに拡張しても、r13でも少し特殊ですが、実際にはすべてのアドレッシングモードを効果的に使用できるという点では機能しません。あなたのために隠されたゼロ変位)。 – BeeOnRope

答えて

8

一般的な目的は、汎用レジスタを使用して計算を行う命令でこれらのレジスタをすべて使用し、たとえば命令ポインタ(RIP)またはフラグレジスタ(RFLAGS)で必要な処理を実行できないなどです。

これらのレジスタのいくつかは、特定の用途に使用されることが想定されており、一般的に使用されています。最も重要なのはRSPとRBPです。

自分の目的に使用する必要がある場合は、内容を保存してから、元の値に復元する必要があります。

+0

一部のコンパイラには、フレームポインタを使用しないオプションがあります。この場合、RBPは汎用コンピュータになります。 – rcgldr

+2

フレームポインタとしての 'rpb'の使用は本質的に完全に_convention_であり、実際にはCPUをサポートしていないことに注意してください(実際、Windows 64 ABIではフレームポインタとして任意のレジスタを使用できます。 「rbp」)。これは、 'push'、' pop'、およびfriendsによって暗黙的に使用されるので、ハードウェアレベルでその関数に強く束縛されている 'rsp'とは非常に異なります。 – BeeOnRope

+0

@BeeOnRopeあなたのコメントをありがとう、答えが更新されました。 – jlliagre

関連する問題