2012-01-12 152 views
1

當我在Disassembly中查看一些c代碼時,我注意到了一些奇怪的前瞻性陳述。這些語句恰好在函數調用之前發生。所以我刪除了所有代碼我的程序剛剛離開這樣一個空的主要功能 -這些彙編語言語句的含義是什麼?

我有這樣一個空的主要功能 -

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    return 0; 
} 

然而,當我看着拆卸問題的彙編語句仍當下。那麼是否有人知道這些陳述的目的?

int _tmain(int argc, _TCHAR* argv[]) 
{ 
00411350 push  ebp 
00411351 mov   ebp,esp 
00411353 sub   esp,0C0h 
00411359 push  ebx 
0041135A push  esi 
0041135B push  edi 
0041135C lea   edi,[ebp-0C0h] 
00411362 mov   ecx,30h 
00411367 mov   eax,0CCCCCCCCh 
0041136C rep stos dword ptr es:[edi] 
return 0; 
0041136E xor   eax,eax 
} 

有問題的語句是

00411362 mov   ecx,30h 
00411367 mov   eax,0CCCCCCCCh 
0041136C rep stos dword ptr es:[edi] 
+0

可能重複的[爲什麼我們爲每個變量分配12個字節?](http://stackoverflow.com/questions/8033353/why-do-we-allocate-12-bytes-for-each-variable) – 2012-01-12 00:58:25

回答

2

該代碼使用模式(0xcc)填充堆棧幀。 exc保存要填寫的單詞數量,'eax'是模式。英特爾架構rep操作碼是「重複字符串操作前綴」。最有可能的是樣板代碼在一個完整的函數中會有意義(可能會清除局部變量,爲未初始化的變量創建故意不好的數據)。這裏堆棧幀在退出時立即銷燬,代碼無用。

沒什麼好擔心的。

1

他們這是在調試啓用建立一些冗餘代碼。它看起來像一些錯誤檢查。它們不會在發佈版本中發佈。

0

在我看來就像是寫在堆棧在程序終止...這是有意義的安全預防措施的情況下,任何敏感數據離開那裏垃圾。

編輯:正如評論指出的,這似乎是在設置代碼,所以這可能不是原因(我懷疑它是用於調試目的)。不過,我已將答案留在這裏供參考,因爲它在其他情況下可能仍然相關。

+0

這不是特別看起來像安全的事情。它看起來更像是試圖設置一個「壞」數據的緩衝區。大概是這樣,當程序嘗試讀取未初始化的數據時很明顯。 (當你在你的變量中看到'0xcccccccc'時,很可能你搞砸了,而且我很確定你是否試圖將該值作爲指針使用,會發生什麼情況。) – cHao 2012-01-12 00:25:54

+0

確實知道人們爲什麼知道編譯器在這裏?這個代碼在每一個主要功能中,所以必須有一些合法的原因。我不認爲它與程序終止時覆蓋堆棧有任何關係---在將函數參數放置在堆棧上並調用該函數之前,將此代碼放置。 – 2012-01-12 00:36:09

+0

是的...這是啓動代碼的一部分,而不是清理。就像我說的那樣,這可能是出於調試目的,所以從未初始化的局部變量讀取變得更加明顯。 – cHao 2012-01-12 00:37:45

2

在調試版本,Visual C++編譯填充分配用於與所述的0xCC圖案局部變量堆棧空間,使未初始化變量可以在調試時,可以容易地識別。編譯器和/或操作系統使用其他一些魔術值來幫助調試;在Wikipedia上檢查this list

我不確定爲什麼編譯器決定在這個函數中分配堆棧空間;可能這是處理main函數的特定事件。