你敲下printf("Hello World"); 的时候,是不是觉得自己像个创世神?
别急着飘——在 CPU 眼里,你写的不过是一堆待翻译的“高级谜语”。
今天我们就来扒一扒,当你按下“运行”时,你的代码到底经历了什么。
指令系统:CPU 的“方言秘籍”
每台电脑的CPU 都有自己的“方言”,叫指令系统。
就像东北话和粤语的差别,Intel 和 ARM 的指令也完全不一样。
你写的:
int a = 100, b = 20, c = a + b;
CPU 眼里可能是:
b86400000083c01489c3...(这串天书叫机器码)
是不是像在看乱码?
别慌,我们有“方言翻译器”——汇编语言。
汇编语言:程序员和CPU 的“微信聊天”
汇编语言其实就是机器指令的“昵称版”,比如:
mov eax, 100 ← 把 100 塞进 eax 这个“小口袋”
add eax, 20 ← eax 口袋里的数加 20
每条汇编指令,就是CPU 能听懂的一句“人话”。
它负责告诉CPU:搬数据、做计算、跳来跳去。
寄存器:CPU 的“随身小口袋”
CPU 身边有 8 个“魔法小口袋”(32位时代叫 EAX、EBX、ECX、EDX…):
你问BR 和 EBX 啥区别?
就好比“交通工具”和“你的自行车”——
BR 是一类工具,EBX 是实实在在的那辆车。
常用汇编指令:CPU 的“武功招式”
(一)算术派:
(二)逻辑派:
(三)跳跃派:
if-else 在底层:CPU 的“选择题技巧”
你写的:
if (a > b) return a;
else return b;
CPU 执行的:
cmp eax, ebx ← 比比谁大
jg bigger ← 如果 eax 大,跳去 bigger 标签
mov eax, ebx ← 否则把 ebx 的值给 eax
jmp end
bigger:
... ← 这里放 a>b 时要做的
end:
原来if-else 就是一场“比较 + 跳转”的心理战!
循环的真相:CPU 的“鬼打墙”
for 循环在底层就是:
1.设个计数器(常用ECX)
2.干点活
3.计数器减1
4.看看是不是减到0了,没到就回到第2步
像极了:“我再说一遍…我再说一遍…(直到你听懂)”
函数调用:CPU 的“电话游戏”
每次调用函数,CPU 就要:
1.记下现在在哪(压返回地址入栈)
2.跳去函数那里干活
3.干完了,顺着地址回来
这过程像极了:“妈我出去玩啦!—— 玩完记得回家吃饭!”
call 是“我出去啦”,ret 是“我回来啦”。
指令寻址:CPU 的“找路系统”
CPU 有个内置导航叫 PC(程序计数器),告诉它:“下条指令在那儿!”
考研高频考点:别慌,就考这些!
1.转移指令三兄弟:jmp、call、ret 各是什么鬼?
2.相对寻址算偏移:给你跳转指令,问你跳哪儿了
3.机器码长度计算:“这段代码占多少字节?”—— 尾地址减首地址再加1
4.条件跳转的条件:jg 和 ja 有啥不同?(一个有符号,一个无符号)
从代码到可执行:一场“三层翻译”
你的.c 文件要经历:
1.编译:高级语言→ 汇编语言(像中文翻英文)
2.汇编:汇编语言→ 机器码(像英文翻摩斯密码)
3.链接:多个机器码文件合并(像拼乐高)
最后才变成那个你双击的.exe。
为什么你要懂这些?
知道菜怎么烧,不代表你知道火怎么生。
懂汇编,就是懂“生火”——你不再是只会按菜谱做菜的厨子,而是能掌控厨房的大厨。
下次写代码时,不妨想象一下:
你每敲一行,CPU 就在底下疯狂翻译、搬数据、跳来跳去…
是不是突然觉得,编程更像是在指挥一支看不见的机器乐团?
点击下方【阅读原文】进入我的B站官方账号,海量优质视频等你!