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

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


person Simon    schedule 20.09.2011    source источник
comment
код, который вы разместили, компилируется нормально. может проблема в компиляторе? какой компилятор вы используете? как?   -  person Heisenbug    schedule 20.09.2011
comment
Я использую визуальную студию 2010   -  person Simon    schedule 20.09.2011
comment
Я воспроизвел. _TEXT ENDS над ENDP неуместен, он должен быть ниже него. Это происходит более одного раза, его сбивают обработчики исключений, которые вы получаете, когда используете /EHs (обязательно). Вы можете сообщить об ошибке на сайте connect.microsoft.com.   -  person Hans Passant    schedule 20.09.2011
comment
Я изменил файл asm, поместил ENDP ниже _TEXT ENDS. Но это та же ошибка.   -  person Simon    schedule 20.09.2011
comment
Я отключаю параметр исключения C++ и повторяю попытку. та же ошибка   -  person Simon    schedule 20.09.2011


Ответы (1)


Компилятор создает недопустимый листинг сборки при создании кода обработки исключений. В 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

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

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

person Michael Burr    schedule 21.09.2011
comment
Спасибо большое.Исправляю файл как вы сказали.решаю несоответствующую проблему.затем исправляю fs переопределения добавляя assume fs:nothing в начало асм файла.а вот вторую пролэм про неопределенные символы,решить пока не могу. - person Simon; 21.09.2011
comment
В 2010 г. меньше чем нерешительно: Перед тем, как была предпринята работа по настройке x64 с помощью компилятора Microsoft C/C++, мы призвали больше не поддерживать сборку файлов листинга, созданных на C/C++. Другими словами, файлы со списком предназначены только для информационных целей. Несмотря на то, что они не поддерживаются, файлы списков из целевого компилятора x86 потенциально могут быть собраны. Но с целевым компилятором x64 будет ряд вещей, которые не позволят собрать файлы листинга - person David Wohlferd; 06.12.2017