【问题标题】:Does Visual Studio generate assembly from the C source or from the binary code it compiled into?Visual Studio 是从 C 源代码还是从它编译成的二进制代码生成程序集?
【发布时间】:2020-11-11 05:41:28
【问题描述】:

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

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

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

所以我的问题是:

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

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

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


编者注:GCC 与大多数其他主流 C/C++ 编译器(如 clang/LLVM 和 MSVC)对于 3 的答案实际上是不同的。由于这与 MSVC 的工作方式是一个单独的问题,因此该部分与这些其他 SO Q&As 重复:

【问题讨论】:

标签: c++ visual-studio assembly gcc compiler-construction


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多