是否有任何C编译器在asm中显示链接的程序?

时间:2010-10-05 21:05:16

标签: c compiler-construction assembly

我正在寻找一个编译器或更好的C语言IDE,它可以生成完全链接的程序,包括汇编程序形式的CRT函数。有没有?我试过Visual C Express 2008.它有一个反汇编程序,但它有点奇怪。我的意思是出于某种原因,它显示了许多“奇怪的”代码行,例如大约100行中的mov a,#3 ....它用于研究目的。感谢您的提示。

5 个答案:

答案 0 :(得分:4)

gcc将生成ASM文件。如果使用gcc -Wa,-adhln -g [source.c] gcc,则将C源代码行与生成的汇编代码交错。

带有clang

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>