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

隨筆-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>
            国产精品一二一区| 亚洲一二三级电影| 在线亚洲自拍| 一区二区日本视频| 亚洲一级免费视频| 中日韩高清电影网| 亚洲欧美激情诱惑| 久久国产高清| 久久中文字幕导航| 亚洲第一福利在线观看| 亚洲国产精品福利| 夜夜精品视频一区二区| 亚洲一区二区在线播放| 欧美自拍丝袜亚洲| 欧美大胆成人| 国产精品日韩| 亚洲国产天堂久久综合| 亚洲性图久久| 卡通动漫国产精品| 亚洲美女毛片| 欧美专区福利在线| 欧美日韩精品免费看 | 亚洲天堂免费观看| 久久免费高清视频| 欧美特黄一级| 在线成人中文字幕| 亚洲欧美视频在线| 亚洲国产高清视频| 欧美一区二区黄| 欧美伦理91i| 黄色亚洲大片免费在线观看| 一区二区三区四区五区精品| 狂野欧美性猛交xxxx巴西| 日韩午夜av在线| 久久午夜视频| 国产日韩欧美三区| 亚洲午夜一区| 亚洲电影在线观看| 久久精品国产一区二区电影 | 欧美日韩精品久久久| 韩日成人av| 香蕉乱码成人久久天堂爱免费 | 国产一区二区三区在线观看免费视频| 亚洲精品在线视频观看| 久久久久久亚洲精品杨幂换脸| 亚洲美女在线一区| 噜噜噜噜噜久久久久久91| 欧美承认网站| 欧美影院在线| 国产精品九九久久久久久久| 亚洲精品欧美精品| 欧美激情精品久久久久久| 欧美专区在线观看一区| 国产区欧美区日韩区| 午夜精品久久久久久久蜜桃app | 嫩草国产精品入口| 先锋影音国产一区| 国产精品一区二区三区免费观看 | 亚洲国产成人精品久久久国产成人一区| 亚洲香蕉成视频在线观看| 欧美另类女人| 一区二区三区四区国产精品| 亚洲人成高清| 欧美日韩第一页| 夜夜嗨一区二区| 亚洲伦伦在线| 国产精品狠色婷| 欧美一级淫片播放口| 亚洲男女自偷自拍图片另类| 国产精品视频专区| 久久精品99国产精品日本| 欧美一区观看| 在线欧美日韩国产| 亚洲高清精品中出| 欧美日韩午夜精品| 亚洲欧美中日韩| 午夜精品福利视频| 1024成人| 日韩一级在线观看| 国产日产精品一区二区三区四区的观看方式| 午夜精品一区二区三区在线播放| 午夜精品久久| 在线观看国产日韩| 亚洲精品一区在线观看| 国产精品久久久爽爽爽麻豆色哟哟| 亚洲欧美卡通另类91av| 香蕉成人啪国产精品视频综合网| 黄色精品一二区| 亚洲人成在线观看网站高清| 国产精品九九| 欧美黄色aaaa| 国产精品免费视频观看| 久久婷婷综合激情| 欧美日韩精品中文字幕| 久久不射2019中文字幕| 美脚丝袜一区二区三区在线观看| 亚洲视频欧洲视频| 久久久一二三| 亚洲欧美日韩在线播放| 久久男人av资源网站| 亚洲综合色在线| 欧美sm视频| 久久天天狠狠| 久久婷婷综合激情| 欧美在线看片a免费观看| 亚洲国产婷婷| 亚洲欧美日韩综合| 日韩一区二区福利| 久久狠狠亚洲综合| 亚洲欧美综合v| 欧美极品在线视频| 狂野欧美激情性xxxx| 国产精品任我爽爆在线播放| 亚洲国产精品久久| 在线观看不卡| 欧美亚洲在线播放| 亚洲一区二区三区精品视频| 免费国产一区二区| 久久性天堂网| 国产精品一区二区在线观看不卡 | 亚洲精品国产精品久久清纯直播 | 久久久久久久久久久久久女国产乱| 亚洲理伦电影| 久久综合九色综合欧美狠狠| 欧美在线视频免费播放| 欧美日韩在线另类| 亚洲国产第一| 亚洲福利视频二区| 久久免费视频在线观看| 久久久蜜桃一区二区人| 国产视频精品网| 羞羞色国产精品| 欧美在线观看视频| 国产日韩欧美一区在线| 亚洲欧美国产77777| 香蕉久久a毛片| 国产日本欧美一区二区三区| 亚洲欧美成人网| 久久国产日韩欧美| 国内成人在线| 久久综合中文字幕| 欧美大片专区| 99re这里只有精品6| 欧美日韩伦理在线| 一区二区三区高清视频在线观看| 亚洲伊人网站| 国产欧美日韩伦理| 欧美主播一区二区三区| 麻豆成人在线播放| 亚洲久久一区| 欧美视频日韩视频在线观看| 亚洲少妇自拍| 久久av资源网站| 亚洲福利电影| 欧美视频二区36p| 午夜精品久久久| 欧美3dxxxxhd| 一本到高清视频免费精品| 欧美四级在线观看| 欧美一区二区三区的| 欧美激情精品久久久久久变态| 亚洲毛片av| 国产欧美日本一区二区三区| 久久久久久久尹人综合网亚洲 | 影音先锋亚洲电影| 久久久久久久久久码影片| 欧美gay视频激情| 一区二区三区视频在线| 国产日韩精品一区二区浪潮av| 老司机午夜免费精品视频| 日韩写真视频在线观看| 久久九九99视频| 亚洲乱码国产乱码精品精可以看| 国产精品久久久久91| 久久久久国产一区二区三区四区| 亚洲国产午夜| 久久久www成人免费精品| 亚洲精品欧美精品| 国产一级一区二区| 欧美日韩国产一区精品一区| 欧美一级播放| 99视频一区二区| 免费一级欧美在线大片| 亚洲欧美自拍偷拍| 亚洲美女在线一区| 国模吧视频一区| 欧美图区在线视频| 免费成人av| 久久福利影视| 亚洲天堂成人在线视频| 亚洲电影自拍| 男人的天堂亚洲| 久久久999国产| 亚洲欧美国产视频| 夜夜夜精品看看| 亚洲精品黄网在线观看| 在线不卡亚洲| 激情欧美一区二区三区在线观看| 国产精品区二区三区日本| 欧美日韩八区|