青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-341  評論-2670  文章-0  trackbacks-0
    光能編譯匯編還是不行的,因為很多東西在編譯的時候不知道,典型的比如放常量那部分的指針等等。主要原因還是因為x87(指FPU部分)沒有指令包含浮點立即數(shù),所有裝載浮點常數(shù)的指令都要求提供指針。所以諸如double a=1.2;之類的代碼,需要將1.2預(yù)先放置在一個地方然后確定指針的位置。

    于是就遇到了一個問題,如何將編譯后才知道的指針地址寫進(jìn)去呢?唯一的辦法就是在二進(jìn)制代碼那里留空,然后使用一張新表記錄哪些地方是需要鏈接的時候填充的。于是可以使用如下結(jié)構(gòu)來構(gòu)造一張鏈接符號表:
1 struct LinkingRef
2 {
3     VInt            ID;
4     VInt            Offset;
5     VSize            Position;
6     VByte            Bits;//0->8, 1->16, 2->32
7     VInt            Instruction;
8 };
    其中ID代表鏈接的對象,譬如可以將0作為常數(shù)緩沖區(qū)的指針,其他數(shù)字作為外部函數(shù)的地址等等。Offset代表一個常量偏移,可以將ID所代表的地址加上一個數(shù)字之后存放在指令緩沖區(qū)的Position偏移處。至于地址的大小使用Bits來表達(dá)(因為整數(shù)也可以如此搞)。Instruction記錄的是使用這個鏈接單元的指令序號,用于生成錯誤信息。

    于是在編譯之后就可以填充鏈接信息,然后進(jìn)行鏈接了。這個做完以后就只剩下一個問題了。我們不僅需要常量緩沖區(qū)、還需要變量緩沖區(qū),那么如何在常量緩沖區(qū)填充之后鎖定呢(為了在試圖修改的時候拋出異常)?Windows API提供了VirtualAlloc、VirtualProtect和VirtualFree來幫我們完成這項工作。為了簡化操作,使用以下的類用于控制內(nèi)存空間:
 1             struct VL_AsmExecutable
 2             {
 3             private:
 4                 VPointer                FConstantBuffer;
 5                 VPointer                FVariableBuffer;
 6                 VPointer                FInstructionBuffer;
 7                 VInt                    FConstantSize;
 8                 VInt                    FVariableSize;
 9                 VInt                    FInstructionSize;
10                 VBool                    FAvailable;
11 
12             public:
13                 VL_AsmExecutable();
14                 ~VL_AsmExecutable();
15 
16                 void                    Allocate(VInt Constant , VInt Variable , VInt Instruction);
17                 void                    Protect();
18                 void                    Release();
19                 VPointer                GetConstant();
20                 VPointer                GetVariable();
21                 VPointer                GetInstruction();
22             };

    這里是實現(xiàn)部分:
 1             VL_AsmExecutable::VL_AsmExecutable()
 2             {
 3                 FConstantBuffer=0;
 4                 FVariableBuffer=0;
 5                 FInstructionBuffer=0;
 6                 FConstantSize=0;
 7                 FVariableSize=0;
 8                 FInstructionSize=0;
 9                 FAvailable=false;
10             }
11 
12             VL_AsmExecutable::~VL_AsmExecutable()
13             {
14                 Release();
15             }
16 
17             void VL_AsmExecutable::Allocate(VInt Constant , VInt Variable , VInt Instruction)
18             {
19                 Release();
20                 FConstantSize=Constant?Constant:1;
21                 FVariableSize=Variable?Variable:1;
22                 FInstructionSize=Instruction?Instruction:1;
23                 FConstantBuffer=VirtualAlloc(0,FConstantSize,MEM_COMMIT,PAGE_READWRITE);
24                 FVariableBuffer=VirtualAlloc(0,FVariableSize,MEM_COMMIT,PAGE_READWRITE);
25                 FInstructionBuffer=VirtualAlloc(0,FInstructionSize,MEM_COMMIT,PAGE_READWRITE);
26                 FAvailable=true;
27             }
28 
29             void VL_AsmExecutable::Protect()
30             {
31                 if(FAvailable)
32                 {
33                     DWORD OldProtect=0;
34                     VirtualProtect(FConstantBuffer,FConstantSize,PAGE_READONLY,&OldProtect);
35                     VirtualProtect(FInstructionBuffer,FInstructionSize,PAGE_EXECUTE_READ,&OldProtect);
36                 }
37             }
38 
39             void VL_AsmExecutable::Release()
40             {
41                 if(FAvailable)
42                 {
43                     VirtualFree(FConstantBuffer,FConstantSize,MEM_RELEASE);
44                     VirtualFree(FVariableBuffer,FVariableSize,MEM_RELEASE);
45                     VirtualFree(FInstructionBuffer,FInstructionSize,MEM_RELEASE);
46                     
47                     FConstantBuffer=0;
48                     FVariableBuffer=0;
49                     FInstructionBuffer=0;
50                     FConstantSize=0;
51                     FVariableSize=0;
52                     FInstructionSize=0;
53                     FAvailable=false;
54                 }
55             }
56 
57             VPointer VL_AsmExecutable::GetConstant()
58             {
59                 return FConstantBuffer;
60             }
61 
62             VPointer VL_AsmExecutable::GetVariable()
63             {
64                 return FVariableBuffer;
65             }
66 
67             VPointer VL_AsmExecutable::GetInstruction()
68             {
69                 return FInstructionBuffer;
70             }

    到了這里就可以修改上一篇文章列出的匯編代碼了。我們將數(shù)組{10,1,2,3,4,5,6,7,8,9,10}存放進(jìn)常量空間然后求和:
 1 VL_AsmCompiled* Compile()
 2 {
 3     VL_AsmProgram Program;
 4     {
 5         VInt Params[]={10,1,2,3,4,5,6,7,8,9,10};
 6         Program.ConstantBuffer.Write(&Params,sizeof(Params));
 7     }
 8     {
 9         // XOR EAX, EAX
10         INSTRUCTION(XOR)
11         PARAM_REG_32(EAX)
12         PARAM_REG_32(EAX)
13         // MOV EDI, #CONSTANT_BUFFER_POINTER
14         INSTRUCTION(MOV)
15         PARAM_REG_32(EDI)
16         PARAM_IMM_32(0)
17         LINK(VL_AsmProgram::CONSTANT_BUFFER_POINTER,0);
18         // MOV ECX, [EDI]
19         INSTRUCTION(MOV)
20         PARAM_REG_32(ECX)
21         PARAM_MI_32(NONE,1,EDI,0)
22         // @BEGIN:
23         LABEL(BEGIN)
24             // CMP ECX, 0
25             INSTRUCTION(CMP)
26             PARAM_REG_32(ECX)
27             PARAM_IMM_32(0)
28             // JE @END
29             INSTRUCTION(JE)
30             PARAM_LABEL(END)
31             // ADD EAX, [ECX * 4 + EDI]
32             INSTRUCTION(ADD)
33             PARAM_REG_32(EAX)
34             PARAM_MI_32(ECX,4,EDI,0)
35             // SUB ECX, 1
36             INSTRUCTION(SUB)
37             PARAM_REG_32(ECX)
38             PARAM_IMM_32(1)
39             // JMP @BEGIN
40             INSTRUCTION(JMP)
41             PARAM_LABEL(BEGIN)
42         // @END:
43         LABEL(END)
44         // RET
45         INSTRUCTION(RET)
46     }
47     VL_AsmCompiled* Compiled=Compile(&Program);
48     if(Compiled->Errors.GetCount())
49     {
50         PrintErrors(Compiled);
51         delete Compiled;
52         return 0;
53     }
54     else
55     {
56         return Compiled;
57     }
58 }

    然后使用下面的代碼執(zhí)行編譯后的機(jī)器碼:
 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     GetConsole()->Write(L"結(jié)果:EAX="+VUnicodeString(Output)+L"\r\n");
15 }
16 
17 void vlmain()
18 {
19     GetConsole()->SetTitle(L"Vczh Library++ 2.0 Assembler");
20     GetConsole()->SetTestMemoryLeaks(true);
21     GetConsole()->SetPauseOnExit(true);
22 
23     VL_AsmCompiled* Compiled=Compile();
24     if(Compiled)
25     {
26         VL_AsmExecutable* Executable=Link(Compiled);
27         if(Compiled->Errors.GetCount())
28         {
29             PrintErrors(Compiled);
30         }
31         if(Executable)
32         {
33             RunExecutable(Executable);
34             delete Executable;
35         }
36         delete Compiled;
37     }
38 }

    鏈接器就完成了。
posted on 2009-02-22 22:41 陳梓瀚(vczh) 閱讀(1952) 評論(1)  編輯 收藏 引用 所屬分類: JIT

評論:
# re: JIT腳本引擎:完成鏈接器的核心功能 2009-02-23 05:21 | Corner Zhang
這廝咋動作這么快呀!呵呵  回復(fù)  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美精品久久一区| 亚洲精品乱码久久久久久日本蜜臀| 男同欧美伦乱| 快射av在线播放一区| 欧美mv日韩mv国产网站| 欧美成人午夜激情在线| 免费日韩成人| 91久久久久久| 免费人成网站在线观看欧美高清 | 欧美日韩伦理在线免费| 欧美日韩一区二| 国产精品一区二区在线观看| 国产一级揄自揄精品视频| 亚洲电影毛片| 亚洲性视频网址| 久久久久久成人| 亚洲人成在线免费观看| 亚洲亚洲精品三区日韩精品在线视频 | 国产欧美精品日韩精品| 韩国女主播一区| 亚洲精品久久久蜜桃| 亚洲手机视频| 久久久夜精品| 亚洲精品国产精品乱码不99按摩| 亚洲免费观看在线视频| 销魂美女一区二区三区视频在线| 欧美在线观看www| 欧美激情第二页| 国内精品伊人久久久久av影院 | 翔田千里一区二区| 欧美成人免费全部观看天天性色| 亚洲美女在线观看| 久久九九免费| 国产精品久久久| 最近看过的日韩成人| 欧美一区午夜精品| 欧美激情视频网站| 西瓜成人精品人成网站| 欧美日韩一区三区| 裸体女人亚洲精品一区| 亚洲欧洲一二三| 久久xxxx精品视频| 亚洲精品乱码久久久久久蜜桃麻豆 | 国产精品久久久久久久久久妞妞 | 欧美性大战久久久久久久| 国产日韩欧美一区| 亚洲一区美女视频在线观看免费| 久久久之久亚州精品露出| 中文av一区特黄| 欧美日韩大片| 亚洲国产精品一区二区三区| 久久免费视频网站| 亚洲欧美日韩国产综合| 欧美区二区三区| 亚洲免费大片| 亚洲精品久久嫩草网站秘色| 欧美精品九九99久久| 亚洲国产精品一区制服丝袜| 免费在线观看日韩欧美| 久久综合狠狠| 在线看片成人| 欧美电影打屁股sp| 男人的天堂成人在线| 亚洲国产小视频在线观看| 欧美 日韩 国产 一区| 卡一卡二国产精品| 亚洲国产精品久久| 亚洲黄色视屏| 欧美日韩国产欧| 99re在线精品| 亚洲网站在线| 国产日韩精品在线播放| 久久久91精品| 免费看的黄色欧美网站| 99riav1国产精品视频| 99国内精品久久| 国产精品入口尤物| 99国产精品99久久久久久粉嫩| 99国产麻豆精品| 亚洲毛片在线观看| 欧美性猛交视频| 欧美一区二区三区免费在线看| 性久久久久久| 一区二区在线免费观看| 亚洲日本免费| 国产精品久久久一本精品| 久久久久久欧美| 欧美国产极速在线| 欧美一区成人| 久久午夜av| 亚洲网站在线播放| 久久成人免费网| 国产一区二区三区黄| 91久久精品美女高潮| 日韩一区二区精品在线观看| 国产精品亚洲аv天堂网| 久久一区二区三区四区| 欧美日韩国内| 免费在线观看成人av| 国产精品高潮呻吟久久| 欧美大香线蕉线伊人久久国产精品| 国产精品家教| 亚洲国内欧美| 伊人久久大香线蕉综合热线 | 欧美成年人网站| 欧美一区二区网站| 欧美区视频在线观看| 久久久久久午夜| 欧美午夜精品久久久久久超碰| 毛片基地黄久久久久久天堂| 国产精品hd| 欧美国产成人精品| 国产亚洲福利社区一区| 99精品视频免费在线观看| 亚洲高清资源| 欧美在线视频导航| 午夜精品福利在线| 欧美精品一级| 欧美激情一区二区三区成人| 国产日产欧产精品推荐色 | 黑人巨大精品欧美黑白配亚洲| 亚洲精品一区二区三区樱花 | 久久精品午夜| 欧美三区免费完整视频在线观看| 麻豆久久精品| 激情欧美丁香| 欧美一区国产二区| 欧美一区日本一区韩国一区| 国产精品亚洲一区二区三区在线| 亚洲日本成人网| 日韩视频永久免费| 欧美mv日韩mv国产网站| 亚洲盗摄视频| 亚洲精品三级| 欧美成人一区二区三区| 欧美激情视频在线免费观看 欧美视频免费一 | 久久久一本精品99久久精品66| 国产精品啊啊啊| 亚洲精品一区二区三区樱花| 夜夜夜久久久| 欧美日韩成人在线观看| 99re视频这里只有精品| 亚洲欧洲日韩在线| 99国产精品一区| 欧美午夜精品久久久久久孕妇 | 午夜精品一区二区三区电影天堂 | 亚洲免费在线播放| 欧美日韩久久久久久| 9色精品在线| 午夜视黄欧洲亚洲| 国产欧美视频一区二区三区| 性欧美1819性猛交| 久久久最新网址| 在线免费观看视频一区| 免费一区二区三区| 99国产精品视频免费观看一公开| 在线视频精品一区| 国产精品久久久爽爽爽麻豆色哟哟| 亚洲毛片一区| 久久xxxx| 亚洲人成网站在线播| 欧美区二区三区| 亚洲视频久久| 久久中文字幕一区| 亚洲欧洲在线播放| 国产精品久久97| 久久国产福利| 亚洲精品视频免费观看| 欧美一级理论片| 在线日韩欧美| 国产精品国产三级国产aⅴ入口 | 亚洲韩国日本中文字幕| 亚洲网站视频| 狠狠综合久久| 欧美视频亚洲视频| 久久精品视频va| 亚洲精品欧美极品| 久久久久久久久久久久久久一区| 亚洲国产精品一区二区第四页av | 久久尤物电影视频在线观看| 亚洲精品在线二区| 老牛影视一区二区三区| 一区二区三区高清在线观看| 国产性色一区二区| 欧美日韩一卡二卡| 免费高清在线视频一区·| 一区二区三区四区国产精品| 久久综合五月天婷婷伊人| 亚洲欧美精品| 夜夜嗨av色一区二区不卡| 国模吧视频一区| 国产精品视频免费一区| 欧美精品一区二区三区很污很色的| 欧美一区二区播放| 亚洲一级一区| 一本色道久久综合亚洲精品婷婷| 亚洲第一搞黄网站| 美女视频一区免费观看| 久久精品视频播放| 久久av资源网站|