4


0

私はバイトコードインタプリタのバイトコードを実装するすべてのコードを含むC関数を持っています。

バイトコードの値からジャンプ先のアドレスを直接計算できるように、メモリ内のコンパイル済みコードのセグメントを固定サイズの境界に揃える方法があるのでしょうか。 配列と同じようにソートされますが、計算されたアドレスから読み取るのではなく、ジャンプします。

次のジャンプを実行するには、すべての「バイトコードコード」セグメントの最後にコードを配置する必要があること、および境界サイズを少なくとも最大セグメントのサイズと同じ大きさにする必要があることに気付きます。

それでも可能であれば、コンパイラ/アセンブラ(gcc / g / as)にその方法で整列させるにはどうすればよいでしょうか。

3 Answer


7


私はこれがまさにあなたが求めているものではないことを認識していますが、これはGCCでバイトコードインタプリタを実装するための標準的な方法です。

GCCの「計算goto」または「値としてのラベル」機能を使用すると、ラベルを配列に配置して、さまざまなバイトコード命令に効率的にジャンプできます。 gccの計算gotoを使用した高速インタプリタを参照してください。 この関連するスタックオーバーフローの質問も見てください。 C/C goto、およびhttp://gcc.gnu.org/onlinedocs/gcc/Labels-as -Values.html [値としてのラベルに関するGCCのドキュメント]。

これを行うためのコードは次のようになります。

void * jumptable [] = {

label:/ *ここにコード... * /

label2:/ *その他のコードはこちら... * /

それからテーブルを使って別の命令にジャンプすることができます。

goto * jumptable [i];


0


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

個人的には、データをメモリにロードするときにおそらく配列を使用し、すべてのデータがその配列内の有効なインデックスから始まるようにします。 配列は連続して配置されており、比較的扱いやすいものです。 KernighanとRitchieの著書 『The C Programming Language』は、整列のために `共用体 'を使用するテクニックについて言及していますが、それはポインタの算術演算を容易にするものではありません。


0


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

あなた自身のコードを揃えたいのなら、gccの `attribute`構文を見てください。

ld -Ttextオプションも役に立つかもしれません。