[学习资料] C语言是如何翻译成汇编的

[复制链接]
942|8
 楼主| 幸福小强 发表于 2025-2-21 15:51 | 显示全部楼层 |阅读模式
一、预处理阶段(Preprocessing)
通过预处理器处理源码中的宏、头文件和条件编译指令
  1. // 原始代码
  2. #include <stdio.h>
  3. #define PI 3.14

  4. int main() {
  5.     printf("Value: %f", PI);
  6. }
预处理后展开为
  1. // 展开stdio.h头文件内容
  2. // 替换PI为3.14
  3. int main() {
  4.     printf("Value: %f", 3.14);
  5. }
二、编译阶段(Compilation)
编译器将预处理后的代码转换为汇编代码,核心过程如下:

‌词法分析‌
将源码拆解成token流(如int, main, (, ), {等)

‌语法分析‌
构建抽象语法树(AST),验证代码结构合法性

‌语义分析‌
检查类型匹配、变量声明等语义规则

‌中间代码生成‌
生成LLVM IR或三地址码等中间表示
  1. t1 = 3.14
  2. call printf, "Value: %f", t1
‌代码优化‌
对中间代码进行冗余消除、循环优化等(如-O1/-O2优化等级)

‌目标代码生成‌
生成对应CPU架构的汇编代码(x86/ARM/RISC-V等)


 楼主| 幸福小强 发表于 2025-2-21 15:52 | 显示全部楼层
三、汇编代码示例对比
‌C代码片段
  1. int add(int a, int b) {
  2.     return a + b;
  3. }

‌生成的x86-64汇编(GCC 14.0)‌
  1. add:
  2.     pushq   %rbp
  3.     movq    %rsp, %rbp
  4.     movl    %edi, -4(%rbp)  ; 参数a存入栈
  5.     movl    %esi, -8(%rbp)  ; 参数b存入栈
  6.     movl    -4(%rbp), %edx  
  7.     addl    -8(%rbp), %edx  ; 执行a+b
  8.     movl    %edx, %eax      ; 结果存入eax(返回值寄存器)
  9.     popq    %rbp
  10.     ret


 楼主| 幸福小强 发表于 2025-2-21 15:53 | 显示全部楼层
四、关键工具与验证方法
‌生成汇编代码‌
使用GCC命令:
  1. gcc -S -fverbose-asm -O2 demo.c  # 生成demo.s

‌实时查看汇编‌
在Compiler Explorer在线工具(godbolt.org)中选择编译器版本,实时观察C到汇编的转换过程

‌调试器验证‌
使用GDB调试时输入disassemble命令查看函数对应的汇编指令
huahuagg 发表于 2025-2-21 17:54 | 显示全部楼层
那还要知道汇编如何转机器码。
玛尼玛尼哄 发表于 2025-2-22 12:53 | 显示全部楼层
这个好像是有一个套路的,按照这个套路先转换成汇编
狗啃模拟 发表于 2025-2-23 00:01 | 显示全部楼层
在预处理阶段,预处理器会处理源码中的 宏定义、头文件包含 和 条件编译指令,并生成一个经过处理的源码文件。
jiekou001 发表于 2025-2-26 15:34 | 显示全部楼层
编译工具,将代码整合后翻译成汇编代码。
wanduzi 发表于 2025-2-26 18:51 | 显示全部楼层
很多时候不需要考虑这个问题。很多开源免费的,比如GCC。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

143

主题

1720

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部