Visual Studio 是从 C 源代码还是从它编译成的二进制代码生成程序集?

Does Visual Studio generate assembly from the C source or from the binary code it compiled into?

当我 运行 我的代码(任何代码)时,在调试模式下我可以选择“反汇编”。

我知道“反汇编”是从机器代码(存储在目标文件中的“1”和“0”)创建汇编代码。

所以,我可以假设当我在 Visual Studio 中编译我的代码时,C/C++ 代码到机器 [=49] 之间没有“Assembly/Assembler”阶段=] 文件,如果我想查看汇编代码,我需要请求 Visual Studio 将其从目标文件反汇编为程序集。

所以我的问题是:

  1. 我说的对吗,难道除了反汇编就没有办法看到asm了吗?

  2. (如果 1 为否):为什么 Visual Studio 的调试器显示“反汇编”选项,而不是“汇编”?

  3. Clang/GCC有汇编阶段吗,还是C/C++代码直接编译成目标代码?


编者注:GCC 与大多数其他主流 C/C++ 编译器(如 clang/LLVM 和 MSVC)相比,对 3 的回答实际上有所不同。由于这是一个与 MSVC 的工作方式不同的问题,因此该部分是这些其他 SO 问答的副本:

当调试器提供反汇编选项时,它通常会检查 运行 进程的内存,并通过嵌入可执行文件或与可执行文件相关联的调试信息进行扩充,其中可以包括帮助调试器识别相关联的引用源代码。

另外,编译器通常可以选择向您展示汇编语言,即它们在内部使用的汇编语言(可能在传递给特定子进程的临时文件中,例如汇编器)或其等价物(它将生成的内容)如果它不直接生成目标代码)。对于 GCC 和 Clang,-S 开关执行此操作。对于 Visual Studio,/FA 执行此操作。