私は比較的新しいアセンブリで、powerpcチップを使用しています。私はgccのクロスコンパイラを使用していて、ビルドルート環境で作業しています(バックグラウンドのみ)。PowerPCアセンブリの位置依存、独立したコード、およびグローバル変数
私は、.elfオブジェクトを作成するコードの.headセクションにコードを追加しています(引数としてtarget.elfを呼び出すことができます)。これはbuildroot経由でより大きなバイナリに変換されます。 target.elfは、コードとローカルリンカーのアドレス0x0から開始して定義されますが、後で別のアドレスの場所に移動されます。私はアセンブリコードからアセンブリコードとcファイルの間で共有されているグローバル変数を参照したいと思います。私が場所に依存しない手段を使ってそうすると、私は問題にぶつかります。 GOTを参考にして使用すると(シンボル@hがあるなど)、シンボルを正しく参照することができます。
これは、入力時にスタックまたはTOCへの有効なポインタを持つことに依存しない割り込みハンドラを作成したいので、問題です.GOTを使用するにはTOCが必要です。
TOCなしでこれを行う方法はありますか?私はまた、C-ファイル内のシンボルを定義しようとしている
.global symbol
symbol:
.long 0
.global irq_handler
irq_handler:
addi %r3, 0, 0
ori %r3, %r3, [email protected]
ld %r3, 0(%r3)
b .
In global area of C-file:
extern uint64_t symbol;
(そう:
誤った結果(%r3のが「記号」は何を含むか含まれていません):ここでは
は、いくつかのサンプルコードですexternではなくグローバルとして)、asmファイルの定義を省略します。これも失敗しました。
また、上位32ビットが0x0であるため、ショートカットをとり、アドレスの@l部分だけをロードします。正しい例ではTOCは、%R2で利用可能であることを
.global irq_handler
irq_handler:
ld %r3, [email protected](%r2)
ld %r3, 0(%r3)
b .
注:
正しい結果(%r3が "記号" が含まれているものを含んでいません)。
ありがとうございます。
*「スタックへの有効なポインタを持つことに依存しない割り込みハンドラ」*を持つ方法が分かりません。* –
割り込みハンドラは、別の*コンテキストに分岐する手段を提供します。この状況では、新しいコンテキストに分岐する前に、現在のコンテキスト(レジスタ)を既知の場所にバックアップします。私が返すと、レジスタは未定義の状態になります。 irqが再びトリガされると、私は元のコンテキストを復元しますが、TOCを復元する前に "symbol"を参照したいと考えています。割り込みハンドラは、あまり詳細になることなく、他の機能も処理します。 – Tyler
上記コメントの説明:同じ割り込みハンドラを再度呼び出すと、他のコンテキストからの戻りが容易になります。再び呼び出されると、レジスタは不明な状態になり、 "symbol"をチェックした後に復元されます。 – Tyler