我使用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 ++的不同之处。这让我困惑了几天。 :(
如何解决?请帮帮我。
答案 0 :(得分:7)
生成异常处理代码时,编译器会生成无效的程序集列表。 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
覆盖和几个未定义符号的指令会出现几个新问题。谁知道一旦你用更复杂的程序尝试了这个,你会遇到什么?