【问题标题】:what differs 2 function calls in a row?连续 2 个函数调用有何不同?
【发布时间】:2013-03-31 18:52:07
【问题描述】:

假设您查看具有以下代码的进程的堆栈和寄存器...

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

当进程执行循环时,您会准确地查看堆栈两次,并且在这两次中,OneRunDontKnow 都位于堆栈的顶部。

您能否以某种方式知道OneRunDontKnow 是从堆栈中弹出然后再次推入,还是从未弹出?

编辑:OneRunDontKnow 可以有任何签名(它也可以接受参数或返回值)。

【问题讨论】:

  • 通过检查堆栈指针?然而,现在的编译器做了很多技巧,即内联。
  • @Jan Dvorak:问题是局部变量也是在堆栈上创建的。

标签: windows stack cpu-registers


【解决方案1】:

可能最好的方法是查看您的汇编代码。 OneRunDontKnow() 没有参数,所以堆栈上唯一的东西就是指令指针和其他堆栈帧的东西,但没有参数。所以在反汇编中找到应该调用OneRunDontKnow()的地方,看看LOOP_LOOPLOOPE等)所在的代码里面的PUSHJMP是什么样的。

【讨论】:

  • 对不起,我没明白你的意思。 ('OneRunDontKnow' 可以带参数,可以有任何签名)
  • 哦,对不起,我认为在你的特殊情况下它没有。如果是这样,应该更容易看到堆栈帧,因为更多的东西会被PUSHed 放到堆栈中。
  • 你能详细说明一下吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多