老碼識途之物件函式呼叫

2021-09-29 02:45:45 字數 1606 閱讀 4682

上一期,我們討論了普通函式的呼叫過程,如果沒弄明白,看這裡

今天所要講的將是物件呼叫函式。

class c};

int _tmain(int argc, _tchar* ar**)

由於之前的普通函式的呼叫的基礎,所以,接下來主要分析下面幾個問題

物件呼叫如何傳遞物件到函式內

靜態物件函式呼叫和普通物件函式呼叫有什麼不同

通過上圖可以看到,物件函式的傳參和普通函式相同,使用,壓棧式,不知道大家有沒有注意到,這裡存在兩個疑點,(1)明明我是物件呼叫函式,編譯器卻作為靜態函式呼叫模式呼叫。(2)編譯器將c的位址傳遞給了exc暫存器。我們就帶著這倆個疑點繼續向下看吧。

下面是c類的彙編

void f(int t)

通過上圖可以看到,首先,函式內部將ecx暫存器內容壓棧,然後初始化函式棧內容,

然後將ecx的值傳入到dword ptr [this],最後完成賦值,實際在這裡有個疑問,之前人們都說物件函式在編譯期間將this指標作為第乙個引數進行傳遞,如果是按照第乙個引數傳遞,應該壓棧才對,為啥這裡沒有壓棧而實用暫存器進行傳遞。等下看看用靜態函式看看如何吧。

static類函式

在上面的代買基礎上新增了乙個靜態類函式,同時在呼叫兩個函式之間通過彙編**修改了ecx值,這個防止上乙個函式呼叫對這部分有影響

目前通過上圖可以看到,靜態函式的呼叫,連物件位址都沒有傳入。

static int t(

)

通過上面的return的彙編**可以看到,它是直接返回的ds:[00a5f024h]的資料,

我們重新編譯可以發現&c= 0x0053fbd8

而上面ds:[00a5f024h]這個屬於棧中的資料,

小結1)學到這裡,我們應該明白了成員方法呼叫時,在編譯過程中,編譯器會將物件的位址通過ecx暫存器傳入到函式中,並通過位址訪問物件的成員變數。

2)成員方法的呼叫最終都是轉換為了靜態函式呼叫,通過傳遞物件的位址來辨別不同型別的方法

3)實際靜態成員函式也好,普通成員函式也好,呼叫都是通過我們上節函式呼叫類似,換湯不換藥

4)靜態成員函式呼叫過程中,編譯器並沒有傳遞物件的位址到函式中,這也是為什麼靜態成員函式無法呼叫普通成員變數的原因

老碼識途讀書筆記 1

知識點記錄 1.int 或指標型別的全域性變數預設初始化為0,區域性變數則為0xcccccccc。win7 vs2008 2.記憶體溢位攻擊即使用6個位元組空間改變程式執行流程達到某種目的。話說當時在課本中看到這個概念卻一直不懂是怎麼回事。原因是win7支援一種防止溢位攻擊的保護機制,阻止 放在在堆...

雷柏眾聯綠標與最老款產品對碼教程

雷柏眾聯綠標與最老款產品對碼教程 對碼前準備工作.安裝程式 重啟電腦 必須 開啟對碼工具 方法 桌面左下角 開始 程式 rapoo 開啟對碼工具 雷柏對碼步驟過程 先將接收器插入usb口,再開啟對碼軟體,順序弄反會出現提示未找到接收器.正常需要寫碼的過程,故此步驟省略,自己亂寫碼以至於接收器損壞的 ...

小碼農聽邏輯思維老羅之融入大城市有感

以前沒聽過邏輯思維,以為是一家公司名字而已,昨天在一前外包同事qq空間裡看到說聽了好幾遍 張泉靈演講的那一期邏輯思維 實話說來對我這樣的小碼農還是有很大的開啟,聽後大致知道是乙個脫口秀。老羅最後出來總結本期的主題其中說到選擇大學 不是大學怎麼樣,專業怎麼樣 首先要在大都市,並且學校不能在 偏遠郊區的...