В чем разница между параметром "/ FAs командной строки" (сгенерировать вывод asm) или параметром меню "Перейти к разборке"? - PullRequest
0 голосов
/ 10 мая 2019

В чем разница между параметром "/ FAs командной строки" (для генерации вывода asm) и параметром меню "Перейти к разборке"?

Я знаю, что Visual Studio имеет два метода для просмотра кода сборки.

Метод 1: MSVC Добавьте / FA к параметрам командной строки для создания файла .asm.

Метод 2: Перейти к пункту меню «Разборка»

Q1.В чем разница между ассемблерным кодом, сгенерированным методом 1 и 2?

Q2.Способ 1 и способ 2, какой способ просмотра кода сборки лучше?

Q3.Какой дизассемблер по умолчанию для VS в методе 2?

1 Ответ

4 голосов
/ 10 мая 2019

«Перейти к разборке» - это функция отладки среды IDE Visual Studio, а параметры командной строки для вывода разборки - это функция компилятора C ++. Это совершенно разные вещи, они не имеют ничего общего друг с другом и работают совершенно противоположным образом. Прежде всего, «Перейти к разборке» не выполняет сборку. Он делает прямо противоположное: он интерпретирует часть памяти запущенного процесса как машинный код и показывает вам, как будет выглядеть код сборки для этого машинного кода. Ассемблер превращает код сборки в машинный код. Дизассемблер превращает машинный код в код сборки. То, что происходит здесь, является последним. Вот почему он называется «Перейти к Dis сборка». Я не думаю, что дизассемблер, используемый отладчиком VS, доступен как отдельный инструмент. По крайней мере, мне неизвестна какая-либо документация, в которой упоминается такой инструмент, и я бы никогда не увидел опцию для изменения того, какой дизассемблер следует использовать отладчику. Итак, ваш вопрос о дизассемблере по умолчанию, который использует отладчик, звучит довольно приглушенно, он просто использует тот, который встроен в отладчик & hellip;

Когда вы используете опции компилятора для вывода кода сборки, компилятор записывает код сборки, который он генерирует для вашего исходного кода, в файл. Это позволяет вам взглянуть на ассемблерный код, в который компилятор превратил ваш исходный код. В отличие от функции «Перейти к разборке» отладчика, которая покажет вам код сборки для фактического машинного кода, который фактически выполняется в данном процессе в любой данный момент, вывод сборки компилятором является всей сборкой компилятора производится для одного исходного файла. Обратите внимание, что это происходит для каждого исходного файла, до того, как фактическая программа связана. Таким образом, вы увидите, что сборка - это не сборка окончательной программы, а сборка, созданная для отдельного исходного файла. Если вы используете оптимизацию всей программы, эта сборка не обязательно будет соответствовать машинному коду, который фактически окажется в программе.

Вывод: между этими двумя вариантами нет «лучшего способа». Каждый из них делает что-то совершенно другое & hellip;

...