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

asm, c, c++ are my all
-- Core In Computer
posts - 139,  comments - 123,  trackbacks - 0
用內聯匯編調虛函數, 理解VTABLE原理

虛函數和動態綁定是C++面向對象編程的核心內容之一。要理解C++虛函數的調用本質,就不得不說VPTR和VTABLE。所有擁有虛函數的C++類的大小都比可看到的內容多至少4個字節(如果派生樹中存在多繼承,就可能多于4個字節),這多出來的4個字節就是VPTR,它位于每個實例的最前方。VPTR的內容就是一個unsigned int的地址,指向一個內存區域,而這個被指向的內存區域就是VTABLE,所謂虛函數地址表。每個擁有虛函數的類都擁有一張VTABLE,里面是一個函數指針數組,每4個字節為一個單位,指向虛函數的入口地址。C++在調用虛函數時,首先要通過這個類的實例內容看到VPTR,從而找到VTABLE,然后根據要調用的虛函數,取相應偏移地址的內容,從而把調用轉到這個位置。

以下是我用VC內聯匯編編寫的一個手工模擬此過程的示例,通過例子中的代碼可以清楚的看出虛函數的調用過程。首先定義一個類,它有一個虛函數:


class ?Class1
{
?
int
?i;
public
:
?Class1(
int ?i)? {? this -> i? = ?i;?}

?
virtual ? void ?Print( int ?a,? int ?b)? {?printf( " i=%d?a=%d?b=%d " ,?i,?a,?b);?}
}
;

如果取這個類的大小,可以看到結果是8而不是4。
下面聲明這個類的一個實例,并取得其VTABLE中第一個元素的值:

?Class1 * ?pC? = ? new ?Class1( 1 );
?
int ?addr? = ? * ( int * )( * ( int * )pC);

注意取值的這一行運用了復雜的強制類型轉換。我把它拆開解釋一下。首先是取得對象pC的前四個字節的內容,只要把pC轉換成int*然后直接取值就行了:
?*(int*)pC

下一步是把取得的這個值當作是一個指針,也就是再進行一次強制類型轉換:
?(int*)(*(int*)pC)

最后取這個指針所指內存的內容,也就是VTABLE中第一個函數的地址了:
?*(int*)(*(int*)pC)

取得這個地址以后,下面就用匯編代碼來調用這個地址所指的函數:

?__asm
?
{
??mov?ecx,?pC;
??push?
3
;
??push?
2
;
??call?addr;
?}


注意調用類的非靜態成員函數時需要先把對應實例的地址放到ECX寄存器中,也就是平常所說的“隱藏參數”了,然后為函數Print壓兩個參數進棧,根據運行的結果可以明顯看出來調用類成員函數時也是從右向左壓棧的,最后用call語句調用函數。不難發現調用類成員函數在參數個數確定時也是由被調用者負責彈棧,看來類成員函數也是可以聲明為參數個數可變的函數了。

最后,執行程序,得到結果:
i=1 a=2 b=3?

posted on 2006-11-19 04:13 Jerry Cat 閱讀(2866) 評論(4)  編輯 收藏 引用

FeedBack:
# re: 用內聯匯編調虛函數, 理解VTABLE原理
2006-11-19 08:16 | Aki
"不難發現調用類成員函數時也是由被調用者負責彈棧,看來類成員函數是不能聲明為參數個數可變的函數了"

可變個數參數函數跟壓棧有關系還是彈棧有關系?  回復  更多評論
  
# re: 用內聯匯編調虛函數, 理解VTABLE原理
2006-11-19 08:48 | Aki
再請教一個問題:如果this -> i = i;不加this-> 結果編譯器也沒有給加:
mov ecx, DWORD PTR _i$[ebp]
mov DWORD PTR _i$[ebp], ecx
這個是編譯器的規定么,不能自動給加上么:
mov ecx, DWORD PTR _this$[ebp]
mov edx, DWORD PTR _i$[ebp]
mov DWORD PTR [ecx+4], edx
多謝!!  回復  更多評論
  
# re: 用內聯匯編調虛函數, 理解VTABLE原理
2006-11-21 01:19 | Jerry Cat
已改 - 類成員函數是可以聲明為參數個數可變的函數。
thiscall是C++成員函數調用的缺省約定.
(1). 參數從右向左入棧
(2). 如果參數個數確定,this指針通過ecx傳遞給被調用者;如果參數個數不確定,this指針在所有參數壓棧后被壓入堆棧。
(3). 對參數個數不定的,調用者清理堆棧,否則函數自己清理堆棧  回復  更多評論
  
# re: 用內聯匯編調虛函數, 理解VTABLE原理
2007-11-13 16:59 |
好  回復  更多評論
  

<2006年11月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

常用鏈接

留言簿(7)

隨筆檔案

最新隨筆

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲性人人天天夜夜摸| 欧美在线日韩| 国产日韩欧美不卡在线| 国产精品丝袜xxxxxxx| 国产精品久久二区二区| 国产伦精品免费视频| 国产亚洲在线| 亚洲国产黄色| 亚洲精品一区二区在线观看| 亚洲久久在线| 亚洲一区二区三区中文字幕| 欧美一区二区三区久久精品| 久久久91精品国产| 亚洲丶国产丶欧美一区二区三区| 久久噜噜亚洲综合| 亚洲电影天堂av| 日韩亚洲成人av在线| 欧美一区二区视频观看视频| 欧美成人69av| 国产精品久久久久久久久| 国产主播一区二区三区四区| 亚洲乱亚洲高清| 欧美在线观看www| 亚洲国产精品黑人久久久| 亚洲视频欧洲视频| 美女日韩欧美| 国产精品区一区二区三区| 在线观看欧美一区| 性色av香蕉一区二区| 日韩视频免费大全中文字幕| 久久精品理论片| 亚洲国产精品嫩草影院| 一本色道久久综合| 蜜臀av一级做a爰片久久| 国产欧美日韩综合精品二区| 亚洲人精品午夜在线观看| 欧美在线观看视频在线| 亚洲国产婷婷综合在线精品| 久久精品国产一区二区电影| 欧美午夜片欧美片在线观看| 91久久在线播放| 久久青青草综合| 亚洲欧美日韩专区| 欧美日韩在线综合| 亚洲日本激情| 欧美成人精品一区二区| 久久国产精品99精品国产| 国产精品家教| 一个人看的www久久| 欧美激情第8页| 久久亚洲午夜电影| 黄色在线成人| 鲁鲁狠狠狠7777一区二区| 午夜精品视频在线观看| 国产精品任我爽爆在线播放| 亚洲一区二区免费视频| 亚洲精品看片| 欧美人与禽猛交乱配| 日韩视频第一页| 亚洲人成在线观看一区二区| 欧美jizz19hd性欧美| 亚洲国产三级在线| 欧美成人一二三| 麻豆精品91| 亚洲三级电影在线观看| 亚洲日本视频| 欧美日韩情趣电影| 亚洲一区二区三| 亚洲欧美激情一区| 国产欧美视频一区二区| 久久激五月天综合精品| 久久国产精品毛片| 亚洲国产精品成人精品| 亚洲高清中文字幕| 欧美日韩天天操| 亚洲欧美在线免费| 欧美在线综合视频| 最新国产乱人伦偷精品免费网站| 亚洲黄色免费| 国产精品久久9| 久久五月婷婷丁香社区| 巨乳诱惑日韩免费av| 一区二区成人精品| 午夜激情综合网| 亚洲国产精品t66y| 亚洲免费观看高清完整版在线观看熊 | 国产一区再线| 卡通动漫国产精品| 欧美~级网站不卡| 亚洲一区二区在线免费观看视频| 亚洲伊人久久综合| 亚洲二区在线视频| 一区二区高清| 红桃av永久久久| 9l视频自拍蝌蚪9l视频成人| 国产一区二区三区久久| 亚洲精品乱码久久久久久久久| 国产精品视频内| 亚洲国产精品电影在线观看| 国产伦精品一区二区三区高清| 免费成人激情视频| 国产精品久久久久久户外露出| 美腿丝袜亚洲色图| 国产精品网站在线| 亚洲国产日韩一区| 激情综合色综合久久综合| 一本久道久久综合婷婷鲸鱼| 在线激情影院一区| 亚洲欧美日韩国产| 亚洲麻豆国产自偷在线| 久久精品视频在线播放| 亚洲欧美一区二区三区久久| 免费看亚洲片| 久久久久在线观看| 国产欧美精品一区二区三区介绍| 亚洲日本va午夜在线电影| 在线观看精品一区| 欧美亚洲综合网| 亚洲在线网站| 欧美日韩亚洲精品内裤| 91久久精品久久国产性色也91 | 欧美激情精品久久久久久大尺度 | 欧美日韩免费高清| 亚洲第一在线综合在线| 在线免费高清一区二区三区| 亚洲欧美日本在线| 亚洲午夜羞羞片| 欧美日本一区二区视频在线观看| 另类春色校园亚洲| 国内精品一区二区| 欧美伊人久久久久久午夜久久久久| 亚洲一级在线| 欧美视频中文字幕| 亚洲免费av电影| 中文一区字幕| 欧美午夜久久久| 一区二区国产日产| 亚洲欧美激情视频在线观看一区二区三区| 欧美激情aaaa| 亚洲精品在线看| 亚洲一区国产| 国产精品自拍三区| 亚洲欧洲av一区二区三区久久| 午夜久久影院| 国产区亚洲区欧美区| 国模私拍一区二区三区| 欧美一区二区日韩| 欧美成人精品1314www| 亚洲人精品午夜在线观看| 欧美精品少妇一区二区三区| 日韩午夜高潮| 午夜久久久久久| 在线看不卡av| 欧美日韩亚洲一区在线观看| 亚洲欧美美女| 裸体丰满少妇做受久久99精品| 亚洲大黄网站| 欧美日韩小视频| 午夜亚洲精品| 欧美激情一区二区三区成人| 99在线精品视频在线观看| 国产精品久久久久久久午夜片| 欧美在线播放| 亚洲国产精品一区制服丝袜| 亚洲一区二区日本| 国产在线不卡| 欧美激情精品久久久久久免费印度| 一区二区三区免费看| 另类图片国产| 亚洲一区二区三区免费在线观看| 国内精品国语自产拍在线观看| 蜜桃av一区二区在线观看| 在线视频精品一| 牛夜精品久久久久久久99黑人| 亚洲私拍自拍| 亚洲国产激情| 国产日产高清欧美一区二区三区| 米奇777在线欧美播放| 亚洲视频一二| 亚洲国产精品999| 久久欧美中文字幕| 亚洲一区二区伦理| 亚洲欧洲综合另类| 国产一区二区三区免费在线观看| 欧美日韩不卡合集视频| 久久久www成人免费无遮挡大片 | 久久精品国产清高在天天线| 亚洲精品乱码久久久久久蜜桃麻豆 | 欧美一级午夜免费电影| 亚洲精品日韩在线| 久久一区二区三区超碰国产精品| 亚洲私拍自拍| 亚洲六月丁香色婷婷综合久久| 国模精品娜娜一二三区| 国产精品外国| 国产精品mv在线观看| 欧美精品www在线观看| 久久蜜桃精品| 久久精品国产亚洲aⅴ| 亚洲欧美日韩国产一区二区三区|