2009-07-30 5 views
4

私は、バイトコードインタープリタのバイトコードを実装するすべてのコードを含むC関数を持っています。GCC/G ++/ASで固定サイズのメモリ境界にネイティブコードを整列させますか?

バイトコードの値からジャンプするアドレスを直接計算できるように、コンパイルされたコードのセグメントをメモリに固定サイズの境界に揃える方法があるのでしょうか?並べ替えと同じように配列が動作しますが、計算されたアドレスから読み込む代わりに、私はそれにジャンプします。

私は、すべての「バイトコードコード」セグメントの最後に次のジャンプを実行するコードを入れなければならないことを認識しています。また、境界サイズを少なくとも最大のサイズと同じにする必要がありますセグメント。

これが可能であれば、私はコンパイラ/アセンブラ(gcc/g ++/as)にこう言ったようにどのようにアライメントするのでしょうか?

答えて

7

これはあなたが求めているものではありませんが、これはGCCでバイトコードインタープリタを実装する標準的な方法です。

GCCの「計算されたgoto」または「値としてのラベル」機能を使用すると、ラベルを配列に配置して、さまざまなバイトコード命令に効率的にジャンプできます。 Fast interpreter using gcc's computed gotoを参照してください。また、この関連するスタックオーバーフローに関する質問:C/C++ gotoGCC documentation on labels as valuesを見てください。これを行うには

コードは次のようなものになります。

void* jumptable[] = {&&label1, &&label2}; 

label: 
    /* Code here... */ 

label2: 
    /* Other code here... */ 

をあなたは、テーブルを使用して、異なる命令にジャンプすることができます

goto *jumptable[i]; 
0

あり二つの問題がここにありますが、答えは同じ。まず、(バイナリ)データを(バイナリ)ファイルに書き込んでいます。次に、そのバイナリデータをメモリにロードします。ディスク上のどこに移動するかを制御し、メモリ内のどこに移動するかを制御します。あなたはあなたが探しているものを簡単に計算することができます。

個人的には、データをメモリにロードするときにはおそらく配列を使用し、すべてのデータがその配列の有効なインデックスで開始されていることを確認します。配列は連続して配置されており、比較的操作が簡単です。 KernighanとRitchieの本Cプログラミング言語には、整列にunionを使用する技術が記載されていますが、これはポインタの算術演算を容易にしません。

0

Linuxを使用している場合は、posix_memalign()を使用してください。私はWindowsに似た機能があると確信しています。

独自のコードを整列させたい場合は、gcc __attribute__構文を見てください。

ld -Ttextオプションも役立ちます。

関連する問題