標籤:類的調用 彙編與c++
src(debug vesion by vs2008 sp1 on xp sp3)
#include<iostream>using namespace std;class SimpleClass{public: int x; void HelloWorld(){ printf("hello,mao"); }};int main(int argc,char **argv){ SimpleClass myclass; myclass.HelloWorld(); return 0;}
反組譯碼後的結構
--- c:\vc6\myprojects\vsclasstest\vsclasstest\bingome.cpp ---------------------- 1: #include<iostream> 2: using namespace std; 3: 4: class SimpleClass{ 5: public: 6: int x; 7: void HelloWorld(){00411440 push ebp 00411441 mov ebp,esp 00411443 sub esp,0CCh 00411449 push ebx 0041144A push esi 0041144B push edi 0041144C push ecx 0041144D lea edi,[ebp-0CCh] 00411453 mov ecx,33h 00411458 mov eax,0CCCCCCCCh 0041145D rep stos dword ptr es:[edi] //將局部變數空間全部初始化為0xcc (0x33*4=CC)(store to string addr edi by dword,repeat time is ecx,filled-word is eax.)0041145F pop ecx 00411460 mov dword ptr [ebp-8],ecx //ebp-8處是個變數,存放當前類執行個體的地址,那麼,我們的x去了哪裡呢。--類中的變數不是函數中的局部變數,方法和類成員沒有關係。 8: printf("hello,mao");00411463 mov esi,esp 00411465 push offset string "hello,mao" (415800h) 0041146A call dword ptr [__imp__printf (4182BCh)] //從匯入表中獲得地址,匯入表iat在4182BCh處00411470 add esp,4 00411473 cmp esi,esp 00411475 call @ILT+310(__RTC_CheckEsp) (41113Bh) 9: }0041147A pop edi 0041147B pop esi 0041147C pop ebx 0041147D add esp,0CCh 00411483 cmp ebp,esp 00411485 call @ILT+310(__RTC_CheckEsp) (41113Bh) 0041148A mov esp,ebp 0041148C pop ebp 0041148D ret
main函數部分
17: SimpleClass myclass;18: myclass.HelloWorld(); 004113CE lea ecx,[myclass] 004113D1 callSimpleClass::HelloWorld (41114Ah) 19: return 0; 004113D6 xor eax,eax
可以看出來,執行類中方法的時候,會先取出執行個體化類的地址(ecx= myclass),也就是說編譯器讓類的內部方法實現的時候已經引入了隱藏變數執行個體化的類指標。
類中的變數不是類方法中的變數,類方法訪問類中變數是通過ecx作為隱藏參數傳入的,所以類方法中沒有分配空間存放類成員。
從彙編學習c++ 之 類的方法調用