c - 代码是如何执行的和gcc

标签 c gcc assembly compiler-construction compilation

我对编译很感兴趣,我有一个关于 gcc 的问题。

我知道从代码生成一棵树来编译,那么ASM代码就是 生成,我需要关于这一点的一些解释。

ASM 代码是添加到文件中稍后执行,还是 ASM 代码直接加载到内存中使用 asm 函数?我正在开发一个小型编译器,但我不知道如何执行生成的树,而且我没有找到任何相关文档。

最佳答案

GCC 的前端解析不同语言(C、C++、Fortran、ObjectiveC、Java 等)的源文件。然后代码 (AST) 被翻译成内部表示,RTL (register transfer language) .这是接近 assembly 的表示。

然后将此 RTL 代码转换为目标机器的程序集并写入 .o(目标)文件。

然后链接器将生成的 .o 文件组合成可执行文件。

GCC 在 C/C++ 中也支持“内联”汇编代码片段。

工作流程是

Source file -> 
 AST  ->
  RTL representation  ->
   machine codes (with _optional_ text output of the ASM code) ->
    Executable (produced by linker)

对于解释器,您可以直接解释 AST 或为虚拟机生成您自己的操作码,因为这样的解释器(虚拟机)比 AST 解释器更简单。

如果您想了解所有详细信息,您应该查看 LCC (with a book by Chris Fraser and David Hanson) .随附的书中提供了实际架构代码生成的所有详细信息。

要了解生成的代码可以做什么,您应该阅读 Linkers and Loaders by John Levine书。

最后,为了避免询问有关脚本/解释器的所有信息,请参阅 Game Scripting Mastery by Alex Varanese .

关于c - 代码是如何执行的和gcc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11654994/

相关文章:

c - 验证表达式 getchar() != EOF 是 0 或 1

c - 关于将变量更改为子例程的错误 C2143 和错误 C2059

c - 为什么使用 bzero 而不是 memset?

c - 此代码段中的索引如何达到 2154? (gcc、嵌入式 C、ARM Cortex M0)

c++ - 在 GCC 的内联汇编中使用 C++ 引用

linux - nasm x86 查找最大和最小值并存储在寄存器中

performance - 如何使用仪器或查看组件确定 ARC 保留哪些对象?

C 访问另一个程序内存?

C++:是否需要使用相同版本的 GCC 和 GDB 进行调试

python - IDA Pro python idaapi