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

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

匯編說明__cdecl,__stdcall,__fastcall的差異

1.如果函數func__cdecl(C/C++默認調用方式,實現可變參數函數),調用時情況如下  
 

clip_image001int   main() 
clip_image002clip_image003 
...
clip_image004 
//
參數從右到左壓棧 
clip_image004
  push   4 
clip_image004  push   3 
clip_image004  push   2 
clip_image004  push   1 
clip_image004  call   func 
clip_image004  add   esp   0x10  
//調用者恢復堆棧指針esp4個參數的大小是0x10(4x4) 
clip_image005
  }  


   
  2.
如果函數func__stdcall(最多語言支持的方式,COM規范標準),調用時情況如下  
 

clip_image001int   main() 
clip_image002clip_image003 
...
clip_image004 
//
參數從右到左壓棧 
clip_image004
  push   4 
clip_image004  push   3 
clip_image004  push   2 
clip_image004  push   1 
clip_image004  call   func 
clip_image004               
//恢復堆棧指針由被調用者func負責,方法是"ret   0x10" 
clip_image005
  }  


   
  3.
如果函數func__pascal,調用情況如下  
 

clip_image001int   main() 
clip_image002clip_image003 
...
clip_image004 
//
參數從左到右壓棧 
clip_image004
  push   1 
clip_image004  push   2 
clip_image004  push   3 
clip_image004  push   4 
clip_image004  call   func 
clip_image004 
//恢復堆棧指針由被調用者func負責,方法是"ret   0x10" 
clip_image005
  }  


   
  3.
如果函數func__fastcall(寄存器傳參),調用情況如下  
 

clip_image001int   main() 
clip_image002clip_image003 
...
clip_image004 
//
參數先用ecx,   edx,   eax傳遞,然后再壓棧 
clip_image004  //
不進棧 
clip_image004  //(
不知為什么,幫助中寫的是從左到右傳遞的, 
clip_image004  //
是不是錯了,還是bcb6bcb5的不一樣
clip_image004
  push   4 
clip_image004  mov   ecx 3 
clip_image004  mov   edx 2 
clip_image004  mov   eax 1 
clip_image004  call   func 
clip_image004 
//恢復堆棧指針由被調用者func負責,方法是"ret   0x04", 
clip_image004  //
因為只進棧一個參數,其余用寄存器傳遞,所以用ret   0x04恢復 
clip_image005
  }  


 

發表者:huang_jh

 
  #define   callback         __stdcall  
   
  #define   winapi             __stdcall  
   
 
定義成不同的名字只是為了"望文知意"就像hwndhcursor是一樣的類型.  
 
他們都是窗口函數(過程)......  
 

發表者:sinman

我收集的,全仍上來了  
   
 
左通過棧傳遞,被調用的函數在返回前清理傳送參數的內存棧,但不同的是函數名的修飾部分。  
   
         _stdcall
pascal程序的缺省調用方式,通常用于win32   api,函數采用從右到左的壓棧方式,自己在退出時清空堆棧。vc將函數編譯后會在函數名前面加上下劃線前綴,在函數名后加上"@"和參數的字節數。  
   
2
c調用約定按從右至左的順序壓參數入棧,由調用者把參數彈出棧。對于傳送參數的內存棧是由調用者來維護的。另外,在函數名修飾約定方面也有所不同。  
   
          _cdecl
cc++程序的缺省調用方式。每一個調用它的函數都包含清空堆棧的代碼,所以產生的可執行文件大小會比調用_stdcall函數的大。函 數采用從右到左的壓棧方式。vc將函數編譯后會在函數名前面加上下劃線前綴。是mfc缺省調用約定。  
   
          3
__fastcall調用約定是如其名,它的主要特點就是快,因為它是通過寄存器來傳送參數的或更小的參數,剩下的參數仍舊自右向左壓棧傳送,被調用的函數在返回前清理傳送參數的內存棧),在函數名修飾約定方面,它和前兩者均不同。  
   
          _fastcall
方式的函數采用寄存器傳遞參數,vc將函數編譯后會在函數名前面加上"@"前綴,在函數名后加上"@"和參數的字節數。          
   
          4
thiscall僅僅應用于“c++”成員函數。this指針存放于cx寄存器,參數從右到左壓。thiscall不是關鍵詞,因此不能被程序員指定。  
   
          5
naked   call采用1-4的調用約定時,如果必要的話,進入函數時編譯器會產生代碼來保存esiediebxebp寄存器,退出函數時則產生代碼恢復這些寄存器的內容。naked   call不產生這樣的代碼。naked   call不是類型修飾符,故必須和_declspec共同使用。  
   
         
關鍵字   __stdcall__cdecl__fastcall可以直接加在要輸出的函數前,也可以在編譯環境的setting...\c/c++   \code   generation項選擇。當加在輸出函數前的關鍵字與編譯環境中的選擇不同時,直接加在輸出函數前的關鍵字有效。它們對應的命令行參數分別為/gz /gd/gr。缺省狀態為/gd,即__cdecl  
   
         
要完全模仿pascal調用約定首先必須使用__stdcall調用約定,至于函數名修飾約定,可以通過其它方法模仿。還有一個值得一提的是winapi 宏,windows.h支持該宏,它可以將出函數翻譯成適當的調用約定,在win32中,它被定義為__stdcall。使用winapi宏可以創建自己 的apis  
   
  2)
名字修飾約定  
   
  1
、修飾名(decoration   name)  
   
  “c”
或者“c++”函數在內部通過修飾名識別。修飾名是編譯器在編譯函數定義或者原型時生成的字符串。有些情況下使用函數的修飾名是必要的,如在模塊定義文件里頭指定輸出“c++”重載函數、構造函數、析構函數,又如在匯編代碼里調用“c””“c++”函數等。  
   
 
修飾名由函數名、類名、調用約定、返回類型、參數等共同決定。  
   
  2
、名字修飾約定隨調用約定和編譯種類(cc++)的不同而變化。函數名修飾約定隨編譯種類和調用約定的不同而不同,下面分別說明。  
   
          a
c編譯時函數名修飾約定規則:  
   
    __stdcall
調用約定在輸出函數名前加上一個下劃線前綴,后面加上一個“@”符號和其參數的字節數,格式為_functionname@number  
   
    __cdecl
調用約定僅在輸出函數名前加上一個下劃線前綴,格式為_functionname  
         
    __fastcall
調用約定在輸出函數名前加上一個“@”符號,后面也是一個“@”符號和其參數的字節數,格式為@functionname@number  
   
         
它們均不改變輸出函數名中的字符大小寫,這和pascal調用約定不同,pascal約定輸出的函數名無任何修飾且全部大寫。  
   
          b
c++編譯時函數名修飾約定規則:  
   
  __stdcall
調用約定:  
                      1
、以“?”標識函數名的開始,后跟函數名;  
                      2
、函數名后面以“@@yg”標識參數表的開始,后跟參數表;  
                      3
、參數表以代號表示:  
                            x--void  
  
                            d--char
 
                            e--unsigned   char
  
                            f--short
  
                            h--int
  
                            i--unsigned   int
  
                            j--long
  
                            k--unsigned   long
  
                            m--float
  
                            n--double
  
                            _n--bool
  
                            ....  
                            pa--
表示指針,后面的代號表明指針類型,如果相同類型的指針連續出現,以“0”代替,一個“0”代表一次重復;  
                      4
、參數表的第一項為該函數的返回值類型,其后依次為參數的數據類型,指針標識在其所指數據類型前;    
                      5
、參數表后以“@z”標識整個名字的結束,如果該函數無參數,則以“z”標識結束。  
   
         
其格式為“?functionname@@yg*****@z”“?functionname@@yg*xz”,例如  
                      int   test1-----“?test1@@yghpadk@z”  
                      void   test2                                               -----“?test2@@ygxxz”  
   
  __cdecl
調用約定:  
 
規則同上面的_stdcall調用約定,只是參數表的開始標識由上面的“@@yg”變為“@@ya”  
   
  __fastcall
調用約定:  
 
規則同上面的_stdcall調用約定,只是參數表的開始標識由上面的“@@yg”變為“@@yi”  
   
          vc++
對函數的省缺聲明是"__cedcl",將只能被c/c++調用.  
   
  cb
在輸出函數聲明時使用4種修飾符號  
  //__cdecl  
  cb
的默認值,它會在輸出函數名前加_,并保留此函數名不變,參數按照從右到左的順序依次傳遞給棧,也可以寫成_cdeclcdecl形式。  
  //__fastcall  
 
她修飾的函數的參數將盡肯呢感地使用寄存器來處理,其函數名前加@,參數按照從左到右的順序壓棧;  
  //__pascal  
 
它說明的函數名使用pascal格式的命名約定。這時函數名全部大寫。參數按照從左到右的順序壓棧;  
  //__stdcall  
 
使用標準約定的函數名。函數名不會改變。使用__stdcall修飾時。參數按照由右到左的順序壓棧,也可以是_stdcall

發表者:echoher

far是古代的東西  
   
 
16位模式下,指針是16位的  
 
指針的尋址空間只有64k  
 
如果指定far,說明這個指針指向的地址要加上基地址  
 
就是說用far可以指定64k以外的區域  
   
 
現在已經沒用了  
 
一點用也沒有了

 

posted on 2011-01-10 13:38 肥仔 閱讀(1535) 評論(1)  編輯 收藏 引用 所屬分類: C++ 基礎

評論

# re: 匯編說明__cdecl,__stdcall,__fastcall的差異[未登錄]  回復  更多評論   

太深奧,有點看不懂啊
2012-11-08 17:12 | 歲月漫步
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产农村妇女精品一区二区| 亚洲经典自拍| 亚洲欧洲视频在线| 亚洲精品在线观看视频| 韩国欧美一区| 精品成人一区二区三区四区| 国产一区二区三区在线观看精品| 欧美视频在线一区二区三区| 欧美激情在线播放| 欧美日韩和欧美的一区二区| 欧美成人免费在线| 欧美电影美腿模特1979在线看| 久久久久久久一区| 麻豆精品网站| 欧美视频精品一区| 国产综合精品一区| 亚洲国产精品第一区二区| 日韩香蕉视频| 久久久久久夜| 国产精品成人国产乱一区| 国产精品wwwwww| 韩国精品在线观看| 日韩视频一区二区三区在线播放免费观看| 亚洲四色影视在线观看| 亚洲第一免费播放区| 欧美专区18| 国产在线精品一区二区夜色| 亚洲一卡久久| 妖精成人www高清在线观看| 欧美aaaaaaaa牛牛影院| 亚洲第一黄色| 亚洲国产精品传媒在线观看| 久久久国际精品| 亚洲国产成人在线| 欧美激情久久久| 欧美刺激午夜性久久久久久久| 国产一区999| 欧美激情日韩| 国产精品v日韩精品| 久久成人精品无人区| 亚洲欧美日韩综合aⅴ视频| 国产精品视频最多的网站| 午夜宅男欧美| 久久综合激情| 亚洲午夜视频在线观看| 欧美在线观看视频一区二区三区| 亚洲韩国一区二区三区| 在线亚洲电影| 伊人久久亚洲热| 亚洲免费观看高清完整版在线观看| 欧美精品一区二区三| 欧美一区二区在线| 免费观看不卡av| 欧美亚洲一区在线| 欧美高清在线一区| 国产日韩欧美日韩| 日韩图片一区| 在线观看三级视频欧美| 亚洲综合好骚| 亚洲自拍偷拍色片视频| 欧美精品一区二区三区在线看午夜| 亚洲欧美日韩一区二区三区在线| 欧美大片在线看免费观看| 久久最新视频| 国产一区二区三区自拍| 亚洲一区二区免费| 亚洲欧美一区二区三区极速播放| 免费欧美在线视频| 亚洲国产综合91精品麻豆| 亚洲人成人一区二区三区| 久久深夜福利免费观看| 男人的天堂亚洲| 亚洲国产欧美一区二区三区久久 | 久久精品国产99国产精品| 久久综合网色—综合色88| 久久久蜜桃一区二区人| 亚洲国产欧美国产综合一区| 免费国产自线拍一欧美视频| 亚洲第一天堂av| 一本色道久久综合精品竹菊| 欧美视频一区二区三区四区| 午夜精品久久久久久久99樱桃 | 国产精品99久久久久久宅男| 久热re这里精品视频在线6| 亚洲欧美日韩精品综合在线观看| 在线观看精品| 欧美人在线视频| 亚洲一区二区视频在线观看| 亚洲欧美伊人| 狠狠v欧美v日韩v亚洲ⅴ| 久久久久久久一区二区| 久久久九九九九| 欧美成人黄色小视频| 久久伊人一区二区| 欧美亚洲一区二区在线观看| 亚洲视频中文| 亚洲国产精品ⅴa在线观看| 国产精品久久九九| 蜜桃久久精品一区二区| 欧美亚洲在线观看| 亚洲男人的天堂在线| 亚洲免费久久| 亚洲一区二区三区免费观看| 欧美一级在线播放| 欧美成人蜜桃| 蜜臀久久99精品久久久久久9| 亚洲午夜女主播在线直播| 亚洲电影免费观看高清| 精品69视频一区二区三区| 亚洲激情欧美激情| 亚洲一区二区三区在线看| 欧美在线免费观看视频| 亚洲综合丁香| 国产日韩欧美一区二区| 国产精品啊v在线| 欧美日韩一区自拍| 国产精品成人免费精品自在线观看| 美女国产一区| 欧美激情国产日韩精品一区18| 美脚丝袜一区二区三区在线观看 | 久久婷婷国产综合精品青草| 午夜亚洲影视| 久久网站免费| 亚洲国产一区视频| 9色精品在线| 欧美一区二区在线免费播放| 欧美一区二区观看视频| 欧美xx视频| 欧美日韩综合视频网址| 国产精品一区二区久久| 国内免费精品永久在线视频| 亚洲国产精品免费| 亚洲欧美国产va在线影院| 久久精品国产第一区二区三区| 久久综合精品国产一区二区三区| 欧美电影免费观看| 久久精品视频在线看| 欧美成人午夜激情视频| 国产精品嫩草99av在线| 黄网站免费久久| 亚洲一区日韩在线| 亚洲国产欧美另类丝袜| 欧美综合激情网| 国产精品夜色7777狼人 | 国产精品国产三级国产| 亚洲风情在线资源站| 久久伊人精品天天| 久久不射电影网| 国产日韩欧美三区| 久久久国产精品亚洲一区| 在线看片成人| 国产精品免费看| 91久久精品国产| 美女尤物久久精品| 久久精品国产999大香线蕉| 国产精品久久综合| 欧美一区二区三区婷婷月色 | 午夜免费日韩视频| 国产精品专区h在线观看| 亚洲欧美日韩精品久久奇米色影视 | 欧美二区在线观看| 久久综合九色99| 日韩视频免费在线观看| 一本久久a久久精品亚洲| 欧美精选在线| 夜夜嗨av一区二区三区免费区| 亚洲国产精品久久久久婷婷老年| 蘑菇福利视频一区播放| 一区二区三区日韩欧美精品| 一个色综合导航| 激情成人亚洲| aⅴ色国产欧美| 亚洲第一中文字幕在线观看| 最新国产の精品合集bt伙计| 国产精品久久久亚洲一区 | 亚洲视频你懂的| 久久国产精品久久w女人spa| 狠狠久久婷婷| 亚洲一区二区三区午夜| 亚洲精品国产精品国自产观看浪潮 | 久久久久国产精品人| 久久久免费精品| 性久久久久久久久久久久| 麻豆久久婷婷| 久久亚洲私人国产精品va媚药| 欧美另类综合| 国产视频欧美| 一区二区三区日韩精品| 亚洲激情欧美激情| 欧美成人在线免费视频| 欧美成人午夜视频| 亚洲电影免费观看高清完整版在线 | 91久久精品久久国产性色也91| 亚洲综合成人在线| 欧美一级电影久久| 国产精品进线69影院| 亚洲视频欧美在线| 亚洲激情视频在线| 欧美激情综合在线| 亚洲一区二三|