2013-03-31 58 views
1

假設你看堆,並具有以下代碼的過程中寄存器...連續2次函數調用有什麼不同?

... 
void Test() 
{ 
    for (int i = 0; i < 10; i++) 
    { 
      OneRunDontKnow(); 
    } 
} 
... 

你看看究竟兩次當進程執行循環堆棧,並在這兩個時代OneRunDontKnow是堆棧的頂部。

你能否知道OneRunDontKnow是否被彈出堆棧,然後再次推入或者它從未彈出?

編輯:OneRunDontKnow可以有任何簽名(它也可以帶參數或返回一個值)。

+0

通過檢查堆棧指針?但是,現在的編譯器做了很多技巧,即內聯。 –

+1

@Jan Dvorak:問題在於本地變量也在堆棧上創建。 – angelatlarge

回答

0

也許最好的方法是看你的彙編代碼。 OneRunDontKnow()不接受任何參數,所以棧上唯一的東西就是指令指針和其他堆棧框架的東西,但沒有參數。所以在反彙編中找到應該叫OneRunDontKnow()的地方,看看LOOP_LOOP,LOOPE等)的代碼裏面有什麼樣的PUSHJMP

+1

我很抱歉,我不明白你的意思。 ('OneRunDontKnow'CAN可以帶參數,它可以有任何簽名) – Idov

+0

哦,對不起,我認爲在你的特殊情況下它沒有。如果確實如此,應該更容易看到堆棧幀,因爲更多的東西會被壓入堆棧。 – angelatlarge

+1

您能否詳細說明一下? – Idov

相關問題