打印
[学习资料]

C语言是如何翻译成汇编的

[复制链接]
567|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
幸福小强|  楼主 | 2025-2-21 15:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、预处理阶段(Preprocessing)
通过预处理器处理源码中的宏、头文件和条件编译指令
// 原始代码
#include <stdio.h>
#define PI 3.14

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

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

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

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

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

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


使用特权

评论回复
沙发
幸福小强|  楼主 | 2025-2-21 15:52 | 只看该作者
三、汇编代码示例对比
‌C代码片段
int add(int a, int b) {
    return a + b;
}

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


使用特权

评论回复
板凳
幸福小强|  楼主 | 2025-2-21 15:53 | 只看该作者
四、关键工具与验证方法
‌生成汇编代码‌
使用GCC命令:
gcc -S -fverbose-asm -O2 demo.c  # 生成demo.s

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

‌调试器验证‌
使用GDB调试时输入disassemble命令查看函数对应的汇编指令

使用特权

评论回复
地板
huahuagg| | 2025-2-21 17:54 | 只看该作者
那还要知道汇编如何转机器码。

使用特权

评论回复
5
玛尼玛尼哄| | 2025-2-22 12:53 | 只看该作者
这个好像是有一个套路的,按照这个套路先转换成汇编

使用特权

评论回复
6
狗啃模拟| | 2025-2-23 00:01 | 只看该作者
在预处理阶段,预处理器会处理源码中的 宏定义、头文件包含 和 条件编译指令,并生成一个经过处理的源码文件。

使用特权

评论回复
7
jiekou001| | 2025-2-26 15:34 | 只看该作者
编译工具,将代码整合后翻译成汇编代码。

使用特权

评论回复
8
wanduzi| | 2025-2-26 18:51 | 只看该作者
很多时候不需要考虑这个问题。很多开源免费的,比如GCC。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

127

主题

1604

帖子

2

粉丝