2013-08-13 14 views
7

私は現時点でアセンブリコードの文字列を生成しているC言語で概念実証JITコンパイラを作成しています。 Cのインラインアセンブリ機能は、コンパイル時に認識される文字列リテラルのみを処理するため、生成された実行時コードを実行するために使用できません。Cで動的に生成されたアセンブリを実行する(GNU/Linux)

実行時に機械コードを実行するためにmmap()を使用することについて読んだことがありますが、可能であればマシンコードでの作業は避けてください。

誰もが知っていますか?私はそれをファイルに書き込んで、そのファイルのアセンブラ&リンカを呼び出すことを考えましたが、それは面倒で遅いでしょう。

+1

あなたはアセンブリソースコードを生成すると言っていますか?なぜマシンコード自体を生成しないのですか? –

+0

@DrewMcGowen私はそれが読みにくく、テストするのが難しいと思うし、可能ならばリファクタリングを避けるためには時間が重要です。それは私がする必要があるかのように見えますが。 – AlexJ136

+0

発光アセンブリには多くのライブラリがあります。 [gnu-lightning](https://www.gnu.org/software/lightning/)[llvm](http://llvm.org/)、... – mathk

答えて

2

私は最終的に "JIT"と思っています。マシンコードを生成することを意味する時間に敏感である必要があります。実行するマシンコードと検証するアセンブリコードの両方を生成するデバッグコードを入れて、アセンブラがアセンブリ言語のマシンコードと直接生成したマシンコードを比較し、そのコードをデバッグ/検証する可能であれば、アセンブラはあなたが望むものではなく、自分のことをしたいと思うことがあります)。

+0

実行するマシンコードとデバッグするアセンブリの両方を生成する/テストは、良いアイデアです。これは私がやることだと思います。どうもありがとう。 – AlexJ136

2

私が行ったことは、C/C++/Fortranコードを生成し、それを即時にコンパイルし、DLLにリンクし、DLLを動的にロードすることです。 ASMを生成する以外は同じことができます。 結果のコードのスピードと、生成する言語のコード(および実行時ライブラリ)の柔軟性が必要な場合は、非常に効果的な手法です。

+0

私は機械コードオプションを使うことに決めましたが、これは非常に興味深いアイデアだと思います。私は将来のプロジェクトでそれを検討します。関連する記事/チュートリアルなどを知っていますか? – AlexJ136

+0

@ AlexJ136:記事ですか?学ぶべき重要なことは、1)どのようにDLLを書くか(どのような例もあります)、2)あなたのプログラムの制御下でコンパイラ+リンカを実行するための "shell out"方法、そして3)DLLをロードしてgetプロシージャはエクスポートするアドレスを指定します。 –

関連する問題