如何查看C等代码编译后的机器语言或汇编代码?
嘿,这个问题问得好!想看看C代码编译后的汇编甚至机器码,其实用常用的编译器和工具就能轻松搞定,我给你分情况详细讲讲:
一、查看汇编代码(最常用,可读性高)
不管是GCC、Clang(跨平台通用)还是MSVC(Windows专属),都能直接生成易读的汇编文件:
GCC/Clang 操作
- 生成单独的汇编文件:
在终端执行gcc -S your_code.c(Clang把gcc换成clang就行),编译完成后会生成一个your_code.s文件,直接用文本编辑器打开就能看到汇编代码。- 小技巧:如果习惯Intel格式的汇编(默认是AT&T格式),加
-masm=intel参数,比如gcc -S -masm=intel your_code.c。 - 想看优化后的汇编?加优化等级参数,比如
-O2:gcc -S -O2 your_code.c,对比无优化(-O0)的版本,能直观看到编译器做的各种优化操作。
- 小技巧:如果习惯Intel格式的汇编(默认是AT&T格式),加
- 直接在终端输出汇编(不生成文件):
执行gcc -S -o - your_code.c,汇编代码会直接打印在终端里,适合快速查看小段代码的汇编结果。
MSVC 操作
打开Visual Studio自带的开发者命令提示符,执行:cl /c /Fa your_code.c,编译后会生成your_code.asm文件,打开就能看到对应汇编代码。
二、查看机器码(二进制指令)
机器码是CPU能直接执行的二进制指令,通常我们会通过反汇编工具把二进制文件转换成「机器码+对应汇编」的形式查看:
从目标文件查看(编译未链接阶段)
- GCC/Clang:
先编译生成目标文件:gcc -c your_code.c,得到your_code.o。
然后用objdump -d your_code.o反汇编,输出里会同时显示机器码(左侧十六进制)和对应的汇编指令(右侧)。 - MSVC:
先编译生成目标文件:cl /c your_code.c,得到your_code.obj。
然后用dumpbin /disasm your_code.obj查看,同样会同步展示机器码和汇编。
从可执行文件查看(编译链接完成后)
- Linux/macOS:
先编译出可执行文件:gcc your_code.c -o your_code。
然后执行objdump -d your_code,就能看到整个可执行程序的机器码和汇编,包括链接进来的系统库代码。 - Windows:
用MSVC编译出.exe文件后,执行dumpbin /disasm your_code.exe即可查看完整的机器码与对应汇编。
额外小技巧
如果想一次性获取编译全流程的中间文件(预处理后的C代码、汇编、目标文件),可以用gcc -save-temps your_code.c,执行后会生成your_code.i(预处理后代码)、your_code.s(汇编)、your_code.o(目标文件)三个文件,方便你一步步分析编译的完整过程。
内容的提问来源于stack exchange,提问作者CCox




