C 到汇编探索器

CtoAsmExplorer

参考 Compiler Explorer (godbolt.org) 的交互式 C 到汇编编译器。编写 C 代码,实时查看编译后的 x86-64 汇编输出,行号对应高亮,理解编译器如何将高级语言转换为机器指令。

C → x86-64

实时编译 · 执行模拟

GCC · -O0
input.c
4 lines
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 rbp
mov rbp, rsp
mov dword ptr [rbp-4], edi
mov dword ptr [rbp-8], esi
mov eax, dword ptr [rbp-4]
push rax
mov eax, dword ptr [rbp-8]
mov ecx, eax
pop rax
add eax, ecx
mov dword ptr [rbp-12], eax
mov eax, dword ptr [rbp-12]
pop rbp
ret
pop rbp
ret
参数
a=
b=
速度
步骤0
点击「单步」或「运行」开始模拟
寄存器
x86-64
RAX累加/返回值
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

使用说明

  • •调整参数观察行为变化,实时反馈
  • •状态自动编码到 URL,可直接分享给他人
  • •支持键盘操作(Tab 切换、方向键调整)