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

            天下

            記錄修行的印記

            C++普通成員函數(shù)的調(diào)用反匯編

            //源代碼
            #include <cstdio>
            #include 
            <cstdlib>
            class TA{
            public:    
                
            void show()
                {
                    printf(
            "%d \r\n",m_id);
                }
                
            void callShow()
                {
                    TA::show();
                }
                
            int m_id;
            };

            int main()
            {
                TA ta;
                ta.m_id 
            = 5;
                ta.callShow();
                ta.show();
                system(
            "pause");
                
            return 0;
            }

            //反匯編后的代碼

            int main()
            {
            00411B10  push        ebp  
            00411B11  mov         ebp,esp 
            00411B13  sub         esp,0CCh 
            00411B19  push        ebx  
            00411B1A  push        esi  
            00411B1B  push        edi  
            00411B1C  lea         edi,[ebp
            -0CCh] 
            00411B22  mov         ecx,33h 
            00411B27  mov         eax,0CCCCCCCCh 
            00411B2C  rep stos    dword ptr es:[edi] 
                TA ta;
                ta.m_id 
            = 5;
            00411B2E  mov         dword ptr [ta],
            5 
                ta.callShow();
            00411B35  lea         ecx,[ta] 
            00411B38  call        TA::callShow (411019h) 
                ta.show();
            00411B3D  lea         ecx,[ta] 
            00411B40  call        TA::show (4110EBh) 
                system(
            "pause");
            00411B45  mov         esi,esp 
            00411B47  push        offset 
            string "pause" (41573Ch) 
            00411B4C  call        dword ptr [__imp__system (4182C0h)] 
            00411B52  add         esp,
            4 
            00411B55  cmp         esi,esp 
            00411B57  call        @ILT
            +320(__RTC_CheckEsp) (411145h) 
                
            return 0;
            00411B5C  xor         eax,eax 
            }


            //callShow()反匯編
            void callShow()
                {
            00411490  push        ebp  
            00411491  mov         ebp,esp 
            00411493  sub         esp,0CCh 
            00411499  push        ebx  
            0041149A  push        esi  
            0041149B  push        edi  
            0041149C  push        ecx  
            0041149D  lea         edi,[ebp
            -0CCh] 
            004114A3  mov         ecx,33h 
            004114A8  mov         eax,0CCCCCCCCh 
            004114AD  rep stos    dword ptr es:[edi] 
            004114AF  pop         ecx  
            004114B0  mov         dword ptr [ebp
            -8],ecx 
                    TA::show();
            004114B3  mov         ecx,dword ptr [
            this] //這里是關(guān)鍵.
            004114B6  call        TA::show (4110EBh) 
                }
            004114BB  pop         edi  
            004114BC  pop         esi  
            004114BD  pop         ebx  
            004114BE  add         esp,0CCh 
            004114C4  cmp         ebp,esp 
            004114C6  call        @ILT
            +320(__RTC_CheckEsp) (411145h) 
            004114CB  mov         esp,ebp 
            004114CD  pop         ebp  
            004114CE  ret         


            總結(jié):C++成員函數(shù)調(diào)用 即this call 調(diào)用約定
            thiscall
            它是C
            ++類成員函數(shù)缺省的調(diào)用約定。

            參數(shù)從右向左入棧
            如果參數(shù)個數(shù)確定

            也就是把類的實(shí)例,即對象的地址(或者說把this指針)通過ecx傳遞到調(diào)用函數(shù),
            調(diào)用的函數(shù)通過ecx取回this指針.

            第一次調(diào)用時,取對象的實(shí)例ta的地址到ecx,然后調(diào)用TA::callShow
            00411B35  lea         ecx,[ta] 
            00411B38  call        TA::callShow (411019h) 


            第二次調(diào)用時,直接把this指針傳遞到ecx,然后調(diào)用TA::show
            004114B3  mov         ecx,dword ptr [
            this
            004114B6  call        TA::show (4110EBh) 

            posted on 2012-01-10 16:52 天下 閱讀(661) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

            <2013年6月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            30123456

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(4)

            隨筆分類(378)

            隨筆檔案(329)

            鏈接

            最新隨筆

            搜索

            最新評論

            欧美成人免费观看久久| 性做久久久久久久久浪潮| 久久电影网2021| 久久乐国产精品亚洲综合| 久久久久人妻一区二区三区 | 99久久精品国内| 久久久99精品一区二区| 久久丫精品国产亚洲av不卡| 国产成人久久777777| 亚洲AV日韩精品久久久久久| 国产精品无码久久四虎| 久久发布国产伦子伦精品| 久久亚洲精品国产亚洲老地址| www性久久久com| 久久亚洲中文字幕精品一区| 久久久久99精品成人片三人毛片| 一本久道久久综合狠狠爱| 久久亚洲精品无码播放| 亚洲国产天堂久久综合网站| 日韩av无码久久精品免费| 麻豆av久久av盛宴av| 久久久久国产一区二区三区| 久久99毛片免费观看不卡| 久久丫精品国产亚洲av不卡| 亚洲va久久久噜噜噜久久狠狠| 三级韩国一区久久二区综合| 久久精品国产亚洲一区二区三区| 人人妻久久人人澡人人爽人人精品| 理论片午午伦夜理片久久 | 久久w5ww成w人免费| 伊人久久综合无码成人网| 婷婷久久综合九色综合绿巨人| 国产激情久久久久影院小草| 91精品国产91久久久久福利| 91精品国产综合久久婷婷| 9久久9久久精品| 99久久国产免费福利| 欧美色综合久久久久久| 亚洲美日韩Av中文字幕无码久久久妻妇| 国产精品美女久久久久AV福利| 精品一久久香蕉国产线看播放|