简单来说,机器码指令是以一系列位的形式存储在处理器中的。如果你在处理器数据手册中查找MOV
,你会看到它有一个十六进制值,比如(例如)0xA5,这是特定于MOV
指令的。(不同类型的MOV
指令具有不同的值,但我们暂且忽略这一点。)
0xA5 hex == 10100101 binary.
(这不是X86上MOV
的真实操作码值 - 我只是为了说明目的而选择了一个值。)
在处理器内部,这被存储在一个“寄存器”中,它实际上是一个存储电压的触发器或锁存器数组:
+5
0
+5
0
0
+5
0
+5
这些电压中的每一个都馈入到一个门或一组门的输入中。
在下一个时钟边沿,那些门根据来自寄存器的输入电压更新其输出。
这些门的输出馈入到另一级门中,或者返回到它们自己。该级别馈入到下一个级别,依此类推。
最终,一条远离的门输出将连接回另一个锁存器/触发器(内部存储器),或者连接到处理器上的一个输出引脚。
Register->(clock)->Gate A->(clock)->Gate B->pin
->latch
(忽略不同门类型和更高级别结构的反馈)
这些操作在一定程度上并行发生,由核心架构定义。 "更快"的处理器-比如说,2.0GHz与1.0GHz-表现更好的原因之一是更快的时钟速度(GHz值)导致从一个门集合到下一个门集合的传播更快。
重要的是要理解,在非常高的层面上,处理器所做的就是改变引脚电压。我们在使用PC等设备时看到的所有复杂性都是由门内部模式和连接到处理器的外部设备/外围设备的模式派生出来的,例如其他CPU、RAM等。处理器的魔力在于它的引脚以何种模式和序列改变电压,以及内部反馈允许CPU在某一时刻的状态对其下一时刻的状态做出贡献。(在汇编语言中,此状态由标志、指令指针/计数器、寄存器值等表示。)
实际上,每个操作码(机器码指令)的位都与处理器的内部结构物理绑定(尽管必要时可能会用内部查找表/指令映射来抽象化)。
希望这有所帮助。我还接受过良好的EE教育和丰富的嵌入式开发经验,因此这些抽象对我来说是有意义的,但对新手可能没有太大用处。