我正在寻找一个编译器或更好的C语言IDE,它可以生成完全链接的程序,包括汇编程序形式的CRT函数。有没有?我试过Visual C Express 2008.它有一个反汇编程序,但它有点奇怪。我的意思是出于某种原因,它显示了许多“奇怪的”代码行,例如大约100行中的mov a,#3
....它用于研究目的。感谢您的提示。
答案 0 :(得分:4)
gcc将生成ASM文件。如果使用gcc -Wa,-adhln -g [source.c]
gcc,则将C源代码行与生成的汇编代码交错。
LLVM会生成高质量的ASM文件。
示例:
这个C函数:
long Fibonacci(long x) {
if (x == 0) return 0;
if (x == 1) return 1;
return Fibonacci(x - 1) + Fibonacci(x - 2);
}
成为此ASM文件:
_Fibonacci:
Leh_func_begin1:
pushq %rbp
Ltmp0:
movq %rsp, %rbp
Ltmp1:
subq $32, %rsp
Ltmp2:
movq %rdi, -16(%rbp)
movq -16(%rbp), %rax
cmpq $0, %rax
jne LBB1_2
movq $0, -8(%rbp)
jmp LBB1_5
LBB1_2:
movq -16(%rbp), %rax
cmpq $1, %rax
jne LBB1_4
movq $1, -8(%rbp)
jmp LBB1_5
LBB1_4:
movq -16(%rbp), %rax
movabsq $1, %rcx
subq %rcx, %rax
movq %rax, %rdi
callq _Fibonacci
movq -16(%rbp), %rcx
movabsq $2, %rdx
subq %rdx, %rcx
movq %rcx, %rdi
movq %rax, -24(%rbp)
callq _Fibonacci
movq -24(%rbp), %rcx
addq %rax, %rcx
movq %rcx, -8(%rbp)
LBB1_5:
movq -8(%rbp), %rax
addq $32, %rsp
popq %rbp
ret
Leh_func_end1:
执行此操作时,您将需要关闭优化。
还可以将生成的ASM代码与更高级别的源交错,例如编写器已完成HERE。
答案 1 :(得分:1)
不知道它是否会对你有所帮助,但是对于学习内部我使用IDAPro和OllyDbg以及disasm(在linux / unix上)并且那些为我提供了很多帮助。
答案 2 :(得分:1)
执行此操作的命令行选项,特别是在使用C ++编译器的Visual C ++ Express中,是/ Fa
-OUTPUT FILES-
/ Fa [文件]名称汇编列表文件
/ FA [scu]配置汇编列表 / Fd [文件]名称.PDB文件
/ Fe名称可执行文件 / Fm [文件]名称映射文件
/ Fo名称对象文件 / Fp名称预编译头文件 / Fr [file]名称源浏览器文件 / FR [file]名称扩展.SBR文件 / doc [file]处理XML文档 注释并可选择命名.xdc 文件
在这里您将看到汇编器输出,通过组合预处理器标志,您应该能够看到所有输出与汇编器混合。
-PREPROCESSOR-
/ AI添加到程序集搜索路径
/ FU强制使用组件/模块 / C不删除评论
/ D {= |#}定义宏/ E. 预处理到标准输出 / EP预处理到stdout,没有#line / P. 预处理到文件
/ Fx将注入的代码合并到文件中 / FI名称强制包含文件
/ U删除预定义的宏/ u 删除所有预定义的宏 /我添加包括搜索路径/ X. 忽略“标准位置”
大多数,如果没有,所有编译器都能够做到这一点,这就是要弄清楚要使用哪些开关。
答案 3 :(得分:0)
普通编译器与链接后的代码无关。编译器可以为单个文件生成汇编输出,但是为了获得后连接结果,您几乎需要使用反汇编程序。正如@dgarcia所说,IDAPro非常好。由于您显然在Windows上工作,因此您也可以使用dumpbin /disasm
。它不如IDAPro好,但它是免费的。
答案 4 :(得分:0)
objdump -D <file-name>