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

隨筆-341  評論-2670  文章-0  trackbacks-0
    stdcall、cdecl和fastcall的參數都是從右到左入棧,并且返回值遵循以下規律:
    小于等于4字節結構用EAX
    小于等于8字節結構用EDX:EAX
    浮點數用ST(0)
    其他則在EAX放置一個指針,供返回值使用

    stdcall被調用者清棧,cdecl調用者清棧,fastcall被調用者清棧并且前兩個小于等于4字節的參數放入ECX和EDX。返回值和參數如果一方有構造函數或析構函數則不使用寄存器。

    于是今天用字符串形式的匯編寫了三種調用方法的求和函數,類型如下:
1 typedef VInt (__stdcall * Summer_Stdcall)(VInt* Numbers , VInt Count);
2 typedef VInt (__cdecl * Summer_Cdecl)(VInt* Numbers , VInt Count);
3 typedef VInt (__fastcall * Summer_Fastcall)(VInt* Numbers , VInt Count);

    匯編代碼如下:
 1 CONSTANT
 2 VARIABLE
 3 CODE
 4 
 5 @SUM_STDCALL:
 6   PUSH EBP
 7   MOV EBP, ESP
 8   PUSH ECX
 9   PUSH EDI
10   XOR EAX, EAX
11   MOV ECX, int32 [EBP+12]
12   MOV EDI, int32 [EBP+8]
13 @SUM_STDCALL_BEGIN:
14   CMP ECX, int32 0
15   JE @SUM_STDCALL_FINISHED
16   ADD EAX, int32 [EDI]
17   ADD EDI, int32 4
18   DEC ECX
19   JMP @SUM_STDCALL_BEGIN
20 @SUM_STDCALL_FINISHED:
21   POP EDI
22   POP ECX
23   MOV ESP, EBP
24   POP EBP
25   RET int16 8
26 
27 @SUM_CDECL:
28   PUSH EBP
29   MOV EBP, ESP
30   PUSH ECX
31   PUSH EDI
32   XOR EAX, EAX
33   MOV ECX, int32 [EBP+12]
34   MOV EDI, int32 [EBP+8]
35 @SUM_CDECL_BEGIN:
36   CMP ECX, int32 0
37   JE @SUM_CDECL_FINISHED
38   ADD EAX, int32 [EDI]
39   ADD EDI, int32 4
40   DEC ECX
41   JMP @SUM_CDECL_BEGIN
42 @SUM_CDECL_FINISHED:
43   POP EDI
44   POP ECX
45   MOV ESP, EBP
46   POP EBP
47   RET
48 
49 @SUM_FASTCALL:
50   PUSH EBP
51   MOV EBP, ESP
52   XOR EAX, EAX
53 @SUM_FASTCALL_BEGIN:
54   CMP EDX, int32 0
55   JE @SUM_FASTCALL_FINISHED
56   ADD EAX, int32 [ECX]
57   ADD ECX, int32 4
58   DEC EDX
59   JMP @SUM_FASTCALL_BEGIN
60 @SUM_FASTCALL_FINISHED:
61   MOV ESP, EBP
62   POP EBP
63   RET

    使用以下方法讀取文件、編譯并取出三個label的指針:
 1 void RunExecutable(VL_AsmProgram* Program , VL_AsmCompiled* Compiled , VL_AsmExecutable* Executable)
 2 {
 3     VInt Numbers[]={11,12,13,14,15,16,17,18,19,20};
 4     VInt Count=sizeof(Numbers)/sizeof(*Numbers);
 5     {
 6         VInt Offset=(VInt)Compiled->LabelOffsets[Program->LabelNames.IndexOf(L"@SUM_STDCALL")];
 7         Summer_Stdcall Summer=(Summer_Stdcall)((VInt)Executable->GetInstruction()+Offset);
 8         VInt Result=Summer(Numbers,Count);
 9         GetConsole()->Write(L"結果:"+VUnicodeString(Result)+L"\r\n");
10     }
11     {
12         VInt Offset=(VInt)Compiled->LabelOffsets[Program->LabelNames.IndexOf(L"@SUM_CDECL")];
13         Summer_Cdecl Summer=(Summer_Cdecl)((VInt)Executable->GetInstruction()+Offset);
14         VInt Result=Summer(Numbers,Count);
15         GetConsole()->Write(L"結果:"+VUnicodeString(Result)+L"\r\n");
16     }
17     {
18         VInt Offset=(VInt)Compiled->LabelOffsets[Program->LabelNames.IndexOf(L"@SUM_FASTCALL")];
19         Summer_Fastcall Summer=(Summer_Fastcall)((VInt)Executable->GetInstruction()+Offset);
20         VInt Result=Summer(Numbers,Count);
21         GetConsole()->Write(L"結果:"+VUnicodeString(Result)+L"\r\n");
22     }
23 }
24 
25 void Main_Assembler()
26 {
27     VUnicodeString Code;
28     VInt Line=0;
29     VUnicodeString Message;
30     {
31         VUnicodeString WorkData=VFileName(GetConsole()->GetAppPath()).MakeAbsolute(L"..\\..\\TestData\\").GetStrW();
32         VL_FileStream CodeStream(WorkData+L"Assembly.txt",VL_FileStream::vomRead);
33         Code=ReadText(&CodeStream);
34     }
35 
36     VL_AsmProgram* Program=CompileToAssembly(Code,Line,Message);
37     if(!Program)
38     {
39         GetConsole()->Write(Message);
40         return;
41     }
42 
43     VL_AsmCompiled* Compiled=CompileToX86(Program);
44     if(Compiled->Errors.GetCount())
45     {
46         PrintErrors(Program,Compiled);
47         delete Program;
48         delete Compiled;
49         return;
50     }
51 
52     VL_AsmExecutable* Executable=LinkX86(Compiled);
53     if(Compiled->Errors.GetCount())
54     {
55         PrintErrors(Program,Compiled);
56     }
57     if(Executable)
58     {
59         RunExecutable(Program,Compiled,Executable);
60         delete Executable;
61     }
62     delete Program;
63     delete Compiled;
64 }

    得到結果:

    接下來熟悉浮點數的操作,就可以開始中間指令集的構造了。
posted on 2009-03-01 05:27 陳梓瀚(vczh) 閱讀(1817) 評論(9)  編輯 收藏 引用 所屬分類: JIT

評論:
# re: JIT腳本引擎:stdcall、cdecl和fastcall 2009-03-03 05:39 | lnn
To day is my birthday!  回復  更多評論
  
# re: JIT腳本引擎:stdcall、cdecl和fastcall 2009-03-03 21:20 | OwnWaterloo
--------------------------------------------------------------------------------------------
stdcall、cdecl和fastcall的參數都是從右到左入棧,并且返回值遵循以下規律:
    小于等于4字節結構用EAX
    小于等于8字節結構用EDX:EAX
    浮點數用ST(0)
    其他則在EAX放置一個指針,供返回值使用
--------------------------------------------------------------------------------------------
 
請問一下,關于這個規律,是有標準規定的嗎?
C/C++的書籍或者標準中,都沒有規定調用約定。
還是說,這些只是事實上的標準?
 
如果只是事實上的標準,這些規律的應用范圍只限于x86以及其兼容機?
  回復  更多評論
  
# re: JIT腳本引擎:stdcall、cdecl和fastcall 2009-03-04 09:27 | 路人戊
@OwnWaterloo
參數入棧方向沒有標準,甚至沒有事實上的標準,IA86上GCC和VC編譯器方向就不同。
其他寄存器多的CPU編譯器傾向盡可能地利用寄存器來傳遞參數,會出現調用函數壓棧就只是壓進一個返回地址的情形

一擊脫離……  回復  更多評論
  
# re: JIT腳本引擎:stdcall、cdecl和fastcall 2009-03-04 19:20 | 陳梓瀚(vczh)
@路人戊
這是windows下編譯器的約定,windows下的vc++、gcc和c++builder都遵守這個約定。至于其他的怎么辦其實都無所謂了,因為windows的程序只能直接調用windows的程序。  回復  更多評論
  
# re: JIT腳本引擎:stdcall、cdecl和fastcall 2009-03-04 19:21 | 陳梓瀚(vczh)
@OwnWaterloo
這在msdn里有詳細描述。  回復  更多評論
  
# re: JIT腳本引擎:stdcall、cdecl和fastcall 2009-03-04 23:44 | OwnWaterloo
@陳梓瀚(vczh)
MSDN就是微軟的編譯器了。

其他的編譯器是否也是這樣?

雖然我也覺得其他編譯器也應該是這樣。
沒有理由無故的與樓主描述的__cdecl,__stdcall實現不兼容。

但是心里沒譜啊 ……
樓主作過其他編譯器的調查么?
有前人作過類似的調查么?
  回復  更多評論
  
# re: JIT腳本引擎:stdcall、cdecl和fastcall 2009-03-05 00:07 | 陳梓瀚(vczh)
@OwnWaterloo
我以前用的是C++Builder,根據觀察一致。而且這里有一個很強大的理由,如果不兼容的話,怎么調API?所以必須兼容。  回復  更多評論
  
# re: JIT腳本引擎:stdcall、cdecl和fastcall 2009-03-05 03:03 | OwnWaterloo
@陳梓瀚(vczh)
---------------------------------------------
如果不兼容的話,怎么調API?所以必須兼容。
---------------------------------------------
---------------------------------------------
雖然我也覺得其他編譯器也應該是這樣。
沒有理由無故的與樓主描述的__cdecl,__stdcall實現不兼容。
---------------------------------------------
我想說的就是這個意思,應該不會有編譯器放棄大多數舊有的C目標文件遵守的約定,另尋它法。


但是呢。。。 還是不像有個ISO那么有把握。


http://www.unixwiz.net/techtips/win32-callconv.html
這篇文章里說了一個入棧順序,和平時所說的右到左不同。
但在win32上結論是一樣的。

  回復  更多評論
  
# re: JIT腳本引擎:stdcall、cdecl和fastcall 2009-03-05 04:45 | 陳梓瀚(vczh)
@OwnWaterloo
有了ISO也不見得就怎么樣  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲国产精品成人综合色在线婷婷| 亚洲字幕一区二区| 亚洲伦理在线观看| 亚洲激情啪啪| 一级日韩一区在线观看| 日韩亚洲欧美成人| 亚洲视频在线观看视频| 亚洲在线视频观看| 久久激情五月丁香伊人| 久久久久久亚洲精品杨幂换脸| 久久免费视频这里只有精品| 欧美ab在线视频| 亚洲欧洲日产国产网站| 欧美激情2020午夜免费观看| 亚洲欧洲在线一区| 在线一区欧美| 久久久久.com| 欧美激情在线| 久久精品亚洲一区二区三区浴池| 国产婷婷精品| 亚洲高清在线观看| 亚洲天堂网站在线观看视频| 久久精品国产亚洲高清剧情介绍| 男女激情视频一区| 在线视频你懂得一区二区三区| 欧美亚洲综合网| 欧美精品在线免费| 一区二区三区亚洲| 亚洲欧美日韩中文视频| 欧美电影免费观看高清| 亚洲一区久久| 欧美啪啪成人vr| 激情综合自拍| 新片速递亚洲合集欧美合集| 亚洲国产精品一区二区久| 亚洲欧美日韩精品一区二区| 欧美精品激情| 在线观看视频一区| 欧美一区二区私人影院日本| 最新精品在线| 久久久国际精品| 国产精品视频九色porn| 日韩午夜中文字幕| 蜜桃av久久久亚洲精品| 亚洲午夜91| 欧美日韩国产成人在线观看| 亚洲国产成人精品久久久国产成人一区 | 亚洲另类视频| 嫩草影视亚洲| 一区二区三区自拍| 久久久久国产一区二区| 亚洲一级在线观看| 国产精品成人国产乱一区| 亚洲精品日韩一| 欧美成年人视频网站| 久久精品道一区二区三区| 国产欧美一区二区三区在线老狼| 亚洲一区二区av电影| 亚洲激情欧美激情| 欧美国产欧美亚洲国产日韩mv天天看完整| 狠狠做深爱婷婷久久综合一区| 欧美一区成人| 香蕉av777xxx色综合一区| 国产农村妇女精品| 久久精品123| 欧美中在线观看| 黄色影院成人| 美乳少妇欧美精品| 欧美激情国产日韩精品一区18| 日韩一级裸体免费视频| 日韩午夜电影av| 国产精品入口夜色视频大尺度| 欧美中日韩免费视频| 久久久xxx| 亚洲久色影视| 久久精品欧美日韩| 亚洲黄色毛片| 日韩网站免费观看| 国产精品日韩久久久| 久久久97精品| 欧美77777| 亚洲自拍高清| 久久国产精品99国产| 亚洲国产日韩在线一区模特| 亚洲精品社区| 国产日韩在线不卡| 欧美激情一区在线| 欧美天天影院| 麻豆精品在线播放| 欧美日韩激情网| 久久精品国产第一区二区三区| 免费不卡中文字幕视频| 亚洲一区日本| 久久这里有精品15一区二区三区| 一区二区三区视频在线| 亚欧美中日韩视频| 亚洲美女一区| 欧美一级黄色网| 亚洲蜜桃精久久久久久久| 亚洲永久在线观看| 亚洲国产视频直播| 性伦欧美刺激片在线观看| 亚洲免费av网站| 久久精品亚洲| 亚洲在线视频观看| 欧美成年人视频| 久久久精品国产一区二区三区 | 国产有码在线一区二区视频| 亚洲国产综合在线| 国产一区二区三区黄| 亚洲精品一区二区三区在线观看| 国模私拍一区二区三区| 一区二区三区精品视频在线观看| 亚洲福利电影| 久久国产欧美精品| 欧美中文字幕视频| 国产精品成人一区| 亚洲欧洲在线看| 亚洲精品久久久久久久久久久| 久久精品一区蜜桃臀影院 | 欧美一区=区| 欧美日韩免费看| 亚洲高清资源| 亚洲国产精品欧美一二99| 欧美一区二区日韩| 午夜在线电影亚洲一区| 欧美日韩不卡一区| 91久久极品少妇xxxxⅹ软件| 亚洲国产精品电影| 久久精品首页| 欧美sm重口味系列视频在线观看| 国产一区二区精品在线观看| 亚洲一区免费网站| 午夜视黄欧洲亚洲| 亚洲欧美久久久久一区二区三区| 亚洲欧美成人网| 午夜精品久久久久久久蜜桃app | 亚洲国产专区| 麻豆精品视频在线观看| 欧美96在线丨欧| 亚洲国产视频一区二区| 免费中文日韩| 亚洲精品无人区| 亚洲小说欧美另类社区| 欧美日韩免费观看一区二区三区| 99精品久久久| 欧美在线黄色| 国产一区二区三区自拍| 欧美中文字幕第一页| 美女日韩欧美| 一区二区自拍| 欧美大片在线观看一区| 91久久精品国产| 午夜国产精品视频免费体验区| 国产精品嫩草99av在线| 亚洲欧美中文日韩在线| 久久综合伊人77777尤物| 亚洲韩日在线| 欧美高清你懂得| 亚洲香蕉伊综合在人在线视看| 久久精品免费观看| 在线观看一区二区精品视频| 欧美激情小视频| 亚洲在线视频一区| 麻豆精品视频| 亚洲特色特黄| 韩曰欧美视频免费观看| 欧美激情精品久久久久久久变态 | 一本色道综合亚洲| 久久gogo国模裸体人体| 亚洲高清自拍| 国产精品日韩| 欧美成人久久| 欧美一级在线视频| 亚洲人成绝费网站色www| 午夜伦欧美伦电影理论片| 有码中文亚洲精品| 国产精品久久久久久久浪潮网站| 久久久人人人| 亚洲无线视频| 亚洲国产高清一区二区三区| 午夜一区二区三视频在线观看 | 午夜视频久久久久久| 亚洲国产欧美另类丝袜| 久久99伊人| 夜夜嗨av一区二区三区网页| 国语自产精品视频在线看| 欧美日韩在线不卡一区| 欧美一区二区视频网站| 亚洲精品久久久蜜桃| 久久综合五月| 久久精品夜色噜噜亚洲a∨| 亚洲午夜av在线| 亚洲精品麻豆| 韩国三级电影一区二区| 欧美视频一区二区三区四区| 麻豆精品精华液| 久久久久久国产精品一区| 午夜国产精品视频免费体验区| 亚洲日本一区二区|