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

隨筆-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>
            影音先锋中文字幕一区二区| 国产精品视频999| 亚洲国产毛片完整版| 免费成人高清视频| 久久综合九色99| 日韩一级黄色大片| 亚洲午夜电影在线观看| 国产欧美日韩不卡免费| 免费高清在线一区| 亚洲人体一区| 99re6热只有精品免费观看| 国产精品羞羞答答xxdd| 美女国内精品自产拍在线播放| 久久精品视频一| 亚洲精品免费在线观看| 亚洲天堂免费在线观看视频| 国产美女诱惑一区二区| 久久精品网址| 欧美精品在线免费| 亚洲欧美日韩国产成人精品影院| 亚洲天堂成人| 亚洲电影在线观看| 日韩视频欧美视频| 国产一区日韩欧美| 亚洲黄色免费电影| 欧美日韩精品免费观看视一区二区| 性久久久久久久久久久久| 免费观看亚洲视频大全| 久久aⅴ国产紧身牛仔裤| 欧美/亚洲一区| 久久精品国产综合| 欧美久久久久免费| 麻豆精品在线播放| 国产精品视频大全| 国产性猛交xxxx免费看久久| 亚洲国产精品久久久| 国产婷婷一区二区| 91久久午夜| 在线观看欧美精品| 亚洲欧美在线看| 亚洲天堂av电影| 农村妇女精品| 久久夜色精品国产噜噜av| 欧美三日本三级三级在线播放| 男男成人高潮片免费网站| 国产精品一区亚洲| 99精品欧美一区| 亚洲美女中文字幕| 久久婷婷亚洲| 男男成人高潮片免费网站| 国产日韩精品一区二区三区在线| 日韩午夜av在线| 亚洲理论在线| 欧美成人午夜视频| 欧美韩国日本一区| 一区二区三区精密机械公司 | 久久久久久亚洲综合影院红桃| 一区二区三区日韩欧美| 久久综合狠狠综合久久综青草| 久久婷婷蜜乳一本欲蜜臀| 国产伦精品一区二区三区免费| 亚洲精品国产精品国自产在线| 国产一区二区三区直播精品电影| 一区二区激情小说| 亚洲香蕉视频| 欧美视频日韩视频| 夜夜嗨av一区二区三区四季av| 亚洲高清在线观看一区| 久久视频在线视频| 美女主播一区| 一区精品在线| 久久爱www久久做| 美女露胸一区二区三区| 在线观看视频一区| 麻豆精品在线播放| 99精品视频免费全部在线| 亚洲天堂免费观看| 国产欧美高清| 久久精品99国产精品酒店日本| 久久九九国产| 亚洲黑丝一区二区| 欧美日韩一区精品| 亚洲欧美日韩国产中文在线| 久久免费视频观看| 99国产精品久久久久久久久久| 欧美日韩在线看| 欧美亚洲一区二区三区| 麻豆av一区二区三区| 亚洲三级毛片| 国产模特精品视频久久久久| 午夜精品一区二区三区在线视| 久久夜色精品国产亚洲aⅴ| 91久久精品一区| 国产精品日韩精品欧美精品| 久久国产精品久久精品国产| 亚洲国产精品va在看黑人| 一区二区三区欧美在线观看| 国产欧美日韩亚洲| 牛夜精品久久久久久久99黑人| 亚洲三级视频在线观看| 欧美中文在线观看国产| 欲色影视综合吧| 国产精品成人一区二区三区夜夜夜 | 91久久精品一区二区别| 欧美日韩国产在线| 久久狠狠久久综合桃花| 亚洲欧洲在线一区| 久久青草欧美一区二区三区| 日韩亚洲欧美一区| 国产午夜精品久久久| 欧美大成色www永久网站婷| 亚洲一区在线免费| 亚洲第一主播视频| 欧美主播一区二区三区美女 久久精品人 | 国产一区久久久| 欧美精品粉嫩高潮一区二区| 香蕉乱码成人久久天堂爱免费| 亚洲精品永久免费精品| 免费欧美视频| 久久国内精品视频| 亚洲女女女同性video| 亚洲综合电影一区二区三区| 欧美电影在线观看| 久久亚洲春色中文字幕| 亚洲欧美日韩一区在线| 一级日韩一区在线观看| 在线不卡a资源高清| 国产欧美亚洲视频| 欧美日韩免费观看一区=区三区| 久久久久久国产精品一区| 亚洲一区二区三区在线视频| 亚洲国产精彩中文乱码av在线播放| 欧美在线视频网站| 亚洲欧美日韩一区二区三区在线观看 | 狼人社综合社区| 久久精品国产2020观看福利| 亚洲男女毛片无遮挡| 亚洲深夜影院| 在线一区二区三区四区| 一区二区三区高清视频在线观看| 91久久精品国产91性色tv| 亚洲高清免费在线| 亚洲国产精选| 亚洲破处大片| 亚洲精品永久免费精品| 亚洲精品在线观| 夜夜狂射影院欧美极品| 99精品欧美一区二区三区| 亚洲毛片在线| 99精品欧美一区二区三区| 99精品国产在热久久婷婷| 99精品视频免费观看视频| 日韩午夜精品视频| 999亚洲国产精| 在线亚洲自拍| 性欧美1819性猛交| 久久黄色影院| 蜜桃久久av一区| 欧美激情综合亚洲一二区| 欧美精品三级日韩久久| 欧美四级在线观看| 国产精品午夜av在线| 国内精品伊人久久久久av一坑| 激情亚洲网站| 亚洲每日在线| 欧美一区二区三区免费看| 久久久久久久久综合| 欧美大片在线看| 亚洲国产高清在线| 99精品国产热久久91蜜凸| 亚洲影院高清在线| 久久影院亚洲| 欧美少妇一区| 国内精品久久久久久影视8| 在线欧美日韩| 亚洲一区二区三区精品在线| 小嫩嫩精品导航| 亚洲国产精品一区二区第一页| 亚洲视频精品在线| 久久久亚洲成人| 欧美性猛交视频| 亚洲国产精品成人久久综合一区| 亚洲美女色禁图| 久久成人免费视频| 亚洲精品字幕| 美女尤物久久精品| 国产精品美女久久久久av超清| 黄色成人精品网站| 亚洲私人影吧| 欧美成人69| 亚洲欧美在线另类| 欧美久久久久中文字幕| 国产午夜精品美女毛片视频| 亚洲精品在线一区二区| 欧美一区永久视频免费观看| 亚洲国产人成综合网站| 久久国内精品自在自线400部| 欧美日韩在线视频一区| 亚洲第一在线综合在线| 欧美一区在线看|