Visual Studio 2010 像 Visual Studio 6 一样在 C++ 中编译内联程序集?

Posted

技术标签:

【中文标题】Visual Studio 2010 像 Visual Studio 6 一样在 C++ 中编译内联程序集?【英文标题】:Visual Studio 2010 compiling inline assembly in c++ as if Visual Studio 6? 【发布时间】: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 编译器?

【问题讨论】:

【参考方案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 代码在这个时代仍然有效。跨度>

以上是关于Visual Studio 2010 像 Visual Studio 6 一样在 C++ 中编译内联程序集?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2010 像 Visual Studio 6 一样在 C++ 中编译内联程序集?

在 Visual Studio 中向编辑器添加指南

Visual Studio进行Web性能测试- Part I

有啥建议如何为像 Visual Studio 2010 测试这样的 NUnit 测试部署依赖项吗?

Visual Studio 8 中程序集引用的 Aliases 属性有啥用

如何使 Visual Studio C++ 2010 编译行为像 gcc/g++? (或相反亦然)