【问题标题】:Why [ebp-8] is the location of the first local variable in visual C++?为什么 [ebp-8] 是 Visual C++ 中第一个局部变量的位置?
【发布时间】:2019-09-06 04:40:37
【问题描述】:

当我在 Visual Studio 2019 中编程时,我输入以下代码并在调试模式下编译它并进行一些反汇编。我发现变量“c”位于地址 ebp-8(在 myfunction 中)。但是,我从书中读到“第一个局部变量应该出现在地址 ebp-4 中”。是否有 Visual Studio 或调试模式?

int myfunction(int a, int b) { 013017B0 55 推送 ebp
013017B1 8B EC mov ebp,esp
013017B3 81 EC D8 00 00 00 sub esp,0D8h
013017B9 53 推 ebx
013017BA 56推esi
013017BB 57 推编辑器
013017BC 8D BD 28 FF FF FF lea edi,[ebp+FFFFFF28h]
013017C2 B9 36 00 00 00 mov ecx,36h
013017C7 B8 CC CC CC CC mov eax,0CCCCCCCCh
013017CC F3 AB rep stos dword ptr es:[edi]
013017CE B9 08 C0 30 01 mov ecx,130C008h
013017D3 E8 3F FA FF FF 呼叫 01301217

                   //Nonsense above.


int c = a + b;           

013017D8 8B 45 08 mov eax,dword ptr [ebp+8] //a

013017DB 03 45 0C add eax,dword ptr [ebp+0Ch] //b

013017DE 89 45 F8 mov dword ptr [ebp-8],eax //为什么不是[ebp-4]? }

【问题讨论】:

  • 我还发现第二个变量“i”位于[ebp-14],我认为应该是[ebp-12]。
  • 请更新您的问题,而不是在 cmets 中扩展它。
  • 0xcccccccc 的出现是提示,告诉您正在查看打开 /RTC 选项的调试版本。它使用不稳定的值初始化局部变量,因此您可以找到变量初始化错误。并用这个神奇的值包围变量,这样你就可以找到缓冲区溢出错误。后一个功能将变量从其正常位置移动。 docs.microsoft.com/en-us/cpp/build/reference/…

标签: visual-c++


【解决方案1】:

我发现 Visual Studio 在 debug 模式下会在局部变量之间留下 8 个字节,但在 release 模式下它可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 2021-05-21
    • 2012-04-03
    • 2018-03-02
    • 2021-05-29
    • 1970-01-01
    • 2015-03-04
    相关资源
    最近更新 更多