2016-04-09 4 views
0

プログラムに制御フロー監視コードを注入しています。私はGCC Cコンパイラ(フラグ-S)によって生成されたアセンブリコードを取得します。次に、アプリケーション内のすべての間接的な分岐の前に、アセンブリでいくつかの監視コードを追加します。これらの監視コードはいくつかのレジスタを使用する必要があり、したがって、私はコードを注入するすべてのブランチに対して、以前に書き込まれた値を保存して戻すために使用するレジスタをプッシュしてポップする必要があります。gccの特定のレジスタを使用せずにCコードからアセンブリコードをコンパイル

しかし、パフォーマンスが問題であるため、Cコードをアセンブリコードに変換して、アセンブリコードを生成するようにGCCに指示するとプッシュポップを避けることができないのでしょうか?したがって、間接的な分岐ごとにプッシュポップを使用して既存の値をレジスタに保存することは避けられます。

これを行う方法はありますか?

+1

はい、[マニュアルのグローバルレジスタ変数](https://gcc.gnu.org/onlinedocs/gcc/Global-Register-Variables.html)を参照してください。 – Jester

+0

私は見るが、私の質問には答えないと思う。私はCコードを変更したくありません。コンパイラに特定のレジスタを使わないように伝えたいだけです。たとえば、Cコードの最適化レベルを下げて特定のコードに対して行うことができます。しかし、それは私が望むものではありません。 –

+2

別のファイルにそれを貼り付け、 '-include'コンパイラオプションを使ってそれをインクルードするのは簡単です。 – Jester

答えて

2

-ffixed-regオプションを参照してください。

引数を渡すなどのために問題のレジスタを使用する必要がある場合、これは機能しません(実際には、gccはそれを暗黙に使用します)。

関連する問題