题
如何查看 C++ 程序的汇编代码?
有哪些流行的工具可以做到这一点?
解决方案
要求编译器
如果你正在建立的程序自己,你可以问问你的编译器发组源。对于大多数UNIX编译器的使用 -S
开关。
如果您使用的GNU汇编,汇编有
-g -Wa,-alh
将给混源和大会stdout(-Wa
要求编译器驱动程序通过选项,汇编的-al
开会的,-ah
增加了"高级源"清单):g++ -g -c -Wa,-alh foo.cc
Visual Studio,使用
/FAsc
.
窥视到的二进制
如果你已经编制了二进制
- 使用
objdump -d a.out
在UNIX(也适用于cygwin), dumpbin /DISASM foo.exe
在窗户。
用你的调试器
调试器还可显示disassebly.
- 使用
disas
命令在库, - 或 拆卸窗口 视觉上的工作室窗口。
其他提示
在GCC / G ++,编译-S
。这将输出与汇编代码something.s
文件。
修改:如果要输出到在Intel语法(这是IMO,更可读,并且最组件教程使用它),编译-masm=intel
在Visual Studio;
- 设置一个断点
- 运行程序,直到它停止在断点
- 右击的源代码和选择"显示编译"
有关的gcc /克++
gcc -save-temps -fverbose-asm prog.c
这将产生在每一个ASM线用在变量的一些评论prog.s:
movl $42, -24(%ebp) #, readme
movl -16(%ebp), %eax # pid, pid
movl %eax, 4(%esp) # pid,
movl $.LC0, (%esp) #,
call printf #
此站点当前为我工作(2017): https://godbolt.org/
无论调试器您使用的应当具有的组装图(Visual Studio中,Borland的IDE,GDB,等等)。如果不使用调试器,你只是想看到的是一个什么样的程序组件,您可以使用反汇编或替代,运行程序和附加到它与调试器,并从那里做转储。看到分解器参考等选项的信息。
至于别人提到的,你的平台的调试器是一个很好的起点。对于所有调试器和反汇编的手提钻,看看 IDA Pro中。
在Unix / Linux平台(包括Cygwin的),可以使用objdump --disassemble <executable>
。
大多数编译器有一个选项,输出的组件列表。例如。与VisualStudio中,你可以使用这样的:
cl.exe /FAfile.asm file.c
有关最佳可读性不过,大多数调试器将提供交织与原始源的反汇编的视图,这样你就可以通过行的编译器的输出线比较你的代码。
PE资源管理器拆装的32位PE文件。 IDA为他人。
您也可以尝试这个网站: http://assembly.ynh.io/
有,可以粘贴C或C ++代码,然后按一个蓝色按钮来查看组件等效的版本。
在Visual Studio中可以生成汇编为一个C ++项目列表。
转到项目属性,然后以C ++ /输出文件,并设置汇编输出设定和ASM列表位置到一个文件名。
如果你们食用户,可以使用 拆卸看.
拆卸图显示了加载的程序作为汇编 说明的混合与源代码作比较。当前 执行线路箭头指示的标记,并强调在 图。你可以做以下任务在拆卸查看:
- 设断点在开始任何汇编指令
- 启用和禁用断点和它们的设定它们的性质
- 步骤,通过拆卸指令的程序
- 跳到具体说明的程序