如何查看 C++ 的汇编代码 程序?

发布于 2024-07-19 08:46:53 字数 51 浏览 3 评论 0原文

如何查看 C++ 程序的汇编代码?

有哪些流行的工具可以做到这一点?

How can I see the assembly code for a C++ program?

What are the popular tools to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(14

自找没趣 2024-07-26 08:46:53

询问编译器

如果您自己构建程序,则可以要求编译器发出汇编源代码。 对于大多数 UNIX 编译器,使用 -S 开关。

  • 如果您使用的是 GNU 汇编器,使用 -g -Wa,-alh 进行编译将在 stdout 上提供混合的源代码和汇编(-Wa 要求编译器驱动程序传递汇编器选项,-al 打开汇编列表,-ah 添加“高级源代码”列表):

    g++ -g -c -Wa,-alh foo.cc

  • 对于 Visual Studio,请使用 /FAsc< /代码>


查看二进制文件

如果您有已编译的二进制文件,

使用调试器

调试器还可以显示反汇编。

  • 在GDB中使用disas命令。
    如果您更喜欢 Intel 语法,请使用 set disassemble-flavor intel
  • 或 Windows 上 Visual Studio 的反汇编窗口

Ask the compiler

If you are building the program yourself, you can ask your compiler to emit assembly source. For most UNIX compilers use the -S switch.

  • If you are using the GNU assembler, compiling with -g -Wa,-alh will give intermixed source and assembly on stdout (-Wa asks compiler driver to pass options to assembler, -al turns on assembly listing, and -ah adds "high-level source" listing):

    g++ -g -c -Wa,-alh foo.cc

  • For Visual Studio, use /FAsc.

Peek into a binary

If you have a compiled binary,

Use your debugger

Debuggers could also show disassembly.

  • Use disas command in GDB.
    Use set disassembly-flavor intel if you prefer Intel syntax.
  • or the disassembly window of Visual Studio on Windows.
獨角戲 2024-07-26 08:46:53

在 GCC/G++ 中,使用 -S 进行编译。 这将输出一个包含汇编代码的 something.s 文件。

编辑:如果您希望输出采用 Intel 语法(IMO,更具可读性,并且大多数汇编教程都使用它),请使用 -masm=intel 进行编译。

In GCC/G++, compile with -S. That will output a something.s file with the assembly code.

Edit: If you want the output to be in Intel syntax (which is IMO, much more readable, and most assembly tutorials use it), compile with -masm=intel.

暖心男生 2024-07-26 08:46:53

在 Visual Studio 中

  1. 设置断点
  2. 运行程序直到停在断点处
  3. 右键单击源代码并选择“show dissasembly”

In Visual Studio;

  1. set a breakpoint
  2. run the program until it stops at the breakpoint
  3. rightclick on the sourcecode and pick "show dissasembly"
红ご颜醉 2024-07-26 08:46:53

对于 gcc/g++

gcc -save-temps -fverbose-asm prog.c

这将生成 prog.s,其中包含对每个 asm 行中使用的变量的一些注释:

    movl    $42, -24(%ebp)  #, readme
    movl    -16(%ebp), %eax # pid, pid
    movl    %eax, 4(%esp)   # pid,
    movl    $.LC0, (%esp)   #,
    call    printf  #

For gcc/g++

gcc -save-temps -fverbose-asm prog.c

This will generate prog.s with some comments on variables used in every asm line:

    movl    $42, -24(%ebp)  #, readme
    movl    -16(%ebp), %eax # pid, pid
    movl    %eax, 4(%esp)   # pid,
    movl    $.LC0, (%esp)   #,
    call    printf  #
三生一梦 2024-07-26 08:46:53

该网站目前正在为我工​​作(2017):https://godbolt.org/

This site is currently working for me (2017): https://godbolt.org/

窝囊感情。 2024-07-26 08:46:53

很多人已经告诉过如何使用给定的编译器发出汇编代码。 另一个解决方案是编译目标文件并使用 objdump< 等工具转储它/a>、readelf(在 Unix 上)或 DUMPBIN(< a href="http://msdn.microsoft.com/en-us/library/756as972(VS.80).aspx" rel="noreferrer">链接)(在 Windows 上)。
您还可以转储可执行文件,但读取输出会更加困难。

这样做的优点是可以与任何编译器以相同的方式工作。

Lots of people already told how to emit assembly code with a given compiler. Another solution is to compile an object file and dump it with a tool such objdump, readelf (on Unix) or DUMPBIN(link) (on Windows).
You can also dump an executable, but it will be more difficult to read the output.

This has the advantage of working the same way with any compiler.

臻嫒无言 2024-07-26 08:46:53

无论您使用什么调试器都应该有一个程序集视图(Visual Studio、Borland IDE、gdb 等)。 如果您不使用调试器而只想查看程序中的程序集,则可以使用反汇编器,或者运行该程序并使用调试器附加到它,然后从那里进行转储。 有关选项的信息,请参阅对反汇编程序的引用。

Whatever debugger you're using should have an assembly view (Visual Studio, Borland IDE, gdb, etc.). If you are not using a debugger and you merely want to see what assembly is in a program, you can use a disassembler or alternatively, run the program and attach to it with a debugger and do the dump from there. See references to disassemblers for information on options.

只为守护你 2024-07-26 08:46:53

正如其他人提到的,您平台的调试器是一个很好的起点。 有关所有调试器和反汇编器的工具,请查看 IDA Pro。

在 Unix/Linux 上平台(包括 Cygwin)您可以使用 objdump --disassemble

As someone else mentioned, your platform's debugger is a good starting point. For the jackhammer of all debuggers and disassemblers, take a look at IDA Pro.

On Unix/Linux platforms (including Cygwin) you can use objdump --disassemble <executable>.

马蹄踏│碎落叶 2024-07-26 08:46:53

大多数编译器都可以选择输出汇编列表。 例如,使用 VisualStudio,您可以使用类似的内容:

cl.exe /FAfile.asm file.c

为了获得最佳的可读性,大多数调试器将提供一个将反汇编代码与原始源代码交错的视图,以便您可以将代码与编译器的输出逐行进行比较。

Most compilers have an option to output an assembly listing. E.g. with VisualStudio you can use something like:

cl.exe /FAfile.asm file.c

For best readability though, most debuggers will offer a view that interleaves the disassembly with the original source, so you can compare your code with the compiler's output line by line.

流云如水 2024-07-26 08:46:53

用于 32 位 PE 文件的 PE Explorer 反汇编程序。 为其他人提供 IDA。

PE Explorer Disassembler for 32-bit PE files. IDA for others.

⒈起吃苦の倖褔 2024-07-26 08:46:53

您还可以尝试这个网站: http://assemble.ynh.io/

在那里,您可以粘贴您的 C或 C++ 代码,然后按蓝色按钮查看程序集等效版本。

You can also try this site: http://assembly.ynh.io/

There, you can paste your C or C++ code and press a blue button to see the assembly equivalent version.

π浅易 2024-07-26 08:46:53

在 Visual Studio 中,您可以生成 C++ 项目的汇编程序列表。

转到项目属性,然后转到 C++/输出文件,并将汇编器输出设置和 ASM 列表位置设置为文件名。

In Visual Studio you can generate the assembler listing for a C++ project.

Go to project properties, then to C++/Output Files and set Assembler Output setting and ASM list location to a file name.

无尽的现实 2024-07-26 08:46:53

在 Intel Mac OS X 10.8 (Mountain Lion) 上,-masm=intel 指令不起作用。 应该已经安装了名为“otool”的工具:

otool code.o -tV

但是,如果您安装了 Xcode,它 提供编译后的目标代码作为参数。

On an Intel Mac OS X 10.8 (Mountain Lion) the -masm=intel directive didn't work. However, if you have Xcode installed, it should have installed the tool named 'otool':

otool code.o -tV

You have to provide the compiled object code as a parameter.

看透却不说透 2024-07-26 08:46:53

如果您是 Eclipse 用户,则可以使用 反汇编视图

反汇编视图将加载的程序显示为汇编程序
指令与源代码混合进行比较。 目前的
执行行由箭头标记指示并在
看法。 您可以在反汇编视图中执行以下任务:

  • 在任何汇编指令的开头设置断点
  • 启用和禁用断点及其属性
  • 逐步执行程序的反汇编指令
  • 跳转到程序中的特定指令

If you're an Eclipse user, you can use the Disassembly view.

The Disassembly view shows the loaded program as assembler
instructions mixed with source code for comparison. The currently
executing line is indicated by an arrow marker and highlighted in the
view. You can do the following tasks in the Disassembly view:

  • Set breakpoints at the start of any assembler instruction
  • Enable and disable breakpoints and their set their properties
  • Step through the disassembly instructions of your program
  • Jump to specific instructions in the program
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文