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

asm, c, c++ are my all
-- Core In Computer
posts - 139,  comments - 123,  trackbacks - 0
用內(nèi)聯(lián)匯編調(diào)虛函數(shù), 理解VTABLE原理

虛函數(shù)和動態(tài)綁定是C++面向?qū)ο缶幊痰暮诵膬?nèi)容之一。要理解C++虛函數(shù)的調(diào)用本質(zhì),就不得不說VPTR和VTABLE。所有擁有虛函數(shù)的C++類的大小都比可看到的內(nèi)容多至少4個字節(jié)(如果派生樹中存在多繼承,就可能多于4個字節(jié)),這多出來的4個字節(jié)就是VPTR,它位于每個實例的最前方。VPTR的內(nèi)容就是一個unsigned int的地址,指向一個內(nèi)存區(qū)域,而這個被指向的內(nèi)存區(qū)域就是VTABLE,所謂虛函數(shù)地址表。每個擁有虛函數(shù)的類都擁有一張VTABLE,里面是一個函數(shù)指針數(shù)組,每4個字節(jié)為一個單位,指向虛函數(shù)的入口地址。C++在調(diào)用虛函數(shù)時,首先要通過這個類的實例內(nèi)容看到VPTR,從而找到VTABLE,然后根據(jù)要調(diào)用的虛函數(shù),取相應(yīng)偏移地址的內(nèi)容,從而把調(diào)用轉(zhuǎn)到這個位置。

以下是我用VC內(nèi)聯(lián)匯編編寫的一個手工模擬此過程的示例,通過例子中的代碼可以清楚的看出虛函數(shù)的調(diào)用過程。首先定義一個類,它有一個虛函數(shù):


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);?}
}
;

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

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

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

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

最后取這個指針?biāo)竷?nèi)存的內(nèi)容,也就是VTABLE中第一個函數(shù)的地址了:
?*(int*)(*(int*)pC)

取得這個地址以后,下面就用匯編代碼來調(diào)用這個地址所指的函數(shù):

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


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

最后,執(zhí)行程序,得到結(jié)果:
i=1 a=2 b=3?

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

FeedBack:
# re: 用內(nèi)聯(lián)匯編調(diào)虛函數(shù), 理解VTABLE原理
2006-11-19 08:16 | Aki
"不難發(fā)現(xiàn)調(diào)用類成員函數(shù)時也是由被調(diào)用者負責(zé)彈棧,看來類成員函數(shù)是不能聲明為參數(shù)個數(shù)可變的函數(shù)了"

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

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理



<2006年7月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

常用鏈接

留言簿(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>
            亚洲欧美日韩在线高清直播| 亚洲欧美日韩中文在线制服| 亚洲视频一区在线| 在线观看亚洲视频| 国语自产精品视频在线看抢先版结局 | 性色av一区二区三区| 亚洲午夜av电影| 久久成人18免费网站| 久久精品九九| 欧美激情视频一区二区三区在线播放| 亚洲综合999| 久久久综合香蕉尹人综合网| 免费中文字幕日韩欧美| 欧美激情一区二区三区在线 | 久久久综合网站| 欧美成人午夜激情在线| 国产精品高潮在线| 精品1区2区3区4区| 一区二区三区欧美在线| 欧美与欧洲交xxxx免费观看| 欧美成人精品福利| 这里只有精品在线播放| 久久久免费精品视频| 欧美日韩第一页| 欧美日韩精品一区二区在线播放| 欧美欧美全黄| 国内外成人在线视频| 亚洲精品一区二区三| 欧美亚洲综合网| 亚洲高清在线精品| 亚洲一区二区毛片| 欧美成人国产一区二区| 国产女主播视频一区二区| 亚洲精品在线视频观看| 久久亚洲风情| 午夜精品av| 欧美体内she精视频在线观看| 国产专区欧美精品| 亚洲欧美日韩区| 亚洲免费激情| 蜜月aⅴ免费一区二区三区 | 亚洲激情视频| 久久黄色小说| 国产欧美日韩激情| 亚洲欧美国产毛片在线| 亚洲精品国产精品久久清纯直播| 亚洲婷婷国产精品电影人久久| 久久久久久一区| 国产视频在线一区二区| 亚洲一区www| 99精品免费网| 欧美人成免费网站| 亚洲精品网址在线观看| 欧美成人影音| 欧美成年人网站| 亚洲欧洲在线播放| 欧美成人免费网| 麻豆精品在线视频| 一区二区视频免费在线观看| 久久尤物视频| 久久午夜羞羞影院免费观看| 极品av少妇一区二区| 久久久亚洲精品一区二区三区| 在线视频日韩精品| 国产精品免费电影| 欧美在线视频不卡| 久久国产精品毛片| 原创国产精品91| 欧美成人精品在线视频| 麻豆免费精品视频| 亚洲美女视频网| 99热免费精品| 国产午夜亚洲精品理论片色戒| 香蕉亚洲视频| 久久精品中文| 99精品欧美一区| 亚洲在线一区二区三区| 国产一区二区三区不卡在线观看| 久久黄金**| 猫咪成人在线观看| 中文日韩在线| 欧美视频精品一区| 中文av一区二区| 亚洲一区二区三区久久| 国产欧美丝祙| 久久综合九色九九| 欧美国产一区视频在线观看| 亚洲一区二区影院| 久久精品国产综合精品| 9人人澡人人爽人人精品| 亚洲一区二区免费看| 在线视频国内自拍亚洲视频| 99精品欧美一区二区三区综合在线| 欧美日韩中字| 久久麻豆一区二区| 欧美日韩1区2区3区| 久久精品国产亚洲aⅴ| 女仆av观看一区| 性欧美大战久久久久久久久| 久久久之久亚州精品露出| 亚洲天堂偷拍| 卡一卡二国产精品| 午夜久久久久久| 欧美日本国产在线| 免费久久99精品国产| 国产精品捆绑调教| 亚洲国产精品久久久久婷婷老年| 欧美日韩亚洲一区二区三区在线观看| 一卡二卡3卡四卡高清精品视频| 亚洲午夜羞羞片| 亚洲精品国偷自产在线99热| 性欧美长视频| 亚洲欧美影音先锋| 欧美极品影院| 欧美成人a视频| 国产一级一区二区| 亚洲视频1区| 在线亚洲电影| 免费观看国产成人| 久久香蕉国产线看观看av| 国产精品视频导航| 一区二区三区国产在线观看| 日韩一级精品视频在线观看| 久久米奇亚洲| 久久久夜精品| 国产在线精品自拍| 午夜精品福利一区二区三区av | 亚洲制服欧美中文字幕中文字幕| 久久精品盗摄| 久久精品人人爽| 国产亚洲成人一区| 亚洲免费在线看| 欧美一区二区精品久久911| 欧美日韩另类视频| 日韩视频亚洲视频| 一区二区三区日韩在线观看| 欧美精品精品一区| 亚洲精品乱码视频| 一本久道久久综合婷婷鲸鱼| 欧美精品不卡| 一本一本久久| 亚洲男女自偷自拍| 国产精品乱码一区二区三区| 国产精品99久久久久久有的能看 | 久久se精品一区二区| 免费中文字幕日韩欧美| 欧美二区乱c少妇| 亚洲激情网站| 欧美激情aⅴ一区二区三区| 欧美电影在线| 日韩一区二区久久| 欧美日韩一区二区三区视频| av成人黄色| 久久国产欧美日韩精品| 激情久久久久久久| 免费日韩av| 这里只有精品丝袜| 久久婷婷久久| 亚洲人成网站精品片在线观看 | 亚洲一卡久久| 久久久国际精品| 亚洲精品1区2区| 欧美性猛片xxxx免费看久爱| 亚洲一区二区视频在线| 麻豆精品传媒视频| 中文欧美在线视频| 国产一区导航| 欧美精选一区| 欧美在线观看天堂一区二区三区| 久久影视精品| 亚洲社区在线观看| 国产主播精品在线| 欧美日韩亚洲不卡| 久久久久久噜噜噜久久久精品| 免费成人黄色片| 亚洲淫性视频| 亚洲黄网站黄| 国产午夜精品美女视频明星a级| 久久久www成人免费精品| 亚洲人成亚洲人成在线观看| 久久久蜜桃精品| 中文久久精品| 一区二区在线观看视频| 欧美亚洲成人精品| 欧美成人小视频| 欧美一级淫片aaaaaaa视频| 亚洲人成在线播放网站岛国| 老司机免费视频久久| 亚洲欧美成人一区二区在线电影 | 欧美国产日本| 亚洲午夜精品久久久久久浪潮| 国产麻豆91精品| 欧美精品 国产精品| 久久精品成人一区二区三区| 亚洲天堂免费在线观看视频| 91久久久久久国产精品| 免费在线观看精品| 久久久久久伊人| 欧美一区二区三区的| 亚洲午夜精品一区二区三区他趣 |