虚拟器分两种,一种是解释执行的,另外一种是及时编译为机器码运行的(技术难度较高,像模拟器里面的bleem/pj64都使用了这种技术)
解释执行就是使用switch或者是函数指针数组来做了。
这个就简单了。作一个模型。
我们需要虚拟的cpu
struct ctx_cpu{
LPDWORD ip;
DWORD r1,r2,r3;
};假设cpu的指令长度为4(DWORD),操作数据长度4(DWORD)。#define OPT_NOP 0
#define OPT_NOT 1 //1 dword data   !opt-> r1
#define OPT_ADD 2 //2 dword data   opt1+opt2->r1  
#define OPT_HALT 3
DWORD code[]={OPT_NOP,
              OPT_NOT,10,
              OPT_ADD,10,20,
              OPT_HALT
};
//switch style
void VM(ctx_cpu* cpu)
{
 while(g_bVMRunning){
   switch(*(cpu->ip++)){
     case OPT_NOP:
break;
     case OPT_NOT:
        cpu->r1=!*(cpu->ip++);
        break;
     case OPT_ADD:
        cpu->r1=*(cpu->ip++)+*(cpu->ip++);
        break;
     case OPT_HALT:
        return;
   } 
 }
}
//function table style
bool nop(ctx_cpu* cpu){
return true;
}
bool not(ctx_cpu* cpu){
    cpu->r1=!*(cpu->ip++);
return true;
}bool add(ctx_cpu* cpu){
        cpu->r1=*(cpu->ip++)+*(cpu->ip++);
        return true; 
}bool halt(ctx_cpu* cpu)
{
       throw  "end emulation";
       return false;//never got this
}typedef bool (*_vm_func)(ctx_cpu*);_vm_func   func_table[]={nop,not,add,halt
}
void VM(ctx_cpu* cpu)
{
try{
while(g_bVMRunning){
                  func_table[*(cpu->ip++)](cpu);
}
   }catch(...){
//.......
}}