ARMプロシージャコール標準に従ってr12がスクラッチレジスタとして指定されているのはなぜですか?保存されたレジスタの2つのグループ、すなわちr4-r11とsp-lr-pcの間に置かれます。 r0-r4を一時的にして、それ以外はすべて保存してみませんか?ARMプロシージャコール標準のr12
答えて
ARMは数値が増減する順序で値を格納してロードするSTM
およびLDM
命令を持つことに注意してください。レジスタR0〜R3はパラメータと戻り値として使用され、必要に応じて「呼び出し側で保存されます」。レジスタR4〜R8は、呼び出し先に保存されたレジスタです(多分もっと多くのレジスタ)。また、R13〜R15は特殊レジスタです。 R12を使用すると、グループを別々に扱いたい場合(コンテキスト・セーブ、ファンクション・コール、シグナルなどすべてが異なる要件を持つ)、LDM/STMを使用してレジスタのグループをかなり効率的にアクセスできます。
関数のエピローグとプロローグコードは、計算を実行したり、値を保存する必要があります。これにはスクラッチ・レジスタが必要です。したがって、LDM/STMおよび他のARMアドレッシングモードでは、スクラッチレジスタは連続シーケンスを破棄してはいけません。コンテキストとコードの生成方法に応じて、呼び出し元レジスタと呼び出し先レジスタの両方を保存/復元する必要があります。 R4で休憩するのは良い選択肢ではありません。最も影響の少ない自然なブレークは、呼び出し先と上位組み込みレジスタ(PC、SP、LR)の間にあります。 R9-R11は、先のAPCSのシステム(スタティック・ベース、スタック・エクステント、フレーム・ポインタ)に応じて特殊レジスタにすることができます。これらはオプションであるため、システムによってはR4-R8ごとに保存される可能性があります。
ARMプロシージャコール標準に従ってr12がスクラッチレジスタとして指定されているのはなぜですか?
whyは非常に厳しい質問です。同様の機能のために連続したレジスタを使用しないようにすることが複雑になることを考えると、覚えておく方がはるかに簡単で、一部のARM命令ではより柔軟性があります。また、コード生成の実装は、呼び出し先保存レジスタを知るために上限を保存するだけで済むので、おそらく簡単です。目標は機能のエピローグ/プロローグを可能な限り速くすることでした。これは、機能とシステム要件によって異なります。なぜスクラッチ・レジスタが必要なのかは明らかです。パラメータに基づく可変サイズの配列は、複数のスタック予約なしで実装するのが困難です。信号などの一部のコードは、FP
に依存して、プロローグ中にアトミックに設定されることがあります。つまり、スタックポインタとフレームポインタが設定されているか、間に合わないことになります。 IP(r12)は、ベニアやその他のリンケージトリック(PLT、GOTなど)にも役立ちます。 R12を選択すると、R9-R11を類似のレジスタのシーケンスを中断させることなく、呼び出し先保存汎用レジスタとして使用するシステムもあります。 APCSから
、
IPレジスタは、関数呼び出しの間に専用の役割を担っています。他の時にはスクラッチレジスタとして使用することができます。
(脇に:通常、ipはローカルコードジェネレータの一時レジスタとしてコンパイラコードジェネレータによって使用されます)。
残念ながら、APCSはAAPCSによって廃止されたので、ARMはこれ以上提供しません(Web参照は見つけにくい)。しかし、ARM ABIの進化を見通しています。
ここで最も重要なポイントは、「IP」はアセンブラプログラマーはあなたのアセンブリが動作する必要があるかもしれないコンパイラを見るのでなければ、おそらく意味をなさないでしょう(つまり、それはなぜですか?)。 IPが「アセンブリコーダー」にとって重要なリンカー、ローダー、共有ライブラリシステムを実装する人はほとんどいません。通常、スタックフレームを組み立てることは望ましくありません。 –
AAPCSガイドhttp://infocenter.arm.com/help/topic/com.arm.doc.ihi0042f/IHI0042F_aapcs.pdfの14,15、および18は、R12のIntra- プロシージャコールスクラッチレジスタ(IP)の使用を定義しています。これは、ブランチ・アンド・リンク(BL)命令がアクセスできない32ビット・アドレス空間にアクセスするためにリンカによって使用されます。
これらはr4または他のレジスタを使用できました。質問に答えない。 –
@old_timer Page 15 r12-r15には特別な役割があります。言い換えれば、r12はr13-r15でグループ分けされています。 –
うん、 "なぜ"の質問に答えることはありません。 SP、LR、PCは特殊なレジスタですが、IPは任意ですが、命令セットの特別なレジスタではなく、アーキテクチャリファレンスマニュアルで読むことができます。それは特別なレジスタとして呼び出されないからです。だから、これは "なぜ"の質問に答えません。 「なぜ」の質問の99.99999999%は本当の答えがなく、このサイトでは本当の価値がありません。 –
- 1. .NET標準ライブラリと.NET標準
- 2. AVR-GCCの標準準拠
- 3. android sdk r12を更新した後のAndroidカスタムアラートダイアログエラーr12
- 4. 標準へのアップグレードSQL Server 2005 Expressの標準へのアップグレード
- 5. Facebookの標準ステータスアップデートポップアップ?
- 6. 標準名のjava.lang.reflect.Type
- 7. Python MySQLの標準
- 8. 標準MLのGUI?
- 9. HDディスプレイの標準
- 10. Bigrqueryの標準SQL
- 11. Linuxの.NET標準
- 12. 標準jreのJavaFx
- 13. Python MixInの標準
- 14. 標準の動作
- 15. UNIX_TIMESTAMP()のANSI標準
- 16. 標準MLのフィボナッチオーバーフロー
- 17. JSF標準コンバータ
- 18. 標準ユーザー
- 19. 標準文書
- 20. TYPO3 - 標準タグ
- 21. エンティティフレームワークパフォーマンスコーディング標準
- 22. 標準エラーログ
- 23. WiX標準ダイアログ
- 24. 標準MLバイナリツリートラバーサル
- 25. @コンポーネントスプリングアノテーション標準スコープ
- 26. UIToolbar標準サイズ
- 27. CSS標準モード
- 28. Delphiコーディング標準
- 29. 標準HTML5アニメーション
- 30. 標準アナライザ
あなたの提案は何が望ましいでしょうか? Downvoteはこの質問が多くの研究を示していないためかもしれません - それではうまく答えにくいです。 –
私は、新しい人々のための多くの下の投票が新しいものについて理解し、学ぶことを試みるのを見る。私は落胆を落胆と見て、役に立たない。 – bstipe
@SeanHoulihane私はARMアセンブリを学習していますが、r4-r11とr13-r15は保存されていますが、r12を保存レジスタにしないという決定の背後にある理由を理解しようとしています。 –