JITダイナミックコンパイラの原理と実現を実現するための独自のCPU(一)


本編からは、JITダイナミックコンパイラの原理を紹介し、小さな例で実現方法を説明するオリジナルシリーズを開きます.例は主にWINDOWSプラットフォームの下で実現して、VCに基づいて、主に読者が関数のポインタの使用を理解することを必要として、およびいくつかの簡単なアセンブリの知識.ここで各道の達人が観賞して指摘することを望みます!JITダイナミックコンパイラは主に仮想マシンを実現するために用いられ,CPU命令変換方式である.CPUはコンピュータの核心であるため、簡単のために簡単な8ビットCPUを設計し、PCプラットフォームに翻訳するための仮想マシンを実現する.CPUが8ビットに設計されたのは、大端と小端の問題を回避でき、目的がより明確になるからである.このCPUは仮想的であるため,流水線などに関心を持つ必要はなく,CPUレジスタやCPU命令セットに注目すれば十分である.単純化のため、汎用レジスタを定義せず、PCレジスタ(命令アドレスレジスタ)と比較レジスタのみを定義し、読み書き操作はメモリで直接完了する.
これは、次のようにコードで表されます.
typedef struct {
    int R_PC;  //PC 
    int R_CMP; // 
}REG;

extern REG CPUREG;

 
次に、アセンブリ命令セットに対応するマシンコードを定義し、コードで次のように表します.
#define I_NOP  0x00   // 
#define I_MOV  0x01   // 
#define I_ADD  0x02   // 
#define I_CMP  0x03   // 
#define I_JMP  0x04   // 
#define I_JCP  0x05   // 

 
ここでは空命令,データ伝送命令,加算命令,比較命令,無条件ジャンプ命令,比較ジャンプ命令のみを定義し,簡単なプログラムを書くだけで十分である.アセンブリ構文は次のように定義されます.
I_MOV op 0 op 1 op 1アドレスの内容をop 0アドレスI_に送るADD op 0 op 1は、op 0アドレスコンテンツとop 1アドレスコンテンツとを加算し、結果をop 0アドレスI_に送るCMP op 0 op 1は、op 0とop 1のアドレス内容を比較し、レジスタR_よりも小さい場合CMP 0、そうでなければレジスタR_CMPセット1 I_JMP op 0は直接op 0というアドレスにジャンプし、レジスタR_に影響を与えるPCI_JCP op 0 op 1レジスタR_CMPは0で、op 0にジャンプします.レジスタR_CMPは1、op 1にジャンプ
以上、ごくシンプルなCPUを1つデザインしました!