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

隨筆-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>
            亚洲欧美日韩精品一区二区| 亚洲一卡久久| 农夫在线精品视频免费观看| 老司机午夜免费精品视频| 欧美日韩在线一二三| 中文精品一区二区三区| 91久久久在线| 一区二区三区在线观看视频| 久久久久88色偷偷免费| 久久久久看片| 亚洲国产乱码最新视频| 免费欧美日韩| 一区二区三区回区在观看免费视频| 一本大道久久a久久精二百| 欧美日韩精品| 欧美一级视频免费在线观看| 久久影视三级福利片| 亚洲精选在线观看| 欧美日韩高清区| 亚洲欧美一区二区三区极速播放| 久久久美女艺术照精彩视频福利播放 | 激情懂色av一区av二区av| 一本一本久久a久久精品综合妖精| 亚洲一区二区精品在线观看| 国产一区二区三区久久悠悠色av| 欧美暴力喷水在线| 亚洲一区二区三区四区五区午夜 | 亚洲图片在线| 亚洲第一区在线| 国产日产精品一区二区三区四区的观看方式| 欧美一二三视频| 国产综合香蕉五月婷在线| 欧美激情成人在线视频| 亚洲精品乱码久久久久久日本蜜臀| 国产精品久久久久久久久免费桃花 | 久久精品国产亚洲高清剧情介绍 | 狂野欧美一区| 欧美亚洲在线视频| 日韩一级大片| 亚洲最新视频在线| 一区二区三区国产在线| 一本色道久久综合亚洲二区三区| 亚洲国产精品电影| 欧美不卡福利| 欧美激情在线狂野欧美精品| 两个人的视频www国产精品| 久久午夜精品| 猛干欧美女孩| 亚洲第一色在线| 亚洲精品一区在线观看| 一区二区欧美在线观看| 中文日韩电影网站| 欧美亚洲专区| 久久精品综合一区| 狂野欧美性猛交xxxx巴西| 欧美精品在线免费观看| 欧美日韩综合| 国产亚洲一区二区三区在线观看| 国产亚洲美州欧州综合国| 激情视频亚洲| 夜夜夜久久久| 免费日韩av电影| 日韩写真视频在线观看| 欧美一区网站| 久久成人18免费观看| 亚洲第一页自拍| 亚洲亚洲精品在线观看| 美女爽到呻吟久久久久| 欧美高清在线播放| 亚洲天堂网在线观看| 蜜桃av噜噜一区| 国产精品自拍在线| 一二三四社区欧美黄| 久久先锋资源| 亚洲欧美综合| 国产精品福利久久久| 在线精品国精品国产尤物884a| 亚洲午夜女主播在线直播| 免费国产一区二区| 欧美黄色片免费观看| 亚洲激情一区二区| 欧美成人亚洲成人日韩成人| 亚洲一区二区免费| 欧美另类极品videosbest最新版本| 国产一区二区三区久久悠悠色av | 99re66热这里只有精品3直播 | 美女国内精品自产拍在线播放| 中文欧美字幕免费| 国产精品一区一区| 欧美亚洲视频在线观看| 亚洲午夜精品网| 国产精品永久| 久久国产毛片| 久久五月天婷婷| 亚洲一区欧美一区| 欧美日韩精品福利| 欧美一区二区三区视频免费播放 | 亚洲一二三区在线| 亚洲一区二区三区精品在线| 国产精品久久久久秋霞鲁丝 | 国产一区日韩欧美| 免费成人网www| 欧美日本成人| 久久精品国产v日韩v亚洲| 久久狠狠亚洲综合| 亚洲欧洲视频在线| 亚洲天堂av在线免费观看| 黄色小说综合网站| 亚洲精品国产无天堂网2021| 国产精品久久久久久久久久免费 | 亚洲午夜精品在线| 精品成人国产| 亚洲美女区一区| 国产视频一区在线观看| 亚洲国产精品女人久久久| 国产欧美日韩综合精品二区| 欧美jizzhd精品欧美喷水| 欧美精品色综合| 久久亚洲综合色| 国产精品任我爽爆在线播放| 亚洲国产精品久久久久久女王| 国产欧美一区二区三区久久| 99视频一区二区三区| 亚洲欧美日韩第一区| 亚洲激情黄色| 久久精品国产69国产精品亚洲| 亚洲乱码国产乱码精品精| 久久中文久久字幕| 蜜桃精品久久久久久久免费影院| 国产欧美韩国高清| 亚洲一区二区三区在线看| 一区二区高清在线| 欧美极品色图| 亚洲精品女人| 亚洲精品国精品久久99热一| 久久综合精品国产一区二区三区| 久久大逼视频| 国内免费精品永久在线视频| 欧美在线不卡| 亚洲国产国产亚洲一二三| 欧美日韩国产一区精品一区| 玖玖在线精品| 国产精品chinese| 亚洲美女啪啪| 亚洲免费视频在线观看| 亚洲精选一区二区| 亚洲女爱视频在线| 国产在线播放一区二区三区| 久久久久久9999| 亚洲黄网站黄| 欧美一区二区三区视频在线观看| 国产亚洲精品久久飘花| 久久―日本道色综合久久| 亚洲国产精品久久久久婷婷老年 | 国产农村妇女精品一二区| 久久精品盗摄| 日韩亚洲欧美成人| 久久这里有精品视频| 一级日韩一区在线观看| 国内精品视频在线观看| 欧美人与禽猛交乱配视频| 亚洲欧美三级在线| 亚洲狼人精品一区二区三区| 久久亚洲图片| 欧美在线观看视频一区二区三区| 亚洲电影第1页| 国产日韩欧美在线播放不卡| 欧美日韩国产成人| 久久一区免费| 久久天天躁夜夜躁狠狠躁2022| 亚洲午夜一区| 一本色道久久综合亚洲精品婷婷 | 一区二区三区日韩欧美| 你懂的视频欧美| 久久男人资源视频| 久久成人国产| 久久久久久久久久久久久久一区 | 激情小说另类小说亚洲欧美| 欧美三级小说| 国产精品嫩草影院一区二区| 欧美天天影院| 国产精品高清网站| 国产精品综合久久久| 国产视频一区二区三区在线观看| 国产精品久久久久久影院8一贰佰 国产精品久久久久久影视 | 99国产精品私拍| 日韩亚洲国产精品| 在线亚洲激情| 欧美亚洲视频一区二区| 久久噜噜噜精品国产亚洲综合| 老色鬼久久亚洲一区二区| 欧美激情精品久久久久久| 亚洲欧洲综合另类| 国产精品99久久久久久人| 亚洲欧美日本精品| 久久婷婷久久一区二区三区| 欧美日韩中文另类| 国外精品视频| 亚洲图中文字幕| 噜噜噜躁狠狠躁狠狠精品视频|