【问题标题】:Problem on dword ptr[...] with visual studio 2010Visual Studio 2010 上的 dword ptr[...] 问题
【发布时间】:2011-10-13 10:05:15
【问题描述】:

我正在尝试编译一个与 Visual C++ 6.0 的编译器一起工作的程序。 现在,我正在使用 Visual Studio 2010 的编译器对其进行编译。它可以编译,但我的程序在分配变量时崩溃:

sapHigh = ctx->saphigh;

在汇编代码中(使用 Visual Studio 调试器),这条指令被分解为:

00410DF3  mov         eax,dword ptr [ctx]  
00410DF6  mov         ecx,dword ptr [eax+20h]  
00410DF9  mov         dword ptr [sapHigh],ecx 

指令“mov eax, dword ptr[ctx]”在eax中返回0x00000000,程序崩溃。但是调试器可以看到 ctx 指针的真实值是“0x0172287a”。如果我将 eax 寄存器的值更改为实际值“0x0172287a”,程序仍然可以正常工作,直到下一次赋值。

有人知道为什么这条指令不起作用吗?这是编译选项的问题吗?

感谢您的帮助。

【问题讨论】:

  • 您的程序是否使用了任何为与旧应用程序一起工作而编译的外部库或 dll?我记得在用 VC6 和 Visual Studio 2003 编译的 dll 之间使用 stl 字符串时,我们遇到了一些类似的问题。
  • 您是否尝试在ctx 位置设置断点?
  • 能贴出程序的源码吗?从这些 sn-ps 中很难猜到...
  • @NotJarvis 通常,所有外部库和 dll 都使用新编译器进行编译。
  • @RedX 很遗憾,我无法发布程序的源代码,抱歉...

标签: c++ visual-studio visual-studio-2010 assembly


【解决方案1】:

这是 10 到 12 年的漫长差距。我建议您在启用所有编译器警告的情况下在 VC10 中编译程序,并尝试删除所有警告。它包括与已弃用内容、64 位警告、性能警告和 C++ 兼容警告相关的所有警告。

【讨论】:

    【解决方案2】:

    听起来变量ctx 的内存不再有效。例如,如果ctx 是某个较早释放的动态分配结构的一部分,或者它是指向范围外堆栈变量的引用或指针,则可能会发生各种未定义的行为。

    如果(偶然)没有其他函数覆盖该内存,使用无效内存可能不会崩溃,但使用不同的编译器和不同的运行时库很容易导致不同的结果。

    【讨论】:

      【解决方案3】:

      如果您尝试lea eax, dword ptr[ctx] 会怎样?

      此外,如果将指向数组的指针传递给函数,我也看到过类似的问题。当数组在函数中定义时,一切都很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-04
        • 2011-03-04
        • 1970-01-01
        • 2011-04-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多