4

バイトコード インタープリターのバイトコードを実装するすべてのコードを含む C 関数があります。

バイトコードの値からジャンプするアドレスを直接計算できるように、メモリ内のコンパイル済みコードのセグメントを固定サイズの境界に揃える方法があるかどうか疑問に思っています。配列と同じように機能しますが、計算されたアドレスから読み取る代わりに、それにジャンプしています。

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

これが可能である場合、コンパイラ/アセンブラ (gcc / g++ / as) にどのようにアラインするように指示しますか?

4

3 に答える 3

7

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

GCC の「computed goto」または「labels as values」機能を使用すると、ラベルを配列に入れ、異なるバイトコード命令に効率的にジャンプできます。gcc の計算された goto を使用した高速インタープリターを参照してください。また、この関連するスタック オーバーフローの質問: C/C++ gotoと、ラベルの値に関する GCC ドキュメントも参照してください。

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

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

label:
  /* Code here... */

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

次に、表を使用して別の手順にジャンプできます。

goto *jumptable[i];
于 2009-07-30T14:57:19.340 に答える
0

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

独自のコードを調整したい場合は、gcc__attribute__構文を参照してください。

ld -Ttext オプションも役立つ場合があります。

于 2009-08-27T11:35:49.580 に答える
0

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

個人的には、メモリにデータをロードするときにおそらく配列を使用し、すべてのデータがその配列内の有効なインデックスで始まることを確認します。配列は連続して配置され、比較的簡単に操作できます。Kernighan と Ritchie の著書The C Programming Languageでは、アラインメントに sを使用する手法について言及unionされていますが、それによってポインター演算が簡単になるわけではありません。

于 2009-07-30T23:00:50.393 に答える