虚拟器分两种,一种是解释执行的,另外一种是及时编译为机器码运行的(技术难度较高,像模拟器里面的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(...){
//.......
}}
解释执行就是使用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(...){
//.......
}}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货