2013-03-31 36 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

相关问题