有没有C编译器可以显示asm中的链接程序?

问题描述 投票:0回答:5

我正在寻找一个编译器或更好的 C IDE,它可以生成完全链接的程序,包括来自 CRT 的汇编程序形式的函数。有吗?我尝试了Visual C Express 2008。它有一个反汇编程序,但有点奇怪。我的意思是,出于某种原因,它显示了许多“奇怪”的代码行,例如大约 100 行中的

mov a,#3
......它用于研究目的。感谢您的提示。

c assembly disassembly
5个回答
4
投票

gcc 将生成 ASM 文件。如果您使用

gcc -Wa,-adhln -g [source.c]
gcc 和 as 会将 C 源代码行与生成的汇编代码交错。

clangLLVM 将生成高质量的 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 代码与更高级别的源代码交错,例如作者在此处所做的那样。


1
投票

不知道它是否会对您有帮助,但为了学习内部原理,我使用 IDAPro 和 OllyDbg 以及 disasm(在 linux/unix 上),这些对我很有帮助。


1
投票

执行此操作的命令行选项,尤其是在使用 C++ 编译器的 Visual C++ Express 中,是 /Fa

                          -OUTPUT FILES-

/Fa[file] 名称汇编列表文件
/FA[scu] 配置程序集列表 /Fd[文件] 名称.PDB 文件
/Fe 名称可执行文件 /Fm[file] 名称映射文件
/F 名称目标文件 /fp 名称预编译头文件 /Fr[file] 名称源浏览器文件 /FR[文件] 名称扩展.SBR 文件 /doc[file] 处理 XML 文档 注释并可选择命名 .xdc 文件

您将在此处看到汇编器输出,通过结合预处理器标志,您应该能够看到与汇编器混合的所有输出。

                          -PREPROCESSOR-

/AI 添加到程序集搜索路径
/FU 强制使用程序集/模块 /C 不要删除评论
/D{=|#} 定义宏 /E 预处理到标准输出
/EP 预处理到标准输出,无 #line /P 预处理到文件
/Fx 将注入的代码合并到文件中 /FI 名称强制包含文件
/U 删除预定义宏 /u 删除所有预定义宏
/I 添加包含搜索路径 /X 忽略“标准地点”

大多数(如果不是的话)所有编译器都能够做到这一点,这只是弄清楚要使用哪些开关的问题。


0
投票

正常的编译器与链接后的代码无关。编译器可以为单个文件生成汇编输出,但要获得链接后结果,您几乎需要使用反汇编程序。正如 @dgarcia 所指出的,IDAPro 是一款非常好的软件。由于您显然是在 Windows 上工作,因此您也可以使用

dumpbin /disasm
。它不像 IDAPro 那么好,但它是免费的。


0
投票
objdump -D <file-name>
© www.soinside.com 2019 - 2024. All rights reserved.