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

隨筆-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>
            久久在线免费| 亚洲免费视频成人| 亚洲精品视频二区| 久久大综合网| 亚洲精选一区二区| 国产精品视频精品视频| 老司机午夜免费精品视频| 欧美在线视频导航| 亚洲综合丁香| 欧美大片在线观看一区| 国产一区二区精品丝袜| 9久草视频在线视频精品| 亚洲国产专区校园欧美| 老司机67194精品线观看| 狂野欧美激情性xxxx欧美| 国产一区二区在线观看免费| 久久国产福利国产秒拍| 蜜臀av性久久久久蜜臀aⅴ| 亚洲国产精品激情在线观看| 久久久久在线| 欧美激情第8页| 一区二区三区国产在线| 久久黄色网页| 欧美一区二区三区的| 欧美一级久久久| 久久av二区| 欧美二区视频| 性色一区二区三区| 久久精品动漫| 久久精品夜色噜噜亚洲aⅴ| 狠狠色综合网站久久久久久久| 欧美无砖砖区免费| 久久久久久一区二区三区| 在线不卡中文字幕| 欧美精品一区在线| 日韩午夜在线电影| 亚洲网站在线| 欧美精品福利在线| 卡一卡二国产精品| 国产一二三精品| 久久久精品999| 性欧美8khd高清极品| av成人免费在线| 亚洲精品字幕| 欧美在线播放一区二区| 中文日韩欧美| 亚洲高清色综合| 久久国产福利国产秒拍| 一区二区三区日韩精品| 黄色小说综合网站| 亚洲一区日韩在线| 免费在线国产精品| 欧美日韩国产不卡| 亚洲欧美国产视频| 亚洲精品视频一区| 嫩草影视亚洲| 亚洲一区欧美激情| 亚洲高清视频一区二区| 亚洲激情在线观看| 国产精品五月天| 欧美日韩精品综合| 免费高清在线视频一区·| 日韩视频国产视频| 欧美成人性生活| 国产欧美欧美| 欧美国产一区在线| 亚洲欧美日韩成人| 一本色道久久综合亚洲精品按摩| 欧美性大战久久久久久久蜜臀| 欧美日韩一级黄| 亚洲欧美日韩久久精品| 亚洲自拍偷拍色片视频| 亚洲电影免费观看高清完整版在线 | 亚洲女同在线| 国产伦精品一区二区三区| 久久琪琪电影院| 欧美日韩精品三区| 亚洲国产欧美日韩另类综合| 欧美激情女人20p| 嫩模写真一区二区三区三州| 亚洲淫性视频| 国产精品大全| 亚洲激情精品| 亚洲国产成人精品久久| 亚洲片在线资源| 在线精品福利| 一区二区日韩| 久久九九免费视频| 国产精品专区h在线观看| 亚洲婷婷在线| 亚洲在线视频免费观看| 免费在线视频一区| 亚洲人成在线观看网站高清| 亚洲视频一区| 黄色一区二区在线| 欧美精品一区在线发布| 亚洲一区在线直播| 久久亚洲国产精品一区二区| 永久免费毛片在线播放不卡| 牛牛影视久久网| 亚洲精品亚洲人成人网| 亚洲免费视频一区二区| 亚洲精品视频免费在线观看| 欧美色另类天堂2015| 久久精品国产久精国产思思| 久久综合久久综合九色| 在线视频一区二区| 亚洲久久一区二区| 亚洲电影网站| 国产精品网红福利| 欧美精品在线视频| 久久精品一区二区三区不卡牛牛| 亚洲福利视频一区二区| 91久久精品www人人做人人爽| 欧美日韩亚洲一区二区三区在线观看| 亚洲视频狠狠| 亚洲激情视频在线播放| 欧美区国产区| 亚洲一区日韩在线| 在线综合+亚洲+欧美中文字幕| 亚洲男人第一网站| 精品成人一区| 精品不卡一区| 亚洲福利电影| 在线不卡中文字幕播放| 国产午夜精品在线| 国产日韩欧美高清| 国产欧美日本一区二区三区| 亚洲欧美卡通另类91av| 亚洲一本视频| 亚洲一区中文| 久久视频在线看| 久久久噜久噜久久综合| 欧美在线999| 亚洲影院免费| 欧美aa国产视频| 另类图片综合电影| 欧美激情综合在线| 欧美午夜精品久久久久久久| 国产欧美日韩91| 国产一区二区精品丝袜| 在线观看视频一区二区欧美日韩| 亚洲欧洲视频在线| 一区二区三区欧美在线观看| 亚洲一区二区三区激情| 久久尤物视频| 日韩亚洲一区二区| 免费看亚洲片| 国产婷婷精品| 亚洲视频导航| 欧美国产日本高清在线| 亚洲欧美一区二区三区久久| 欧美成人69av| 欧美日韩精品伦理作品在线免费观看| 欧美国产日本在线| 91久久亚洲| 欧美激情欧美激情在线五月| 亚洲网址在线| 国产精品一区免费观看| 久久国产精品99国产精| 欧美激情一区二区三区在线| 在线成人中文字幕| 欧美一级片一区| 亚洲砖区区免费| 欧美日韩一区在线视频| 亚洲精品国精品久久99热| 久久精品夜色噜噜亚洲a∨| 欧美在线视频一区二区| 国产精品美女黄网| 亚洲一区二区久久| 亚洲网站在线观看| 狠狠色伊人亚洲综合成人| 久久精品午夜| 久久久久久久尹人综合网亚洲 | 国产嫩草影院久久久久| 香蕉免费一区二区三区在线观看| 亚洲激情综合| 欧美亚洲一区三区| 亚洲精品久久久蜜桃| 亚洲国产视频一区| 欧美区视频在线观看| 亚洲日本一区二区| 亚洲欧美在线播放| 国产乱码精品一区二区三区五月婷 | 99国产精品视频免费观看| 性欧美1819性猛交| 精品成人一区二区三区四区| 欧美www视频| 欧美三区免费完整视频在线观看| 一区二区三区欧美在线| 午夜国产精品影院在线观看| 亚洲国内在线| 性欧美精品高清| 亚洲乱码国产乱码精品精98午夜| 国产一区二区毛片| 午夜日韩激情| 美女国产精品| 乱人伦精品视频在线观看| 午夜精品久久久久久久久久久| 亚洲国产精品va在线观看黑人 |