【问题标题】:Visual Studio 2010 compiling inline assembly in c++ as if Visual Studio 6?Visual Studio 2010 像 Visual Studio 6 一样在 C++ 中编译内联程序集?
【发布时间】:2011-01-07 15:17:34
【问题描述】:

我有一个在 VS6 中创建的 C++ 项目,它在 VS2010 中打开并且编译良好。它包含一个带有一些内联汇编的类,包括以下代码:

__asm{
  mov eax,this
  mov esi,[eax].m_pImage
  ...

一切都好,花花公子,直到我尝试在 VS2010 中创建一个新的 MFC C++ 项目并使用上面显示的汇编代码添加类。突然,这将无法编译,因为 __asm 的新解释要求代码如下(或类似的东西;无论如何都可以编译):

__asm{
  mov eax,this
  mov esi,[eax]this.m_pImage
  ...

现在,对于我的生活,我无法弄清楚这两个项目之间有什么区别,它允许转换后的 VS6 项目在 VS2010 中编译(假定当前无效)内联汇编代码,而新创建的项目可以不。

是否有一个(隐藏的)设置允许人们使用旧的 VS6 编译器?

【问题讨论】:

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


    【解决方案1】:

    VS6 内联 ASM 似乎是一个已修复的错误。我这么说是因为我不确定编译器如何验证m_pImageeax 寄存器中加载的内容的成员,因此无法找到偏移量。要回答您的问题,我知道在 VS6 编译器中无法使用旧的 ASM 语义。

    我会在内联 ASM 之外创建一个局部变量,然后将其分配给 esi

    void * pointer = this.m_pImage;
    __asm
    {
       mov ebx, pointer
       mov esi, ebx
       ...
    

    【讨论】:

    • 当你从 VS6 转换一个项目时(并且只有 VS6——其他版本不会发生这种情况),大量的兼容性设置被应用。可能已添加此错误修复,但旧的代码路径仍在 VS6 兼容模式下使用。
    • 没有办法复制这些兼容性设置?
    • 忽略最后一条评论......再次阅读答案和比利的评论,我很清楚我们不应该希望我们的错误遗留 VS6 代码在这个时代仍然有效。跨度>
    猜你喜欢
    • 2011-06-18
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    相关资源
    最近更新 更多