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

隨筆-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>
            在线欧美视频| 欧美屁股在线| 亚洲精一区二区三区| 欧美va亚洲va日韩∨a综合色| 欧美在线欧美在线| 久久这里只精品最新地址| 噜噜噜噜噜久久久久久91| 欧美+日本+国产+在线a∨观看| 欧美激情欧美狂野欧美精品| 亚洲日本va午夜在线电影| 欧美成年人在线观看| 亚洲电影免费观看高清完整版在线| 亚洲激情欧美| 亚洲成人在线免费| 国产精品剧情在线亚洲| 亚洲一区二区精品在线| 亚洲视频大全| 久久狠狠婷婷| 欧美人在线观看| 国产美女精品一区二区三区| 尤物九九久久国产精品的分类| 亚洲日本免费电影| 亚洲欧美日韩国产成人| 欧美成人精品在线| 欧美一区亚洲二区| 欧美视频不卡| 亚洲人久久久| 久久精品一区四区| 日韩亚洲欧美精品| 另类亚洲自拍| 国产伦精品一区二区三区高清版| 亚洲国产片色| 久久精品九九| 中文欧美日韩| 欧美日韩国产精品一卡| 亚洲第一天堂无码专区| 久久激情综合网| 一区二区高清视频| 欧美韩国日本综合| 亚洲国产高清在线| 久久在线免费| 亚洲欧美视频一区| 欧美日韩一区三区| 日韩午夜在线电影| 欧美激情一区| 免费观看亚洲视频大全| 韩国女主播一区| 欧美在线观看日本一区| 一本大道久久a久久综合婷婷| 老司机午夜免费精品视频 | 亚洲国产婷婷香蕉久久久久久| 亚洲影视综合| 欧美亚一区二区| 一本色道久久综合亚洲精品按摩 | 亚洲免费视频成人| 欧美精品成人| 一区二区三区你懂的| 亚洲国产另类精品专区| 欧美xxxx在线观看| 一区二区三区视频在线播放| 欧美激情免费在线| 欧美国产先锋| 中国av一区| 亚洲精选91| 欧美激情自拍| 亚洲在线观看视频| 一区二区免费在线播放| 国产精品久久久亚洲一区 | 亚洲精品国精品久久99热| 欧美国产亚洲另类动漫| 欧美+日本+国产+在线a∨观看| 亚洲人成在线播放| 亚洲美女黄色| 国产精品亚洲激情| 久久一二三国产| 欧美成人嫩草网站| 在线视频亚洲| 欧美一区国产在线| 亚洲福利视频在线| 亚洲美女性视频| 国产欧美一级| 欧美成人精品影院| 欧美亚州一区二区三区| 久久精品一区二区三区四区| 老司机午夜精品视频| 亚洲影视综合| 久久久爽爽爽美女图片| 一区二区三区黄色| 欧美一区1区三区3区公司| 亚洲国产婷婷综合在线精品 | 欧美日韩免费视频| 久久成人人人人精品欧| 欧美 日韩 国产精品免费观看| 一区二区精品国产| 欧美一区二区三区四区夜夜大片 | 国产一区二区中文字幕免费看| 欧美a级片网站| 国产精品国产三级国产aⅴ浪潮 | 欧美激情小视频| 国产精品日本精品| 欧美激情在线免费观看| 国产精品视频免费一区| 亚洲第一在线综合网站| 欧美午夜一区二区福利视频| 久久综合电影一区| 国产精品xxxav免费视频| 美国成人直播| 国产精品午夜在线| 91久久精品一区二区三区| 国产一区二区三区日韩| 一区二区三区免费观看| 亚洲日本在线视频观看| 欧美一区二区三区成人| 亚洲午夜精品久久| 噜噜噜噜噜久久久久久91| 久久精品欧美日韩| 国产精品推荐精品| 一区二区日韩| 亚洲欧美成aⅴ人在线观看| 欧美精品免费播放| 免费人成网站在线观看欧美高清 | 永久免费毛片在线播放不卡| 亚洲精品在线看| 亚洲第一区中文99精品| 欧美一区精品| 久久精品日产第一区二区| 国产精品久久久久久久久久久久久久| 亚洲国产高清一区| 亚洲人成网站在线观看播放| 久久久精品五月天| 老司机免费视频一区二区| 韩日欧美一区二区| 久久久国产精品一区二区三区| 久久久精品国产免大香伊| 国产日韩欧美黄色| 香港久久久电影| 久久久久久久999精品视频| 国产欧美视频一区二区三区| 亚洲欧美激情诱惑| 久久婷婷国产麻豆91天堂| 国内自拍一区| 久久www成人_看片免费不卡| 久久伊人精品天天| 亚洲国产成人在线| 欧美精品一区二区三区在线看午夜| 亚洲日本成人女熟在线观看| 亚洲性色视频| 韩日精品在线| 欧美aa国产视频| 亚洲美女精品久久| 亚洲专区一区| 揄拍成人国产精品视频| 欧美jizz19hd性欧美| 日韩视频在线你懂得| 亚洲欧美文学| 亚洲成人直播| 欧美视频在线看| 欧美在线不卡| 91久久精品日日躁夜夜躁欧美| 亚洲一区二区三区精品在线| 国产一区二区高清视频| 欧美 日韩 国产在线| 亚洲一区二区三区四区视频| 久久免费精品视频| 亚洲日本免费电影| 国产精品v亚洲精品v日韩精品| 欧美一区免费| 日韩午夜av| 久久亚洲精品一区二区| 一本久道综合久久精品| 国产情人节一区| 欧美激情免费在线| 香港久久久电影| 亚洲人成网站777色婷婷| 午夜精品久久久久久久99樱桃| 一区精品在线播放| 国产精品久久久久久av下载红粉| 久久精品中文字幕一区二区三区| 91久久久久久久久久久久久| 欧美在线free| 制服丝袜激情欧洲亚洲| 亚洲电影自拍| 国产一区二区三区久久| 欧美日韩亚洲一区二区| 久久中文字幕一区二区三区| 在线视频一区二区| 亚洲国产精品久久久久秋霞影院 | 亚洲影院色无极综合| 欧美一区国产一区| 91久久在线播放| 噜噜噜噜噜久久久久久91| 一本一本久久| 亚洲国产精品久久久| 国产精品一区免费在线观看| 欧美高清成人| 噜噜噜噜噜久久久久久91| 欧美在线视频网站| 午夜精品久久久| 亚洲欧美日韩在线播放| 亚洲字幕一区二区|