6

我使用 cl 命令编译了一个 cpp 文件:

cl test.cpp  //the generated  test.exe can work well

然后我用了另一种方式:

cl /Fa /c test.cpp   //generate a test.asm assembly file
ml test.asm   // there failed!!!

为什么?如何解决?

源代码:

//:test.cpp 

 #include<iostream>
 using namespace std;
 int main()
  {
    cout<<"hello\n";
  }

错误信息:

组装:test.asm test.asm(1669):致命错误 A1010:不匹配的块嵌套

: ??$?6U?$char_trait s@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z


今天我用c写了另一个代码

//test.cpp
#include<stdio.h>
void main()
{
  printf("hello");
}

然后我编译代码

cl /Fa /c test.cpp
ml test.asm //ok!

这可能是 C 和 C++ 的区别。这让我困惑了几天。:(

如何解决?请帮我。

4

1 回答 1

8

生成异常处理代码时,编译器会生成无效的程序集列表。Microsoft Connect 上存在一个错误:http ://connect.microsoft.com/VisualStudio/feedback/details/556051/cl-facs-generates-bad-masm-for-c-exception-handlers

作为对该错误的回应,有一个半心半意的“我们将考虑修复此问题”以及“列出 C/C++ 编译器生成的文件仅供参考”的免责声明。

看起来您可能能够针对此特定问题进行“脚本化”修复:

  • 剪切ENDP语句后面的text$x ENDS语句,
  • _TEXT ENDS将其粘贴到上一条语句之前

至少这看起来是您的简单程序生成的 asm 文件中的模式 - 我不知道该模式是否普遍适用。

不幸的是,在应用此修复程序后,使用fs覆盖和几个未定义符号的指令出现了几个新问题。谁知道一旦你用更复杂的程序尝试了这个,你还会遇到什么?

于 2011-09-21T06:27:29.527 回答