• <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>

            用匯編調用成員函數

            成員函數的調用是編譯器內部使用的 __thiscall 即需要this指針,
            所以我們調用成員函數必須滿足的條件是
            1 需要this指針,
            2 成員函數有固定的函數地址

            先看條件 1 ?
            this指針是在函數調用前用ECX寄存器傳入的,
            所以我們只需要提前講this指針賦值給ECX即可

            條件2
            成員函數是有固定的地址的,也就是說我們可以直接調用,不過大多數情況下因為要訪問成員變量,所以如果沒有this指針,會在訪問時產生異常.對于不需要this指針的成員函數可以正常調用.
            如類 CTest

            class?CTest
            {
            public :

            ?CTest()?:?m_nData?(
            5 ){}

            ?
            int ?GetNum(){reutrn? 3 ;]

            ?
            int ?GetAmount(){return? 2 ? + ?m_nData;}
            private :
            ?
            int ?m_nData;
            };


            // 可以這樣調用GetNum
            return?((CTest
            * ) 0 ) -> GetNum();


            這兩個條件都可以滿足,所以代碼如下:
            typedef?int?(CTest::*GETAMOUNT)();

            void?Process(CTest
            &?t?,?GETAMOUNT?GetAmont)
            {
            ??
            int?nResult?=0;
            ??__asm{
            ?????mov?ecx,[t]??????;傳入this指針
            ?????
            call?GetAmont????;調用成員函數
            ?????mov?nResult,?eax?;返回值在EAX中
            ????????}
            ??cout
            <<nResult<<endl;
            }

            int?main(int?argc,?char*?argv[])
            {
            ??CTest?test;

            ??Process(test,?
            &CTest::GetAmount);????
            ??return?
            0;
            }????

            posted on 2007-03-12 23:05 修一居士 閱讀(2329) 評論(3)  編輯 收藏 引用

            評論

            # re: 用匯編調用成員函數 2007-03-23 13:36 shen126

            int GetNum(){reutrn 3 ;] --> int GetNum(){return 3 ;}  回復  更多評論   

            # re: 用匯編調用成員函數 2007-03-23 13:42 shen126

            void Process(CTest* t , GETAMOUNT GetAmont)
            ...
            ...
            ...
            30: __asm{
            31: mov ecx, t ;傳入this指針
            004113E5 8B 4D 08 mov ecx,dword ptr [t]
            32: call GetAmont ;調用成員函數
            004113E8 FF 55 0C call dword ptr [GetAmont]
            33: mov nResult, eax ;返回值在EAX中
            004113EB 89 45 F8 mov dword ptr [nResult],eax
            34: }


            為什么 “31: mov ecx, t ;傳入this指針” 翻譯的結果是:“004113E5 8B 4D 08 mov ecx,dword ptr [t]” 而不是“004113E5 8B 4D 08 mov ecx, t”?

            我是匯編初學,有點不太理解[t]的含義,t是函數地址,而ecx不正是要接收一個函數地址嗎,為什么還要[]來解引用?
              回復  更多評論   

            # re: 用匯編調用成員函數 2007-03-29 13:32 南斗

            t是變量不是函數地址 []可有可無  回復  更多評論   

            導航

            <2007年7月>
            24252627282930
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            統計

            常用鏈接

            留言簿(3)

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久天天躁狠狠躁夜夜躁2O2O | 亚洲精品国产自在久久| 理论片午午伦夜理片久久| 伊人久久大香线蕉AV一区二区| 亚洲天堂久久久| 久久国产精品无码一区二区三区 | 久久综合亚洲色一区二区三区| 久久水蜜桃亚洲av无码精品麻豆| 久久综合噜噜激激的五月天| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 欧美精品乱码99久久蜜桃| 久久人人爽人人爽人人AV东京热| 国产高潮久久免费观看| 久久亚洲AV成人出白浆无码国产| 久久久久久久久久免免费精品| 久久精品这里热有精品| 国内精品伊人久久久久妇| 精品熟女少妇a∨免费久久| 午夜精品久久久久久99热| 尹人香蕉久久99天天拍| 99久久免费国产精品| 岛国搬运www久久| 国产精品禁18久久久夂久| 麻豆av久久av盛宴av| 久久精品国产亚洲7777| 97久久综合精品久久久综合| 精品久久久久久亚洲| 中文精品久久久久国产网址| 亚洲国产一成人久久精品| 亚洲午夜无码久久久久小说| 国产L精品国产亚洲区久久| 99久久国产热无码精品免费 | 欧美日韩精品久久久免费观看| 久久国产精品免费一区| 亚洲午夜无码AV毛片久久| 久久久久噜噜噜亚洲熟女综合| 99久久精品这里只有精品| 国产精品一区二区久久精品无码 | 伊人色综合九久久天天蜜桃 | 久久国产精品99国产精| 综合网日日天干夜夜久久|