我正在寻找一个编译器或更好的 C IDE,它可以生成完全链接的程序,包括来自 CRT 的汇编程序形式的函数。有吗?我尝试了Visual C Express 2008。它有一个反汇编程序,但有点奇怪。我的意思是,出于某种原因,它显示了许多“奇怪”的代码行,例如大约 100 行中的
mov a,#3
......它用于研究目的。感谢您的提示。
gcc 将生成 ASM 文件。如果您使用
gcc -Wa,-adhln -g [source.c]
gcc 和 as 会将 C 源代码行与生成的汇编代码交错。
示例:
这个 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 代码与更高级别的源代码交错,例如作者在此处所做的那样。
不知道它是否会对您有帮助,但为了学习内部原理,我使用 IDAPro 和 OllyDbg 以及 disasm(在 linux/unix 上),这些对我很有帮助。
执行此操作的命令行选项,尤其是在使用 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 忽略“标准地点”
大多数(如果不是的话)所有编译器都能够做到这一点,这只是弄清楚要使用哪些开关的问题。
正常的编译器与链接后的代码无关。编译器可以为单个文件生成汇编输出,但要获得链接后结果,您几乎需要使用反汇编程序。正如 @dgarcia 所指出的,IDAPro 是一款非常好的软件。由于您显然是在 Windows 上工作,因此您也可以使用
dumpbin /disasm
。它不像 IDAPro 那么好,但它是免费的。
objdump -D <file-name>