2009-11-24 40 views
0

是否有任何教程或解釋任何地方的C++對象如何翻譯成彙編指令移動寄存器之間的數據...彙編和C++關係

我真的不明白我們是如何在更高層次的語言操縱物體在哪裏彙編程序你本質上是在寄存器之間移動數據?加上對他們做一些基本的操作。

回答

3

聲明:我將使用IA-32裝配樣品。

通常,每個對象都是分配在堆上(通過new調用)或stacK(基本上,通過移動esp爲其預留內存)分配的內存結構駐留塊。內存分配後,指針傳遞給對象構造函數進行初始化(注意ctor可以內聯,這樣就不會產生call)。

通常,每個具有虛擬方法的對象都有一個指向虛擬方法的表(通常稱爲VMT或vtable,它存儲指向函數的指針,當您調用虛擬方法時,獲取此方法的地址並調用它。看起來是這樣的

mov ecx, [this] 
mov ebx, vtable 
push [arg2] 
push [arg1] 
call [ebx + OFFSET_foo] ; this->foo(arg1, arg2); 

注意,在此示例中我已經證明this通過ECX傳遞和args是從右到左的順序,這是thiscall convention,在VC++使用默認情況下,例如,通過堆棧傳遞其他編譯器可能會採用其他慣例,如鏈接文章所示。

對於非虛擬調用,不需要查找表。所以,代碼看起來像

mov ecx, [this] 
push [args] 
push [arg1] 
call bar ; this->bar(arg1, arg2) 

這就是爲什麼非虛方法可以更快一點被執行 - 它的地址是衆所周知的,所以編譯器就可以開始遇到call碼解碼之前他們的代碼。

在某些調用約定(例如fastcall)中,參數通過寄存器傳遞,在某些情況下可以更快。

在大多數調用約定中,如果通過寄存器,通過FPU堆棧(如果這是浮點或通過堆棧)適合該寄存器,則返回結果iss。

如果您想了解更多關於翻譯的C++代碼組件,我建議你到

  • 儘量讓你的編譯器生成彙編(通常-S鍵在裝配過程中上市;它可以設定VC++項目設置也是如此);

  • 嘗試反彙編代碼例如使用優秀的IDA反彙編程序。它有free version它。它通過爲局部變量提供符號名稱,識別庫函數等方面幫助很大。

祝你好運!

+0

謝謝!這就說得通了!! :) – 2009-11-25 23:13:28