随笔-341  评论-2670  文章-0  trackbacks-0
    今天完成了文本格式汇编代码的编译工作。这主要是为了调试,因为编译器不可能产生文本格式的汇编代码,这样会很浪费资源。翻译过程如下:

    先看看一个汇编程序的例子。
 1 CONSTANT
 2   COUNT int32:10
 3   DATA int32:1,2,3,4,5,6,7,8,9,10
 4 VARIABLE
 5   RESULT int32
 6 CODE
 7   XOR EAX, EAX
 8   MOV EDI, int32 COUNT
 9   MOV ECX, int32 [EDI]
10 @BEGIN:
11     CMP ECX,   int32 0
12     JE  @END
13     ADD EAX,   int32 [ECX*4+EDI]
14     SUB ECX,   int32 1
15     JMP @BEGIN
16 @END:
17   MOV int32 [RESULT], EAX
18   MOV EAX, int32 RESULT
19   RET

    这个程序跟这篇文章的程序一模一样,区别在于EAX保存的是指向结果的指针而不是结果了。程序分为三个部分,第一个部分是常量,第二个部分是变量,第三个部分是代码,分别使用一下三条正则表达式即可分析:

    常量定义:
1 \s*(?:<#NAME>\w[a-zA-Z0-9_]*)(\s*(?:<#TYPE>int8|int16|int32|fp32|fp64)\s*:((?:<#FLOAT>(\+|\-)?\d+.\d+)|(?:<#INTEGER>(\+|\-)?\d+))(\s*,\s*((?:<#FLOAT>(\+|\-)?\d+.\d+)|(?:<#INTEGER>(\+|\-)?\d+)))*|\s*(?:<#TYPE>stra|strw)\s*:(?:<#STRING>\.*))

    变量定义:
1 \s*(?:<#NAME>\w[a-zA-Z0-9_]*)\s*(?:<#TYPE>int8|int16|int32|fp32|fp64)\s*(?:<#INTEGER>(\+|\-)?\d+)?

    最后是汇编指令:
1 \s*(?:<#OPCODE>\w[a-zA-Z0-9_]*)(\s*((?:<#REGISTER0>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))|((?:<#PTRTYPE0>(?:int8|int16|int32|fp32|fp64))\s+\[((?:<#BASE0>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))|(?:<#INDEX0>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))\*(?:<#SCALE0>[1248])|(?:<#INDEX0>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))\*(?:<#SCALE0>[1248])\+(?:<#BASE0>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))|((?:<#INTEGER0>(\+|\-)?\d+)|\$(?:<#CHARA0>\.)|w\$(?:<#CHARW0>\.)|(?:<#NAME0>\w[a-zA-Z0-9_]*))|(?:<#BASE0>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))\+((?:<#INTEGER0>(\+|\-)?\d+)|\$(?:<#CHARA0>\.)|w\$(?:<#CHARW0>\.)|(?:<#NAME0>\w[a-zA-Z0-9_]*))|(?:<#INDEX0>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))\*(?:<#SCALE0>[1248])\+((?:<#INTEGER0>(\+|\-)?\d+)|\$(?:<#CHARA0>\.)|w\$(?:<#CHARW0>\.)|(?:<#NAME0>\w[a-zA-Z0-9_]*))|(?:<#INDEX0>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))\*(?:<#SCALE0>[1248])\+(?:<#BASE0>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))\+((?:<#INTEGER0>(\+|\-)?\d+)|\$(?:<#CHARA0>\.)|w\$(?:<#CHARW0>\.)|(?:<#NAME0>\w[a-zA-Z0-9_]*)))\])|((?:<#INTTYPE0>(?:int8|int16|int32|fp32|fp64))\s+((?:<#INTEGER0>(\+|\-)?\d+)|\$(?:<#CHARA0>\.)|w\$(?:<#CHARW0>\.)|(?:<#NAME0>\w[a-zA-Z0-9_]*)))|((?:<#LABEL0>@\w[a-zA-Z0-9_]*)))(\s*,\s*((?:<#REGISTER1>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))|((?:<#PTRTYPE1>(?:int8|int16|int32|fp32|fp64))\s+\[((?:<#BASE1>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))|(?:<#INDEX1>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))\*(?:<#SCALE1>[1248])|(?:<#INDEX1>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))\*(?:<#SCALE1>[1248])\+(?:<#BASE1>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))|((?:<#INTEGER1>(\+|\-)?\d+)|\$(?:<#CHARA1>\.)|w\$(?:<#CHARW1>\.)|(?:<#NAME1>\w[a-zA-Z0-9_]*))|(?:<#BASE1>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))\+((?:<#INTEGER1>(\+|\-)?\d+)|\$(?:<#CHARA1>\.)|w\$(?:<#CHARW1>\.)|(?:<#NAME1>\w[a-zA-Z0-9_]*))|(?:<#INDEX1>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))\*(?:<#SCALE1>[1248])\+((?:<#INTEGER1>(\+|\-)?\d+)|\$(?:<#CHARA1>\.)|w\$(?:<#CHARW1>\.)|(?:<#NAME1>\w[a-zA-Z0-9_]*))|(?:<#INDEX1>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))\*(?:<#SCALE1>[1248])\+(?:<#BASE1>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))\+((?:<#INTEGER1>(\+|\-)?\d+)|\$(?:<#CHARA1>\.)|w\$(?:<#CHARW1>\.)|(?:<#NAME1>\w[a-zA-Z0-9_]*)))\])|((?:<#INTTYPE1>(?:int8|int16|int32|fp32|fp64))\s+((?:<#INTEGER1>(\+|\-)?\d+)|\$(?:<#CHARA1>\.)|w\$(?:<#CHARW1>\.)|(?:<#NAME1>\w[a-zA-Z0-9_]*)))|((?:<#LABEL1>@\w[a-zA-Z0-9_]*)))(\s*,\s*((?:<#REGISTER2>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))|((?:<#PTRTYPE2>(?:int8|int16|int32|fp32|fp64))\s+\[((?:<#BASE2>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))|(?:<#INDEX2>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))\*(?:<#SCALE2>[1248])|(?:<#INDEX2>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))\*(?:<#SCALE2>[1248])\+(?:<#BASE2>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))|((?:<#INTEGER2>(\+|\-)?\d+)|\$(?:<#CHARA2>\.)|w\$(?:<#CHARW2>\.)|(?:<#NAME2>\w[a-zA-Z0-9_]*))|(?:<#BASE2>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))\+((?:<#INTEGER2>(\+|\-)?\d+)|\$(?:<#CHARA2>\.)|w\$(?:<#CHARW2>\.)|(?:<#NAME2>\w[a-zA-Z0-9_]*))|(?:<#INDEX2>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))\*(?:<#SCALE2>[1248])\+((?:<#INTEGER2>(\+|\-)?\d+)|\$(?:<#CHARA2>\.)|w\$(?:<#CHARW2>\.)|(?:<#NAME2>\w[a-zA-Z0-9_]*))|(?:<#INDEX2>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))\*(?:<#SCALE2>[1248])\+(?:<#BASE2>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))\+((?:<#INTEGER2>(\+|\-)?\d+)|\$(?:<#CHARA2>\.)|w\$(?:<#CHARW2>\.)|(?:<#NAME2>\w[a-zA-Z0-9_]*)))\])|((?:<#INTTYPE2>(?:int8|int16|int32|fp32|fp64))\s+((?:<#INTEGER2>(\+|\-)?\d+)|\$(?:<#CHARA2>\.)|w\$(?:<#CHARW2>\.)|(?:<#NAME2>\w[a-zA-Z0-9_]*)))|((?:<#LABEL2>@\w[a-zA-Z0-9_]*)))(\s*,\s*((?:<#REGISTER3>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))|((?:<#PTRTYPE3>(?:int8|int16|int32|fp32|fp64))\s+\[((?:<#BASE3>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))|(?:<#INDEX3>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))\*(?:<#SCALE3>[1248])|(?:<#INDEX3>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))\*(?:<#SCALE3>[1248])\+(?:<#BASE3>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))|((?:<#INTEGER3>(\+|\-)?\d+)|\$(?:<#CHARA3>\.)|w\$(?:<#CHARW3>\.)|(?:<#NAME3>\w[a-zA-Z0-9_]*))|(?:<#BASE3>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))\+((?:<#INTEGER3>(\+|\-)?\d+)|\$(?:<#CHARA3>\.)|w\$(?:<#CHARW3>\.)|(?:<#NAME3>\w[a-zA-Z0-9_]*))|(?:<#INDEX3>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))\*(?:<#SCALE3>[1248])\+((?:<#INTEGER3>(\+|\-)?\d+)|\$(?:<#CHARA3>\.)|w\$(?:<#CHARW3>\.)|(?:<#NAME3>\w[a-zA-Z0-9_]*))|(?:<#INDEX3>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))\*(?:<#SCALE3>[1248])\+(?:<#BASE3>(AL|AH|CL|CH|DL|DH|BL|BH|AX|CX|DX|BX|SI|DI|SP|BP|EAX|ECX|EDX|EBX|ESI|EDI|ESP|EBP|ST0|ST1|ST2|ST3|ST4|ST5|ST6|ST7))\+((?:<#INTEGER3>(\+|\-)?\d+)|\$(?:<#CHARA3>\.)|w\$(?:<#CHARW3>\.)|(?:<#NAME3>\w[a-zA-Z0-9_]*)))\])|((?:<#INTTYPE3>(?:int8|int16|int32|fp32|fp64))\s+((?:<#INTEGER3>(\+|\-)?\d+)|\$(?:<#CHARA3>\.)|w\$(?:<#CHARW3>\.)|(?:<#NAME3>\w[a-zA-Z0-9_]*)))|((?:<#LABEL3>@\w[a-zA-Z0-9_]*))))?)?)?)?

    然后就可以将汇编指令编译成机器码了:
 1 void RunExecutable(VL_AsmExecutable* Executable)
 2 {
 3     VPointer Buffer=Executable->GetInstruction();
 4     VInt Output=0;
 5     __asm
 6     {
 7         PUSHAD
 8         MOV EAX, dword ptr[Buffer]
 9         //INT 3
10         CALL EAX
11         MOV dword ptr[Output], EAX
12         POPAD
13     }
14     Output=*(VInt*)Output;
15     GetConsole()->Write(L"结果:EAX="+VUnicodeString(Output)+L"\r\n");
16 }
17 
18 void vlmain()
19 {
20     GetConsole()->SetTitle(L"Vczh Library++ 2.0 Assembler");
21     GetConsole()->SetTestMemoryLeaks(true);
22     GetConsole()->SetPauseOnExit(true);
23 
24     VUnicodeString Code;
25     VInt Line=0;
26     VUnicodeString Message;
27     {
28         VUnicodeString WorkData=VFileName(GetConsole()->GetAppPath()).MakeAbsolute(L"..\\..\\TestData\\").GetStrW();
29         VL_FileStream CodeStream(WorkData+L"Assembly.txt",VL_FileStream::vomRead);
30         Code=ReadText(&CodeStream);
31     }
32 
33     VL_AsmProgram* Program=CompileToAssembly(Code,Line,Message);
34     if(!Program)
35     {
36         GetConsole()->Write(Message);
37         return;
38     }
39 
40     VL_AsmCompiled* Compiled=CompileToX86(Program);
41     if(Compiled->Errors.GetCount())
42     {
43         PrintErrors(Compiled);
44         delete Program;
45         delete Compiled;
46         return;
47     }
48 
49     VL_AsmExecutable* Executable=LinkX86(Compiled);
50     if(Compiled->Errors.GetCount())
51     {
52         PrintErrors(Compiled);
53     }
54     if(Executable)
55     {
56         RunExecutable(Executable);
57         delete Executable;
58     }
59     delete Program;
60     delete Compiled;
61 }

    最后得到了正确的结果:

    再次证明了我自己做的正则表达式引擎的稳定及高效。
posted on 2009-02-26 01:27 陈梓瀚(vczh) 阅读(3346) 评论(2)  编辑 收藏 引用 所属分类: JIT

评论:
# re: JIT脚本引擎:动态运行文本格式的汇编代码 2009-02-26 01:57 | 空明流转
灰常好,灰常强大  回复  更多评论
  
# re: JIT脚本引擎:动态运行文本格式的汇编代码 2009-03-07 23:04 | zl
好腻害!!!  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理