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

隨筆-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) 閱讀(1946) 評論(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在线| 欧美精品www在线观看| 欧美自拍偷拍| 久久精品夜色噜噜亚洲aⅴ| 亚洲午夜三级在线| 午夜精品一区二区三区在线视 | 夜夜嗨av一区二区三区四季av| 欧美成人激情在线| 亚洲国产视频一区| 最新高清无码专区| 亚洲视频日本| 韩国自拍一区| 国产亚洲精品一区二区| 亚洲女人小视频在线观看| 久久久久久九九九九| 久久亚洲一区二区| 亚洲激情一区二区| 亚洲一区图片| 久久亚洲图片| 欧美午夜精品久久久久久超碰| 国产精品色婷婷| 亚洲成人中文| 国产精品99久久久久久久久| 午夜宅男欧美| 欧美电影打屁股sp| 亚洲视频你懂的| 欧美成人性网| 国产一区观看| 亚洲在线观看| 欧美国产日韩a欧美在线观看| 亚洲狼人综合| 99在线精品视频在线观看| 久久久精品网| 国产精品精品视频| 亚洲精品日韩精品| 久久综合精品一区| 在线亚洲一区| 欧美日韩国产精品自在自线| 韩曰欧美视频免费观看| 亚洲一区黄色| 欧美精品在线观看播放| 黄色欧美日韩| 欧美一区二区视频在线观看| 亚洲三级电影在线观看| 久久婷婷国产综合尤物精品| 欧美成人精品一区二区三区| 久久精品官网| 老鸭窝91久久精品色噜噜导演| 亚洲久色影视| 欧美精品国产| 国内一区二区三区在线视频| 午夜激情亚洲| 亚洲天堂av高清| 欧美日韩一区在线观看| 91久久精品国产91久久性色tv| 午夜精品久久久久久| 夜夜精品视频| 欧美三级欧美一级| 亚洲最新在线视频| 亚洲日本va午夜在线影院| 久久久视频精品| 欧美日韩在线三区| 亚洲视频网站在线观看| 亚洲日产国产精品| 欧美日韩在线一二三| 亚洲综合国产激情另类一区| 99亚洲一区二区| 欧美视频在线观看| 亚洲欧美日韩天堂| 亚洲欧美一区二区三区极速播放 | 欧美影片第一页| 亚洲在线观看免费| 国产欧美亚洲视频| 久久综合九色综合欧美就去吻| 国产主播精品| 久久av老司机精品网站导航| 黑人一区二区三区四区五区| 久久一本综合频道| 老牛嫩草一区二区三区日本| 亚洲国产视频直播| 亚洲乱码国产乱码精品精可以看| 欧美精品精品一区| 亚洲欧美日韩精品在线| 欧美一区1区三区3区公司| 国产性色一区二区| 亚洲成色精品| 欧美性猛交xxxx乱大交蜜桃| 午夜精品婷婷| 久久久福利视频| 亚洲美女在线国产| 亚洲女ⅴideoshd黑人| 亚洲第一区在线| 亚洲日本理论电影| 国产精品在线看| 亚洲第一毛片| 欧美福利专区| 日韩一区二区福利| 亚洲人体偷拍| 日韩一区二区精品| 国产一二精品视频| 亚洲精品视频在线| 国产精品日韩精品| 欧美二区在线看| 国产精品日韩欧美一区二区三区| 狼人天天伊人久久| 国产日本欧美视频| 欧美激情第六页| 国产日韩欧美精品一区| 91久久精品日日躁夜夜躁欧美| 国产精品进线69影院| 亚洲国产小视频在线观看| 国产精品揄拍500视频| 欧美大尺度在线| 99re热这里只有精品免费视频| 狠狠色综合色综合网络| 99国产精品视频免费观看一公开| 一区二区三区中文在线观看| 一本色道久久综合亚洲精品婷婷| 国内久久婷婷综合| 亚洲免费在线播放| 亚洲天堂视频在线观看| 久久人人看视频| 久久精品一二三| 国产精品wwwwww| 日韩视频免费| 亚洲三级视频| 久久美女性网| 欧美一区二区三区久久精品茉莉花| 欧美国产视频在线观看| 免费的成人av| 亚洲第一综合天堂另类专| 午夜在线视频观看日韩17c| 亚洲色图制服丝袜| 欧美特黄a级高清免费大片a级| 亚洲第一页自拍| 影院欧美亚洲| 久久精品成人一区二区三区蜜臀| 午夜一区不卡| 国产伦一区二区三区色一情| 亚洲精品乱码久久久久久蜜桃91| 影音先锋中文字幕一区二区| 翔田千里一区二区| 久久精品亚洲乱码伦伦中文 | 欧美日韩另类丝袜其他| 亚洲精品资源| 亚洲欧美日韩中文在线制服| 欧美视频在线一区| 亚洲图片欧美一区| 久久av最新网址| 狠狠噜噜久久| 欧美成人官网二区| 日韩一区二区精品在线观看| 亚洲性色视频| 国产日韩在线看| 欧美性猛交xxxx免费看久久久| 亚洲精品无人区| 欧美视频日韩视频| 亚洲欧美日韩成人| 免费视频一区| 中文av一区二区| 国产欧美日韩视频在线观看 | 香港成人在线视频| 蜜桃伊人久久| 亚洲精品中文字幕有码专区| 欧美日韩一区二区三区在线| 亚洲精品国产欧美| 亚洲免费观看高清完整版在线观看| 日韩一区二区福利| 国产精品国产三级国产专播精品人 | 亚洲理论电影网| 国产精品家教| 久久理论片午夜琪琪电影网| 欧美激情亚洲视频| 亚洲在线观看视频| 伊人色综合久久天天五月婷| 欧美xart系列高清| 亚洲午夜视频在线| 欧美高清一区| 欧美中文在线视频| 在线亚洲高清视频| 在线观看欧美亚洲| 国产精品久久久久aaaa九色| 久久亚洲风情| 亚洲欧美成人网| 亚洲高清视频在线观看| 久久精品国产91精品亚洲| 亚洲精品视频在线观看网站| 国产欧美精品日韩精品| 日韩香蕉视频| 欧美国产日韩一区二区| 欧美在线视频播放| 一区二区三区日韩精品视频| 黑人一区二区| 国产精品久久久久久久久果冻传媒| 美女网站久久| 久久精品视频va| 午夜精品福利一区二区三区av| 欧美激情一区二区三区蜜桃视频 | 国产午夜亚洲精品不卡|