1

私は実験的な VM を開発しています。現在、安全のために、すべてのタイプのすべてのデータ型操作について個別の指示があります。たとえば、8、16、32、および 64 ビットの符号付きおよび符号なし整数、および float、double、long double 用の ADD 命令があります。これは、1 回の操作で 11 命令です。一部の操作が特定のタイプのみをサポートすることは事実ですが、それでも、多くの命令と非常に少ない余裕しかありません。

そのため、下のタイプに関係なく一部の命令が動作できるかどうか疑問に思っているので、バイトを超えたくないので、数を減らして、将来切実に必要になる命令のための余地を作ることができます指示のために。

4

3 に答える 3

1

各式が実行時に独自の型情報を保持しない限り、非常に多くの選択肢はありません。

実際のプロセッサでは、オペコードと、使用するオペランドの種類をプロセッサに伝えるオペランド コードがあります。たとえば、あなたは言うかもしれません

enum Operator {
    Add,
    Sub,
    And,
    ...
};
enum Operand {
    Memory,
    Immediate,
    Reg1,
    Reg2,
    ...
};
struct Instruction {
    Operator op;
    Operand lhs;
    Operand rhs;
};

また、add や sub などの一部の命令では、符号付きと符号なしの違いを知る必要はありません。これは、2 の補数の利点の 1 つです。

通常、各レジスタは固定幅 (x86 の場合は 32 ビットなど) であり、下位 8 ビットを操作する場合は、最初に AND 演算で残りの 24 ビットをマスクします。もちろん、x86 でも 8 ビット、16 ビットのレジスタを使用して 32 ビットのレジスタの一部を参照できる場合があると思います。

于 2013-08-10T15:10:00.213 に答える
1

、などの代わりにADD、すべてのデータ型に対してそれらを「レジスタ」で操作し、レジスタの残りの部分(存在する場合)をゼロアウト/符号拡張するすべてのデータ型に対して同様の命令をSUB持たないのはなぜですか。MOV

これはもちろん、VM にそのようなものがあることを前提としています。質問にさらに情報を追加することをお勧めします。

于 2013-08-10T15:03:42.710 に答える
0

ADDJava VM は、SUBタイプlong(64) 、double(64 fp) およびint(32)のような特定の操作のみをサポートすることで、この問題を解決します。次に、32 ビット タイプから 16 ビットおよび 8 ビット (符号付きおよび符号なし) に変換するための多くの変換命令を提供します。

もちろん、このアプローチは、必要な変換操作の数が、すべての型に対して特別なADDSUB、などを使用した場合に生じる操作の数よりも少ない場合にのみ有利です。MULDIV

2 つの 16 ビット変数の追加が必要な場合は、それらを16_to_32命令で 32 ビット レジスタに移動し、32 ビットを実行しますADD_32。次に、結果を取得し32_to_16、16 ビット変数に合わせて結果を切り捨てるビット操作で 16 変数ビットに変換します。

その後x_to_y、命令によって、符号付きまたは符号なしの変換に必要な符号拡張またはゼロ拡張を処理できます。

jvm がこれを行う方法に興味がある場合は、jvm の仕様を参照してください。

于 2013-08-10T15:22:57.997 に答える