问题
I used cl command to compile a cpp file:
cl test.cpp //the generated test.exe can work well
then I used another way:
cl /Fa /c test.cpp //generate a test.asm assembly file
ml test.asm // there failed!!!
why? How to solve it?
source code:
//:test.cpp
#include<iostream>
using namespace std;
int main()
{
cout<<"hello\n";
}
wrong information:
Assembling: test.asm test.asm(1669) : fatal error A1010: unmatched block nesting
: ??$?6U?$char_trait s@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z
today I write another code in c
//test.cpp
#include<stdio.h>
void main()
{
printf("hello");
}
then I compile the code
cl /Fa /c test.cpp
ml test.asm //ok!
It may be the difference in C and C++. This confuses me a few days. :(
how to solve it? please help me.
回答1:
The compiler produces an invalid assembly listing when exception handling code is produced. There's a bug open on Microsoft Connect: http://connect.microsoft.com/VisualStudio/feedback/details/556051/cl-facs-generates-bad-masm-for-c-exception-handlers
In a response to the bug, there's a half-hearted "we will consider fixing this" along with a disclaimer that "listing files generated by the C/C++ compiler are for informational purposes".
It looks like you might be able to have a "scriptable" fix for this particular problem:
- cut the
ENDP
statement that follows atext$x ENDS
statement, - paste it just before the previous
_TEXT ENDS
statement
At least that looks to be the pattern in the asm file generated by your simple program - I don't know if that pattern would hold generally.
Unfortunately, after applying this fix, several new problems crop up with instructions using fs
overrides and a couple undefined symbols. Who knows what else you'd run into once you tried this with a more complex program?
来源:https://stackoverflow.com/questions/7488056/a-problem-with-cl-exe-and-ml-exe