CPU 如何“知道”命令和指令的实际含义?

Sim*_*eke 73 cpu computer-architecture cpu-architecture

处理器如何“知道”不同命令的含义?

我正在考虑汇编级命令,如 MOV、PUSH、CALL 等...

Bre*_*ugh 87

当计算机解释汇编级指令时,这些指令将转换为它们的二进制等价物供 CPU 读取。当 CPU 执行指令时,它会将指令的操作码部分解释为单独的“微程序”,其中包含它们的微码等价物。如您所知,一条完整的汇编指令由操作码和随附的任何适用数据组成(如果需要)(例如寄存器名称、内存地址)。

微码指令是非常低级的(比汇编更是如此),并控制控制微处理器中逻辑流的实际数字信号。例如,一条微代码指令可以用新值更新条件代码寄存器标志,或者将 CPU寄存器ALU单元之一连接。更复杂的任务是可能的,但这向您展示微码用于什么的一般概念。

从编译到执行的一般流程如下。汇编指令被组装(变成它们的二进制等效 0 和 1,或从现在开始,逻辑信号)。这些逻辑信号依次由 CPU 解释,并转化为更底层的逻辑信号,引导 CPU 的流程执行特定指令。这可能需要一个或多个时钟周期,具体取决于处理器的体系结构和设计(大多数处理器参考手册会告诉您执行特定指令需要多少个时钟周期,例如这条指令)。

所有这一切都是通过硬编程微代码(物理地嵌入处理器中的某种ROM 中,在制造过程中设置)完成的,它引导流通过实际的低级逻辑门。这提供了抽象汇编指令和处理器中的物理电气逻辑之间的接口。


因此,总而言之,处理器指令是由处理器组装和加载的。然后处理器将使用这些指令来查找与该特定指令对应的微程序(以微代码的形式),这就是“实际”执行指令的内容。一旦执行了特定指令的微代码(可能需要一个或多个时钟周期),处理器就会执行微代码以获取下一条指令,并且循环重复。

  • 值得注意的是,只有**某些** CPU 是微编码的。一些(主要是较小的设备)直接在汇编操作码上运行。这取决于架构。 (5认同)
  • @Simon Verbeke,完全正确。他们只是拨动开关来引导处理器中的电信号流(这也可以引导它重新加载更多命令!)。开关类比很好,因为一切都是数字的(逻辑 1/0 或真/假)。正如您所知,逻辑电平是实际电压。由工程师来指定什么是 0 或 1(例如,逻辑 1 可以指定为 2 伏以上)。 (4认同)
  • 不,我是说因为 x86 架构的寿命和一次又一次的扩展,操作码中单个位到微操作的映射不像在 MIPS 或 ARM 中那样一刀切在某种程度上(例如,参见 http://www.d.umn.edu/~gshute/spimsal/talref.html,英特尔操作码与此完全不同)。我认为英特尔在 1978 年推出 x86 CPU 时并没有太多“RISC”的概念。 (3认同)
  • 好的,我明白了,我想 :) 那么命令位切换“开关”,这将使处理器用它接收到的数据做某些事情? (2认同)

Cra*_*ney 36

处理器并不真正“知道”命令是什么。命令只是二进制模式,它们使处理器执行我们解释命令的含义。

例如,ADD-R1-into-R2 操作将导致寄存器 1 和 2 的值到达 ALU(算术和逻辑单元),导致 ALU 使用加法器的输出而不是其他各种东西,并导致ALU的输出,以取代在寄存器2的值有简单的逻辑电路来实现所有这些事情(多路转换器加法器计数器,...),尽管真实处理器使用非常复杂的优化。

这有点像您在问汽车如何在您踩刹车时减速。汽车不知道,刹车踏板恰好间接控制了刹车片压在车轮上的硬度。

  • 与汽车打破踏板的好类比。 (5认同)

小智 9

以告诉 x86/IA-32 处理器将立即数 8 位值移动到寄存器中的指令为例。此指令的二进制代码是 10110,后跟要使用的寄存器的 3 位标识符。AL 寄存器的标识符是 000,所以下面的机器代码用数据 01100001 加载 AL 寄存器。

10110000 01100001

这个二进制计算机代码可以通过用十六进制表示如下,使其更具人类可读性

B0 61

这里,B0 的意思是“将以下值的副本移入 AL”,61 是值 01100001 的十六进制表示,即十进制 97。英特尔汇编语言为这样的指令提供了助记符 MOV(move 的缩写),因此上面的机器代码可以用汇编语言编写如下,如果需要,在分号后附上解释性注释。这更容易阅读和记住。

http://en.wikipedia.org/wiki/Assembler_language

换句话说,当你“组装”你的汇编程序时,你的指令如

MOV AL, 61h

被转换为数字,CPU 将其关联一个特殊的含义,然后进行相应的操作。

  • 还值得注意的是,将助记符“mov”分配给这个特定的位模式是*完全*任意的。原则上,我可以编写一个将该指令称为“oof”的汇编程序,它也能正常工作,但更难记住。 (2认同)

nib*_*bot 5

推荐阅读:

还可以查看CS152:加州大学伯克利分校的计算机体系结构和工程的课程笔记,这是一门学生实现 CPU 的课程。

如果你在谷歌上搜索“自制 CPU”,你会发现很多好东西。