0

私が書いている仮想マシンで、次の擬似コードのような方法でコマンドをディスパッチできるようにしたいと考えています。

add: reg[memory[pc+1]] =  reg[memory[pc+1]] + reg[memory[pc+2]]; pc += 2; goto done;
sub: reg[memory[pc+1]] =  reg[memory[pc+1]] - reg[memory[pc+2]]; pc += 2; goto done;
cmp: /* Would take more space than simply x = x + y; */ goto done;

for(int pc = 0; memory[pc] != END; pc++) {
    goto currentPositionInMemorySomehow + (memory[pc] * lengthOfInstruction);
    done:
}

ここで、memory はバイトコードを含む配列で、pc はプログラム カウンターです。ただし、これを行うには、ジャンプするこれらの位置のそれぞれが、次のブロックの前に正確に同じ数の命令を持っている必要があります。同じコードを使用して Linux、Mac、および Windows にコンパイルできる、プラットフォームに依存しない優れたアセンブリ コードがない限り、アセンブリにドロップダウンすることはできません。プロセッサに関係なく、それぞれが上に座っています。どんな助けでも大歓迎です。

4

2 に答える 2

5

あなたが望むものを正確に達成する方法はわかりませんが(計算されたジャンプを許可する唯一のコンパイラはgccです)、単純に を使用することをお勧めしますswitch。これは、最もまともな最適化コンパイラがジャンプテーブル、または計算されたジャンプで、プラットフォームに適した方法で命令の配置を正しく処理します。

于 2011-07-18T18:33:27.423 に答える
2

ターゲット プラットフォームに依存しないサイズの実行可能コードにコンパイルされる C コードを書きたいようです。それはまさに非現実的な目標です。

于 2011-07-18T18:23:52.657 に答える