你写好一段汇编代码,比如 mov eax, 5,按下回车运行,程序就动起来了。可这背后,CPU其实像一个严谨的流水线工人——它不跳步、不猜题,每条指令都得按固定节奏走完取指、译码、执行、写回这四步。
第一步:取指令(Fetch)
CPU先看程序计数器(PC)里存的是哪个地址,比如当前是 0x00400010,它就从内存这个位置把那条指令的二进制码“拿”过来。就像去图书馆借书,先查索书号,再伸手去架上抽出来。注意:这时候拿来的还只是“一串数字”,比如 0xB8 05 00 00 00,CPU还不知道它想干啥。
第二步:译码(Decode)
CPU内部的译码器开始工作,对照指令集手册“翻译”这串二进制。比如识别出 0xB8 是 x86 下的 mov eax, imm32 指令,后面四个字节 05 00 00 00 就是立即数 5(小端序)。这时 CPU 才明白:“哦,要把数字 5 塞进 eax 寄存器。”
第三步:执行(Execute)
控制单元发出信号,让算术逻辑单元(ALU)或寄存器文件配合干活。上面那条指令不需要 ALU 计算,直接把数值 5 写入 eax 寄存器。但如果是 add ebx, ecx,ALU 就得先把 ebx 和 ecx 的值读出来,加完再把结果暂存到内部总线。
第四步:写回(Write-back)
执行完的结果,正式存进目标位置。对 mov eax, 5 来说,就是把 5 真正写入 eax 寄存器;对 sub edx, 1 来说,则是把计算后的新值写回 edx。这一步完成后,这条指令才算彻底落地。
顺带看看一个真实片段
假设这段汇编正在运行:
mov eax, 10
add eax, 2
cmp eax, 12第一条 mov 执行完,eax = 10;第二条 add 取 eax 当前值(10)和立即数 2,ALU 相加得 12,再写回 eax;第三条 cmp 其实是做减法但不保存结果,只更新标志位(比如 ZF=1 表示相等)。你看,每条指令都在老老实实走自己的四步,不抢跑,也不偷懒。
现代 CPU 虽然用上了流水线、乱序执行、分支预测这些技术,让多条指令看起来像“同时”跑,但单条指令的执行逻辑,依然牢牢卡在这四个环节里。就像地铁列车一节接一节进站、开门、上下客、关门、发车——哪怕整条线高效运转,每一节车厢的动作顺序从来不变。