Как посмотреть ассемблерный код в visual studio
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents
Copy raw contents
Copy raw contents
В окне "Дизассемблированный код" в Visual Studio отображается код сборки, соответствующий созданным компилятором инструкциям.
В окне Дизассемблированный код отображается код сборки, соответствующий инструкциям, созданным компилятором. При отладке управляемого кода эти инструкции ассемблера соответствуют присущему данному объекту коду, созданному компилятором JIT, а не промежуточному языку (MSIL), созданному компилятором Visual Studio.
[!NOTE] Чтобы воспользоваться всеми возможностями окна Дизассемблированный код, изучите основы программирования на языке ассемблера.
Эта возможность доступна, только если включена отладка на уровне адреса. Она недоступна для отладки скриптов и SQL.
В дополнение к инструкциям ассемблера в окне Дизассемблированный код могут отображаться следующие сведения:
Исходный код, из которого получается код сборки.
Байты кода, то есть байтовое представление реальных инструкций компьютера или языка MSIL.
Символьные имена для адресов памяти.
Номера строк, соответствующие исходному коду.
Инструкции на языке ассемблера состоят из мнемоник, представляющих собой сокращения имен инструкций, и символов, которые обозначают переменные, регистры и константы. Каждую инструкцию машинного кода представляет одна мнемоника ассемблера, за которой следует один или несколько необязательных символов.
Код на ассемблере активно использует регистры процессора, а при использовании управляемого кода — регистры среды выполнения. Вы можете использовать окно Дизассемблированный код в сочетании с окном Регистры, которое позволяет изучить содержимое регистров.
Чтобы просмотреть инструкции машинного кода в необработанной числовой форме, а не на языке ассемблера, используйте окно Память или выберите Байты кода в контекстном меню в окне Дизассемблированный код.
Использование окна дизассемблирования
Чтобы включить окно Дизассемблированный код, выберите в разделе Сервис > Параметры > Отладка параметр Включить отладку на уровне адреса.
Чтобы открыть окно Дизассемблированный код во время отладки, выберите Windows > Дизассемблированный код или нажмите сочетание клавиш ALT+8.
[!NOTE] Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих параметров или выпуска. Чтобы изменить параметры, выберите в меню Сервис пункт Импорт и экспорт параметров . Дополнительные сведения см. в разделе Сброс параметров.
Чтобы включить или отключить вывод дополнительных сведений, щелкните правой кнопкой в окне Дизассемблированный код и установите или снимите в контекстном меню соответствующие флажки.
Желтая стрелка, расположенная в левом поле, отмечает текущую точку выполнения. Для собственного кода точка выполнения соответствует счетчику команд ЦП. В этом расположении отображается следующая инструкция, которая будет выполнена в программе.
Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих параметров или выпуска. Чтобы изменить параметры, в меню "Сервис" выберите команду "Импорт и экспорт параметров". Дополнительные сведения см. в разделе Сброс параметров.
Использование атрибутов может значительно упростить программирование на языке C++. Дополнительные сведения см. в статье Основные понятия. Некоторые атрибуты интерпретируются непосредственно компилятором. Другие атрибуты вводят в исходный текст программы код, который затем компилируется компилятором. Этот введенный код упрощает процесс программирования, уменьшая общий размер кода, который необходимо написать самостоятельно. Однако иногда возникающая при выполнении введенного кода ошибка может привести к сбою приложения. В таких случаях может возникнуть необходимость просмотреть этот код. Visual Studio предлагает два способа просмотра введенного кода:
Это можно сделать в окне Дизассемблированный код.
Можно создать объединенный исходный файл, содержащий и оригинальный, и введенный коды, с помощью /Fx.
Окно Дизассемблированный код показывает инструкции на ассемблере, соответствующие и исходному коду, и коду, введенному атрибутами. Кроме того, в окне Дизассемблированный код могут быть показаны примечания исходного кода.
Включение комментирования исходного кода
Щелкните правой кнопкой мыши окно Дизассемблированный код и выберите команду в контекстном меню Показать исходный код.
Если расположение атрибута в окне исходного кода известно, то для нахождения введенного кода в окне Дизассемблированный код можно использовать контекстное меню.
Просмотр введенного кода
Отладчик должен находиться в режиме приостановки выполнения.
В окне исходного кода поместите указатель мыши впереди того атрибута, чей введенный код нужно просмотреть.
Щелкните правой кнопкой мыши и выберите в контекстном меню команду Перейти к дизассемблированию.
Если атрибут находится недалеко от текущей точки выполнения, можно выбрать окно Дизассемблированный код в меню Отладка.
Просмотр дизассемблированного кода в текущей точке выполнения
Отладчик должен находиться в режиме приостановки выполнения.
В меню Отладка выберите Окна и нажмите кнопку Дизассемблированный код.
В окне Дизассемблированный код отображается код сборки, соответствующий инструкциям, созданным компилятором. При отладке управляемого кода эти инструкции ассемблера соответствуют присущему данному объекту коду, созданному компилятором JIT, а не промежуточному языку (MSIL), созданному компилятором Visual Studio.
Чтобы воспользоваться всеми возможностями окна Дизассемблированный код, изучите основы программирования на языке ассемблера.
Эта возможность доступна, только если включена отладка на уровне адреса. Она недоступна для отладки скриптов и SQL.
В дополнение к инструкциям ассемблера в окне Дизассемблированный код могут отображаться следующие сведения:
Исходный код, из которого получается код сборки.
Байты кода, то есть байтовое представление реальных инструкций компьютера или языка MSIL.
Символьные имена для адресов памяти.
Номера строк, соответствующие исходному коду.
Инструкции на языке ассемблера состоят из мнемоник, представляющих собой сокращения имен инструкций, и символов, которые обозначают переменные, регистры и константы. Каждую инструкцию машинного кода представляет одна мнемоника ассемблера, за которой следует один или несколько необязательных символов.
Код на ассемблере активно использует регистры процессора, а при использовании управляемого кода — регистры среды выполнения. Вы можете использовать окно Дизассемблированный код в сочетании с окном Регистры, которое позволяет изучить содержимое регистров.
Чтобы просмотреть инструкции машинного кода в необработанной числовой форме, а не на языке ассемблера, используйте окно Память или выберите Байты кода в контекстном меню в окне Дизассемблированный код.
Использование окна дизассемблирования
Чтобы включить окно Дизассемблированный код, выберите в разделе Сервис > Параметры > Отладка параметр Включить отладку на уровне адреса.
Чтобы открыть окно Дизассемблированный код во время отладки, выберите Windows > Дизассемблированный код или нажмите сочетание клавиш ALT+8.
Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих параметров или выпуска. Чтобы изменить параметры, выберите в меню Сервис пункт Импорт и экспорт параметров . Дополнительные сведения см. в разделе Сброс параметров.
Чтобы включить или отключить вывод дополнительных сведений, щелкните правой кнопкой в окне Дизассемблированный код и установите или снимите в контекстном меню соответствующие флажки.
Желтая стрелка, расположенная в левом поле, отмечает текущую точку выполнения. Для собственного кода точка выполнения соответствует счетчику команд ЦП. В этом расположении отображается следующая инструкция, которая будет выполнена в программе.
The Disassembly window shows assembly code corresponding to the instructions created by the compiler. If you're debugging managed code, these assembly instructions correspond to the native code created by the Just-in-Time (JIT) compiler, not the Microsoft intermediate language (MSIL) created by the Visual Studio compiler.
To take full advantage of the Disassembly window, understand or learn the basics of assembly-language programming.
This feature is only available if address-level debugging is enabled. It isn't available for script or SQL debugging.
In addition to assembly instructions, the Disassembly window can show the following optional information:
Source code from which the assembly code derives.
Code bytes, that is, the byte representations of the actual machine or MSIL instructions.
Symbol names for the memory addresses.
Line numbers corresponding to the source code.
Assembly-language instructions consist of mnemonics, which are abbreviations for instruction names, and symbols for variables, registers, and constants. Each machine-language instruction is represented by one assembly-language mnemonic optionally followed by one or more symbols.
Assembly code relies heavily on processor registers or, for managed code, common language runtime registers. You can use the Disassembly window along with the Registers window, which allows you to examine register contents.
To view machine-code instructions in their raw numeric form, rather than as assembly language, use the Memory window or select Code Bytes from the shortcut menu in the Disassembly window.
Use the Disassembly window
To enable the Disassembly window, under Tools > Options > Debugging, select Enable address-level debugging.
To open the Disassembly window during debugging, select Windows > Disassembly or press Alt+8.
The dialog boxes and menu commands you see might differ from those described in Help depending on your active settings or edition. To change your settings, choose Import and Export Settings on the Tools menu. For more information, see Reset settings.
To turn optional information on or off, right-click in the Disassembly window, and set or clear the desired options in the shortcut menu.
A yellow arrow in the left margin marks the current execution point. For native code, the execution point corresponds to the CPU's program counter. This location shows the next instruction that will be executed in your program.
I was reading another question pertaining the efficiency of two lines of code, and the OP said that he looked at the assembly behind the code and both lines were identical in assembly. Digression aside, how could I view the assembly code created when a program is compiled.
I'm using Microsoft's Visual C++, but I would also like to know if it's possible to view the assembly behind code written in Visual Basic.
So, how do I view the assembly code behind a program written in higher level languages like C++ and Visual Basic?
10 Answers 10
There are several approaches:
You can normally see assembly code while debugging C++ in visual studio (and eclipse too). For this in Visual Studio put a breakpoint on code in question and when debugger hits it rigth click and find "Go To Assembly" ( or press CTRL+ALT+D )
Second approach is to generate assembly listings while compiling. For this go to project settings -> C/C++ -> Output Files -> ASM List Location and fill in file name. Also select "Assembly Output" to "Assembly With Source Code".
Compile the program and use any third-party debugger. You can use OllyDbg or WinDbg for this. Also you can use IDA (interactive disassembler). But this is hardcore way of doing it.
"You can normally see assembly code while debugging C++ in visual studio " Whoa, I used godbolt and compiler output for this FOR YEARS while I could just get this in VS but didn't know. I missed this a lot. Thank you for opening my eyes, may you live for hundred!
Specify the /FA switch for the cl compiler. Depending on the value of the switch either only assembly code or high-level code and assembly code is integrated. The filename gets .asm file extension. Here are the supported values:
- /FA Assembly code; .asm
- /FAc Machine and assembly code; .cod
- /FAs Source and assembly code; .asm
- /FAcs Machine, source, and assembly code; .cod
Additional note: there is big difference between Debug assembler output and Release one. The first one is good to learn how compiler produces assembler code from C++. The second one is good to learn how compiler optimizes various C++ constructs. In this case some C++-to-asm transformations are not obvious.
I noticed that when disassembling Debug executable it seems to unpack code while it's running, this doesn't happen on the Release version. Also when opening both with PEiD just the Debug version shows "Microsoft Visual C++ 8.0 [Debug]".
The easiest way is to fire the debugger and check the disassembly window.
The Godbolt compiler explorer is designed for nicely formatting compiler asm output, removing the "noise" of directives, so I'd highly recommend using it to look at asm for simple functions that take args and return a value (so they won't be optimized away).
type is the DOS version of cat . I didn't want to include more code that would make it harder to find the functions I wanted to see the asm for. (Although using std::string and boost run counter to those goals! Some C-style string manipulation that makes more assumptions about the string it's processing (and ignores max-length safety / allocation by using a big buffer) on the result of GetModuleFileNameA would be much less total machine code.)
Читайте также: