在 js 中实现一个虚拟机[欢迎有兴趣者共同研究]
jscript吧
全部回复
仅看楼主
level 1
dark_fox 楼主
先占个位置
2008年06月20日 08点06分 1
level 1
dark_fox 楼主
//-------------------------------------------------------------------- //指令 var optemp = opindex; function _temp(arg1,arg2) { R0 = null; } code.push(_temp); opstr["temp"] = optemp; var opadd = ++opindex; //+ function _add(arg1,arg2) { R0 = arg1+arg2; } code.push(_add); opstr["add"] = opindex; var opsub = ++opindex; //- function _sub(arg1,arg2) { R0 = arg1-arg2; } code.push(_sub); opstr["sub"] = opindex; var opdiv = ++opindex; // '/' function _div(arg1,arg2) { R0 = arg1/arg2; } code.push(_div); opstr["div"] = opindex; var opmul = ++opindex; //* function _mul(arg1,arg2) { R0 = arg1*arg2; } code.push(_mul); opstr["mul"] = opindex; var opmod = ++opindex; //% function _mod(arg1,arg2) { R0 = arg1%arg2; } code.push(_mod); opstr["mod"] = opindex; var opsand = ++opindex; //& function _sand(arg1,arg2) { R0 = arg1&arg2; } code.push(_sand); opstr["sand"] = opindex; var opsxor = ++opindex; //^ function _sxor(arg1,arg2) { R0 = arg1^arg2; } code.push(_sxor); opstr["sxor"] = opindex; var opsor = ++opindex; //| function _sor(arg1,arg2) { R0 = arg1|arg2; } code.push(_sor); opstr["sor"] = opindex; var opand = ++opindex; //&& function _and(arg1,arg2) { R0 = arg1&&arg2; } code.push(_and); opstr["and"] = opindex; var opor = ++opindex; //|| function _or(arg1,arg2) { R0 = arg1||arg2; } code.push(_or); opstr["or"] = opindex; //一元运算 var opinc = ++opindex; //++ function _inc(arg1) { R0 = ++arg1; } code.push(_inc); opstr["inc"] = opindex; var opdec = ++opindex; //-- function _dec(arg1) { R0 = --arg1; } code.push(_dec); opstr["dec"] = opindex; //- 负数 不做为运算对待 var oprev = ++opindex; //~ function _rev(arg1) { R0 = ~arg1; } code.push(_rev); opstr["rev"] = opindex; var opnot = ++opindex; //! function _not(arg1) { R0 = !arg1; } code.push(_not); opstr["not"] = opindex; //比较运算 var opless = ++opindex; //< function _less(arg1,arg2) { R0 = arg1
function _big(arg1,arg2) { R0 = arg1>arg2; } code.push(_big); opstr["big"] = opindex; var opbigA = ++opindex; //>= function _bigA(arg1,arg2) { R0 = arg1>=arg2; } code.push(_bigA); opstr["bigA"] = opindex; var opequal = ++opindex; //== ( = ) function _equal(arg1,arg2) { R0 = arg1==arg2; } code.push(_equal); opstr["equal"] = opindex; var opunequal = ++opindex; //!= ( <> ) function _unequal(arg1,arg2) { R0 = arg1!=arg2; } code.push(_unequal); opstr["unequal"] = opindex; //------------------------------ 数据传送指令 var oppush = ++opindex; //push function _push(arg1) { this.address = 1; switch(arg1) { case "R0": stack.push(R0); break; case "R1": stack.push(R1); break; case "R2": stack.push(R2); break; case "R3": stack.push(R3);
2008年06月20日 08点06分 2
level 1
dark_fox 楼主
break; default: if(varvt[arg1]!=null) { stack.push(varvt[arg1]); } else stack.push(arg1); } } code.push(_push); opstr["push"] = opindex; optype["push"] = 1; //---------------- var oppop = ++opindex; //pop function _pop(arg1) { this.address = 1; switch(arg1) { case "R0": R0 = stack.pop(); break; case "R1": R1 = stack.pop(); break; case "R2": R2 = stack.pop(); break; case "R3": R3 = stack.pop(); break; default: if(varvt[arg1]!=null) { varvt[arg1] = stack.pop(); } else alert("变量["+arg1+"]不存在"); } } code.push(_pop); opstr["pop"] = opindex; optype["pop"] = 1; //---------------- var opmov = ++opindex; //mov function _mov(arg1,arg2) { var temp0; switch(arg2) { case "R0": temp0 = R0; break; case "R1": temp0 = R1; break; case "R2": temp0 = R2; break; case "R3": temp0 = R3; break; default: if(varvt[arg2]!=null) temp0 = varvt[arg2]; else temp0 = arg2; } switch(arg1) { case "R0": R0 = temp0; break; case "R1": R1 = temp0; break; case "R2": R2 = temp0; break; case "R3": R3 = temp0; break; default: if(varvt[arg1]!=null) varvt[arg1] = temp0; else alert("变量["+arg1+"]不存在"); } } //_mov.prototype.address = 1; code.push(_mov); opstr["mov"] = opindex; optype["mov"] = 1; //---------------- var op_data = ++opindex; //.data function _data(arg1,arg2) { varvt[arg1] = arg2; } code.push(_data); opstr[".data"] = opindex; optype[".data"] =1; //------------------------------ var opcall = ++opindex; //call function _call() { funvt[arguments[0].toUpperCase()].run(); } code.push(_call); opstr["call"] = opindex;/* var opinvoke = ++opindex; //invoke function _invoke() { funvt[arguments[0]].run(); } code.push(_invoke); opstr["invoke"] = opindex; */ //-------------------------------------------------------------------- function opcode(op,arg1,arg2) //三地址码 { var temp1,temp2; //document.writeln(op+","+arg1 + (arg2!=null?","+arg2:"")+ "
"); if(isFinite(arg1)) temp1 = parseInt(arg1); else temp1 = arg1; if(isFinite(arg2)) temp2 = parseInt(arg2); else temp2 = arg2; code[opstr[op]](temp1,temp2); return R0; } //------------------------------ function regsel(str) { var temp0=null; switch(str) { case "R0": temp0 = R0; break; case "R1": temp0 = R1; break; case "R2": temp0 = R2; break; case "R3": temp0 = R3; break; default: } return temp0; }
2008年06月20日 08点06分 3
level 1
dark_fox 楼主
汗~~~!多点了一次,谁会删?
2008年06月20日 08点06分 4
level 1
dark_fox 楼主
var opindex =0; //操作码索引 var code = new Array(); //操作实例 /指令 var opstr = new Array(); //用于三地址码和操作码的互相转换 var funvt = new Array(); //函数表 var varvt = new Array(); //变量表 var optype= new Array(); //指令的操作数类型 //--------register var R0 = null,R1 = null,R2 = null,R3 = null; //寄存器 返回值默认存放于 R0 //---------------- var stack = new Array(); //堆栈
2008年06月20日 08点06分 6
level 1
dark_fox 楼主
//-------------------------------------------------------------------- /*funvt 原型*/ function objinterface (alen) { this.arglen = 0;//参数个数 if( alen != null && !isNaN( parseInt(alen) ) ) this.arglen = alen; this.ret = function () { var i=0; for(;i
2008年06月20日 08点06分 7
level 1
dark_fox 楼主

var cmd = null;var tstr= "";var fobj= document.getElementById("readfile");document.getElementById("readfile").onload = function (){ document.getElementById("rfcode").value = fobj.contentWindow.document.body.firstChild.childNodes.item(0).nodeValue ;}function coderun(objt){ varvt = new Array(); var retxt=""; tstr = document.getElementById("rfcode").value; cmd = getASM(tstr); if(cmd != null) retxt = fopcode(cmd);}document.getElementById("readfile").src ="test.txt";
2008年06月20日 08点06分 8
level 1
dark_fox 楼主
// if(a>b,"合格","不合格")//测试脚本//变量声明.data,a,5.data,b,4.data,c,2//代码mov,a,cbig,a,b //比较 a>
bp
ush,不合格 //压入第3个参数push,合格 //压入第2个参数push,R0 //压入第1个参数call,IF //执行 if 函数push,R0 call,ALERTadd,R0,3push,不合格 //压入第3个参数push,合格 //压入第2个参数push,R0 //压入第1个参数call,IF //执行 if 函数push,R0 call,ALERTpush,---谢谢使用RedFox的代码QQ2486950---call,ALERT//一个加法测试mov,R0,1add,R0,3mov,R1,R0mov,R0,R0的值是:add,R0,R1push,R0call,ALERT//一个比较测试mov,R0,1add,R0,3equal,R0,4push,不相等push,相等push,R0call,ifpush,R0call,alert
2008年06月20日 08点06分 9
level 1
dark_fox 楼主
---over
2008年06月20日 08点06分 10
level 1
dark_fox 楼主
一个纯粹为计算目的实现的虚拟机要实现一个通用型虚拟机还要加上[跳转指令\标志寄存器].以及优化增添功能.代码中预留了生成 opcode(字节码)的地方.优化后速度提升应该(按步数算)能提升50%以上测试: asm伪代码 --> 执行没有做如下工作.编译: asm伪代码 --> opcode执行: opcode --> 运行
2008年06月20日 09点06分 11
1