C 類的反彙編

2021-07-03 14:55:30 字數 2594 閱讀 8849

c++的類與c++的結構體本質上沒有什麼不同,唯一不同的可能即是在編譯期預設的成員訪問全鄉不同。當我們new 乙個類時,在heap中申請了一塊記憶體區域,

用於儲存類的實體,並且呼叫了類的建構函式。當我們呼叫delete時,呼叫了析構函式,並呼叫了heap記憶體塊釋放函式。

今天隨便寫了乙個簡單的類,並對其進行了反彙編分析,由此記錄下來,環境如下:

作業系統:win7 sp1 x86_64

偵錯程式:ollydbg 2.0

編譯環境:visual studio 2012

檔案有三個,classtest.h    classtest.cpp   main.cpp, **如下:

/*

---- classtest.h ----

author : ez

date : 2015/7/4

describe : declare classtest.

*/#ifndef _classtest_h_

# define _classtest_h_

#include using std :: string;

# define gatter(___fieldname, ___type) \

___type get##___fieldname ()

# define setter(___fieldname, ___type) \

void set##___fieldname (___type _val)

class classtest };

#endif // ~ _classtest_h_

實現檔案classtest.cpp

/*

---- classtest.cpp ----

author : ez

date : 2015/7/4

describe : implement of class classtest.

*/#include "classtest.h"

int classtest :: calc ()

int classtest :: sum ()

string classtest :: input_scalar () ;

string res = "

res += itoa (this -> _x, tmp, 10);

res += ",";

res += itoa (this -> _y, tmp, 10);

res += ",";

res += itoa (this -> _z, tmp, 10);

res += ">";

return res;

}

呼叫函式:

int _tmain (int argc, _tchar* argv )
用release方式編譯後得到exe檔案,使用ollydbg除錯,通過定位控制台的輸出函式得到了main ()的大概位置:

由此進入函式,這main中並不像我們想的一樣,像我們的使用者**,只有寥寥幾行彙編,而是其中加入了很多執行時庫的**。此處不予討論,直接看

使用者**編譯成的彙編:

以上**即是new 語句部分的彙編。從類的定義,我們可以很容易知道,類只有四個字段,都是int型,在32位程式中,int一般都是32位的有符號整數,即是4個雙字長度,

由此將呼叫c++ 標準庫中的 void *operator new (size_t) 函式,將申請0x10 長度的記憶體,於是我們可以定位到位址0x01231a10處,此處push 的正是長度0x10,而下面的

函式呼叫call dword ptr ds:[123306c] 即是我們的new () 函式。並且將返回的指標存入eax中。之後判斷了指標是否有效,當然這部分**也是標準庫為我們做的。

呼叫了 new ()函式後,則開始呼叫類建構函式,此處的類建構函式直接被編譯器在呼叫處擴充套件了,因為其比較簡單,這也與編譯器的優化有關。

從位址0x01231a1f 處的指令開始,是建構函式的彙編,我們可以很清楚的看到乙個類的結構。

類指標指在第乙個雙字的位置,即是_x欄位處,由此可以訪問到所有的字段。以上的幾個mov指令都是通過類指標 (存在eax)對各個字段進行的賦值。

接著往下看,函式應該開始呼叫成員方法input_scalar (),我們並沒有定義任何引數,但c++的類方法,都有乙個this指標,我們學習c++時,都會說呼叫

類函式時,將傳入乙個指向自己的指標,其實就是this 指標,但是此處並沒有看到它被壓入棧中,而是直接儲存在暫存器中,畢竟release的編譯方式已經

對**進行了優化,儘量減少在記憶體和暫存器之間傳遞資料:

此處eax 中還存著物件的指標,但並沒有直接壓棧,而是傳給了ecx。

注意,類中的函式並沒有包含在申請的記憶體中,也沒有類指標,函式只是比其他函式多傳入乙個this指標而已。當然這其中類和函式如何協調,就交給編譯器

吧。

C語言反彙編

這裡使用的是keil4軟體,將編寫的c語言程式彙編成組合語言。這裡只用最簡單的c語言做了一下參考,所舉的例子是最簡單的,只能用於了解一下彙編的表達方式。如圖所示,條件判斷語句的彙編語句表達是賦值後與進行異或比較,再判斷是否進行跳轉。將立即數03賦值給累加器a,然後將累加器a的值與立即數05進行異或 ...

C 反彙編 if語句分析

include void main std cout hello world 7?1 4 if b 1 std cout b equal 1 判斷語句有幾種 1.條件表示式 表示式1?表示式2 表示式3 2.if語句 3.switch語句 首先來分析if語句吧 debug版 0040117d 68 ...

C 遞迴函式反彙編

源 include using namespace std int sumrecursion int arr,int n return 0 int main int sum sumrecursion arr,5 cout sum sum endl 反彙編 重要部分已經注釋,可以看到.text 004...