Проблема с cl.exe и ml.exe

Я использовал команду 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 и С++. Это меня смущает несколько дней.: (

как его решить? пожалуйста, помогите мне.

Ответ 1

Компилятор создает недопустимый список сборок при создании кода обработки исключений. В Microsoft Connect обнаружена ошибка: http://connect.microsoft.com/VisualStudio/feedback/details/556051/cl-facs-generates-bad-masm-for-c-exception-handlers

В ответ на ошибку, есть половинчатый "мы рассмотрим исправление этого" вместе с отказом от ответственности, что "файлы списков, сгенерированные компилятором C/С++, предназначены для информационных целей".

Похоже, что у вас может быть исправлено сценарий для этой конкретной проблемы:

  • вырежьте оператор ENDP, который следует за оператором text$x ENDS,
  • вставьте его непосредственно перед предыдущим оператором _TEXT ENDS

По крайней мере, это выглядит как шаблон в asm файле, сгенерированном вашей простой программой, - я не знаю, будет ли этот шаблон содержать в целом.

К сожалению, после применения этого исправления появилось несколько новых проблем с инструкциями с переопределением fs и символами пары undefined. Кто знает, что еще вы столкнулись, если попробуете это с помощью более сложной программы?