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

  C++博客 :: 首頁 :: 聯系 ::  :: 管理
  163 Posts :: 4 Stories :: 350 Comments :: 0 Trackbacks

常用鏈接

留言簿(48)

我參與的團隊

搜索

  •  

積分與排名

  • 積分 - 402530
  • 排名 - 59

最新評論

閱讀排行榜

評論排行榜

stdcall很多時候被稱為pascal調用約定,因為pascal是早期很常見的一種教學用計算機程序設計語言,其語法嚴謹,使用的函數調用約定就是 stdcall。在Microsoft C++系列的C/C++編譯器中,常常用PASCAL宏來聲明這個調用約定,類似的宏還有WINAPI和 CALLBACK。
stdcall調用約定聲明的語法為(以前文的那個函數為例):
int __stdcall function(int a,int b)
stdcall的調用約定意味著:1)參數從右向左壓入堆棧,2)函數自身修改堆棧 3)函數名自動加前導的下劃線,后面緊跟一個@符號,其后緊跟著參數的尺寸
以上述這個函數為例,參數b首先被壓棧,然后是參數a,函數調用function(1,2)調用處翻譯成匯編語言將變成:
push 2      第二個參數入棧
push 1      第一個參數入棧
call function  調用參數,注意此時自動把cs:eip入棧
而對于函數自身,則可以翻譯為: 
push ebp     保存ebp寄存器,該寄存器將用來保存堆棧的棧頂指針,可以在函數退出時恢復
mov ebp,esp  保存堆棧指針
mov  eax,[ebp + 8H]  堆棧中ebp指向位置之前依次保存有ebp,cs:eip,a,b,ebp +8指向a
add eax,[ebp + 0CH]  堆棧中ebp + 12處保存了b
mov  esp,ebp         恢復esp
pop ebp
ret 8
而在編譯時,這個函數的名字被翻譯成_function@8 
注意不同編譯器會插入自己的匯編代碼以提供編譯的通用性,但是大體代碼如此。其中在函數開始處保留esp到ebp中,在函數結束恢復是編譯器常用的方法。
從函數調用看,2和1依次被push進堆棧,而在函數中又通過相對于ebp(即剛進函數時的堆棧指針)的偏移量存取參數。函數結束后,ret 8表示清理8個字節的堆棧,函數自己恢復了堆棧。

c程序默認的是__cdecl
__stdcall時輸入參數的棧空間有被調用函數恢復
__cdecl時由調用函數恢復
和參數如棧順序不同,記不清楚了

是編譯器調用約定的一種 
調用約定分為_cdecl _stdcall _fastcall thiscall naked  call等等 網絡上很多調用約定的介紹
 _stdcall將參數壓棧是按C語言的順序(從右到左),但與C 語言不同的是它是由被調用者將參數從棧中清除的,所以它的編譯文件比_cdecl?gt;>stdcall是Windows API函數中默認的調用約定,VB、VFP等也采用這個約定。 
   _cdecl是C語言采用的默認調用方法,它的優點是支持printf這樣的可變參數調用。 
  另外,VC++對于兩種調用方法的名稱轉換方法也不同
++++++++++++++++++++++++++++++++++++++++++++++++++++
_stdcall  
按 從右至左的順序壓參數入棧,由被調用者把參數彈出棧。對于“C”函數或者變量,修飾名以下劃線為前綴,然后是函數名,然后是符號“@”及參數的字節數,如 函數int  func(int  a,  double  b)的修飾名是_func@12。對于“C++”函數,則有所不同。   
所有的Win32  API函數都遵循該約定。  
+++++++++++++++++++++++++++++++++++++++++++++++++++++

函數調用約定有多種,這里簡單說一下:
1、__stdcall調用約定相當于16位動態庫中經常使用的PASCAL調用約定。在32 位的VC++5.0中PASCAL調用約定不再被支持(實際上它已被定義為__stdcall。除了__pascal外,__fortran和 __syscall也不被支持),取而代之的是__stdcall調用約定。兩者實質上是一致的,即函數的參數自右向左通過棧傳遞,被調用的函數在返回前 清理傳送參數的內存棧,但不同的是函數名的修飾部分(關于函數名的修飾部分在后面將詳細說明)。
_stdcall是Pascal程序的缺省調用方式,通常用于Win32 Api中,函數采用從右到左的壓棧方式,自己在退出時清空堆棧。VC將函數編譯后會在函數名前面加上下劃線前綴,在函數名后加上"@"和參數的字節數。
2、C調用約定(即用__cdecl關鍵字說明)按從右至左的順序壓參數入棧,由調用者把參數彈出棧。對于傳送參數的內存棧是由調用者來維護的(正因為如此,實現可變參數的函數只能使用該調用約定)。另外,在函數名修飾約定方面也有所不同。
_cdecl是C和C++程序的缺省調用方式。每一個調用它的函數都包含清空堆棧的代碼,所以產生的可執行文件大小會比調用_stdcall函數的大。函數采用從右到左的壓棧方式。VC將函數編譯后會在函數名前面加上下劃線前綴。是MFC缺省調用約定。
3、 __fastcall調用約定是"人"如其名,它的主要特點就是快,因為它是通過寄存器來傳送參數的(實際上,它用ECX和EDX傳送前兩個雙字 (DWORD)或更小的參數,剩下的參數仍舊自右向左壓棧傳送,被調用的函數在返回前清理傳送參數的內存棧),在函數名修飾約定方面,它和前兩者均不同。
_fastcall方式的函數采用寄存器傳遞參數,VC將函數編譯后會在函數名前面加上"@"前綴,在函數名后加上"@"和參數的字節數。 
4、thiscall僅僅應用于"C++"成員函數。this指針存放于CX寄存器,參數從右到左壓。thiscall不是關鍵詞,因此不能被程序員指定。
5、naked call采用1-4的調用約定時,如果必要的話,進入函數時編譯器會產生代碼來保存ESI,EDI,EBX,EBP寄存器,退出函數時則產生代碼恢復這些寄存器的內容。
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。
posted on 2007-12-26 14:06 sdfasdf 閱讀(580) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            免费不卡亚洲欧美| 欧美日一区二区在线观看| 久久久久久成人| 国产精品毛片大码女人| 亚洲人成网站999久久久综合| 亚洲午夜激情免费视频| 欧美电影专区| 亚洲激情成人网| 久久综合色综合88| 欧美自拍偷拍午夜视频| 国产色综合天天综合网| 欧美一区二区免费视频| 亚洲一区二区3| 欧美国产日产韩国视频| 亚洲人成在线观看网站高清| 亚洲电影av在线| 翔田千里一区二区| 国产在线拍揄自揄视频不卡99| 欧美一区二区三区喷汁尤物| 亚洲影视综合| 亚洲精品免费网站| 欧美三级在线视频| 亚洲小说欧美另类社区| 亚洲免费影视| 99国内精品久久| 亚洲欧美日韩国产综合在线 | 欧美一区日韩一区| 校园春色综合网| 国产午夜精品久久久久久久| 999亚洲国产精| 狂野欧美一区| 亚洲精品在线一区二区| 一区二区三区免费在线观看| 国产精品无码专区在线观看 | 欧美亚洲视频在线观看| 国产午夜精品理论片a级大结局 | 国产精品久久7| 久久精品国产视频| 女仆av观看一区| 亚洲免费视频成人| 久久久精彩视频| 玖玖精品视频| 亚洲一区二区视频在线| 欧美一级视频免费在线观看| 伊人精品成人久久综合软件| 亚洲欧洲综合另类| 国产精品一区二区三区乱码| 老色鬼精品视频在线观看播放| 欧美va亚洲va香蕉在线| 亚洲欧美怡红院| 久久综合电影| 亚洲综合第一页| 麻豆精品精品国产自在97香蕉| 一本到12不卡视频在线dvd | 宅男噜噜噜66一区二区| 亚洲午夜激情网页| 亚洲国产高清高潮精品美女| 在线视频一区观看| 亚洲国产精品一区二区尤物区| 亚洲在线视频观看| 亚洲精品国产精品国自产观看 | 国产视频一区在线观看一区免费| 欧美777四色影视在线| 欧美午夜精品久久久久久久| 免播放器亚洲一区| 国产精品视频男人的天堂| 亚洲激情中文1区| 国产一区二区高清视频| 中文欧美字幕免费| 亚洲卡通欧美制服中文| 久久精品一区四区| 香蕉成人啪国产精品视频综合网| 久久精品网址| 国产精品户外野外| 牛牛影视久久网| 亚洲区第一页| 国产亚洲一区二区精品| 亚洲美女视频网| 亚洲理伦电影| 久久最新视频| 久久手机免费观看| 国产日本欧洲亚洲| 亚洲一区中文| 亚洲一区久久久| 欧美日韩性生活视频| 亚洲国产成人久久| 一区二区三区自拍| 亚洲免费av电影| 嫩草伊人久久精品少妇av杨幂| 国产精品系列在线| 亚洲欧美成人一区二区在线电影| 亚洲视频在线观看三级| 欧美日韩国产色站一区二区三区| 亚洲福利在线观看| 亚洲大胆在线| 欧美一区亚洲二区| 久久综合激情| 亚洲激情视频网站| 农村妇女精品| 亚洲精品网址在线观看| 一区二区三区欧美激情| 欧美日韩国产精品专区| 99av国产精品欲麻豆| 亚洲一区二区三区视频播放| 欧美视频日韩视频| 亚洲无亚洲人成网站77777| 亚洲影视在线播放| 国产模特精品视频久久久久 | 性一交一乱一区二区洋洋av| 欧美视频一区| 亚洲欧美精品伊人久久| 欧美自拍偷拍| 日韩一区二区免费高清| 亚洲制服av| 久久亚洲欧美| 亚洲成人在线网站| 欧美福利网址| 亚洲视频一区在线| 久久久久亚洲综合| 在线欧美日韩精品| 欧美日韩在线观看一区二区三区 | 欧美激情视频免费观看| 欧美日产在线观看| 亚洲图中文字幕| 欧美成人四级电影| 一区二区三区成人| 国产精品美女主播| 久久综合色影院| 99一区二区| 男女精品视频| 午夜精品久久久久久99热| 精品二区视频| 欧美日韩亚洲一区二区| 欧美一区二区在线免费观看| 欧美国产日韩一区二区| 亚洲性夜色噜噜噜7777| 雨宫琴音一区二区在线| 国产精品成人一区二区网站软件| 久久国产精品色婷婷| 日韩视频―中文字幕| 中文国产成人精品久久一| 久久精品五月婷婷| 亚洲国产精品久久久久秋霞不卡 | 1024日韩| 欧美午夜电影网| 亚洲第一黄网| 欧美在线视频导航| 一本大道av伊人久久综合| 国产亚洲成av人在线观看导航| 欧美激情国产日韩| 久久精品亚洲乱码伦伦中文| 99国产精品视频免费观看| 蜜月aⅴ免费一区二区三区| 亚洲欧美三级伦理| 亚洲乱码精品一二三四区日韩在线| 欧美日本中文字幕| 久久久久久久波多野高潮日日| 一区二区三区四区蜜桃| 久久男女视频| 亚洲美女免费视频| 欧美激情一区在线观看| 久久精品综合一区| 午夜久久福利| 夜色激情一区二区| 国产一区清纯| 女生裸体视频一区二区三区| 久久国产精彩视频| 黄色成人av在线| 国产精品一区在线观看| 欧美手机在线| 欧美日韩成人在线观看| 久久夜色精品国产噜噜av| 午夜亚洲福利| 亚洲欧美在线磁力| 亚洲欧美在线x视频| 午夜日韩在线| 欧美在线二区| 久久成人免费日本黄色| 欧美在线播放一区| 欧美亚洲视频在线观看| 亚洲天堂av高清| 亚洲深夜影院| 亚洲性视频h| 亚洲影院免费观看| 午夜伦欧美伦电影理论片| 午夜国产一区| 午夜久久美女| 久久精品亚洲一区| 久久免费99精品久久久久久| 久久综合九色综合欧美就去吻| 久久亚洲综合色一区二区三区| 欧美成人a视频| 亚洲欧洲日韩在线| 日韩一区二区精品| 午夜精品福利视频| 欧美中文字幕在线播放| 久久伊人亚洲| 欧美日韩国产一区精品一区 | 在线日韩成人| 亚洲精品1区|