C 到汇编探索器
CtoAsmExplorer
参考 Compiler Explorer (godbolt.org) 的交互式 C 到汇编编译器。编写 C 代码,实时查看编译后的 x86-64 汇编输出,行号对应高亮,理解编译器如何将高级语言转换为机器指令。
C → x86-64
实时编译 · 执行模拟
GCC · -O0
input.c
1
2
3
4
int add(int a, int b) {int result = a + b;return result;}
output.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
add:push rbpmov rbp, rspmov dword ptr [rbp-4], edimov dword ptr [rbp-8], esimov eax, dword ptr [rbp-4]push raxmov eax, dword ptr [rbp-8]mov ecx, eaxpop raxadd eax, ecxmov dword ptr [rbp-12], eaxmov eax, dword ptr [rbp-12]pop rbpretpop rbpret
参数
a=
b=
速度
步骤0
点击「单步」或「运行」开始模拟寄存器
x86-64RAX累加/返回值
0
0x00000000
RBX基址寄存器
0
0x00000000
RCX计数/第4参数
0
0x00000000
RDX数据/第3参数
0
0x00000000
RSI源/第2参数
0
0x00000000
RDI目的/第1参数
0
0x00000000
RBP基址指针
0
0x00000000
RSP栈顶指针
140737488347136
0x000-2000
标志位
ZF
零标志
0
SF
符号标志
0
CF
进位标志
0
OF
溢出标志
0
栈内存
向下增长0x7FFFFFFFE004
0x00000000(0)
0x7FFFFFFFE000
0x00000000(0)
RSP
栈帧边界
0x7FFFFFFFDFFC
0x00000000(0)
0x000000000004
0x00000000(0)
0x000000000000
0x00000000(0)
RBP
栈帧边界
0x0000000000-4
0x00000000(0)
参数a
如何阅读汇编执行
观察寄存器值的变化来理解每条指令的作用。RAX 是累加器和返回值,RBP/RSP 管理栈帧,RDI/RSI/RDX/RCX 传递函数参数。 标志位(ZF/SF/CF/OF)决定条件跳转的方向。
push/mov
函数序言
add/imul
算术运算
cmp/jne
条件跳转
pop/ret
函数返回
支持的 C 语言子集
int 变量算术运算 +−×÷比较运算 == != > <if / elsewhile 循环return函数参数数组声明 int arr[5]数组访问 arr[i]指针声明 int *p取地址 &var解引用 *ptr指针参数 int *arr
关联教材
以下教材与本沙盒涉及的抽象层级相关,建议系统学习:
关联教材章节
以下教材章节与本沙盒涉及的抽象层级相关,建议配合阅读:
第3章深入理解计算机系统
程序的机器级表示
有时候你要学会像机器一样思考
x86-64汇编寻址模式栈帧过程调用
第5章深入理解计算机系统
优化程序性能
我们可以做的更好
编译器优化循环展开并行性存储器山
第7章深入理解计算机系统
链接
欢迎来到灰色地带
静态链接目标文件符号解析重定位
第8章深入理解计算机系统
异常控制流
操作系统:唯一的使命就是帮助程序运行
异常进程系统调用信号
第9章深入理解计算机系统
虚拟内存
假装我们有用不完的物理内存
虚拟地址页表TLB内存映射
第10章深入理解计算机系统
系统级I/O
务必搞清楚你自己正在和整个系统的哪一层打交道
文件描述符RIO包I/O重定向
第12章深入理解计算机系统
并发编程
并发与并行,傻傻分不清楚?
线程互斥锁信号量生产者-消费者
第4章计算机系统要素
机器语言
CPU 能理解的指令
指令集寻址模式汇编
第6章计算机系统要素
汇编器
从助记符到机器码
符号解析代码生成
第7章计算机系统要素
虚拟机(上)
栈式机器
栈操作算术指令内存访问
第8章计算机系统要素
虚拟机(下)
控制流
标签分支函数调用
第10章计算机系统要素
编译器(上)
语法分析
词法分析递归下降
学习路径推荐
建议按以下顺序学习,循序渐进掌握计算机科学:
前置沙盒(建议先学习)
使用说明
- •调整参数观察行为变化,实时反馈
- •状态自动编码到 URL,可直接分享给他人
- •支持键盘操作(Tab 切换、方向键调整)