![CPU 如何“知道”命令和指令的实际含义?](https://linux22.com/image/1282184/CPU%20%E5%A6%82%E4%BD%95%E2%80%9C%E7%9F%A5%E9%81%93%E2%80%9D%E5%91%BD%E4%BB%A4%E5%92%8C%E6%8C%87%E4%BB%A4%E7%9A%84%E5%AE%9E%E9%99%85%E5%90%AB%E4%B9%89%EF%BC%9F.png)
处理器如何“知道”不同命令的含义?
我正在考虑诸如 MOV、PUSH、CALL 等汇编级命令......
答案1
当计算机解释集会级指令,这些指令被转换成它们的二进制等价物,以供 CPU 读取。当 CPU 执行指令时,它会将指令的操作码部分解释为单独的“微程序”,其中包含它们的微码等效。您需要知道的是,完整的汇编指令由操作码和任何与之相关的适用数据(如果需要)组成(例如寄存器名称、内存地址)。
微代码指令是极低级的(比汇编更低级),控制实际的数字信号,这些数字信号控制微处理器中的逻辑流。例如,一个微代码指令可以更新条件码寄存器用新值标记,或者连接 CPU登记与其中一个算术逻辑单元单位。 可以执行更复杂的任务,但这向您展示了什么微码用于。
从编译到执行的一般流程如下。汇编指令被汇编(转换为二进制等效的 0 和 1,或从现在开始的逻辑信号)。这些逻辑信号依次由 CPU 解释,并转换为更底层的逻辑信号,这些逻辑信号指导 CPU 执行特定指令。这可能需要一个或多个时钟周期,具体取决于处理器的架构和设计(大多数处理器参考手册会告诉您执行特定指令需要多少个时钟周期,例如这个)。
所有这些都是通过硬编程的微代码(以某种方式物理嵌入在处理器中)完成的。只读存储器在制造过程中设置),它引导流量通过实际的低级逻辑门. 这为抽象的汇编指令和处理器中的物理电气逻辑之间提供了一个接口。
因此,总而言之,处理器指令由处理器组装和加载。然后,处理器将使用这些指令查找与该特定指令相对应的微程序(以微代码的形式),这才是“实际”执行该指令的程序。一旦执行了特定指令的微代码(这可能需要一个或多个时钟周期),处理器就会执行微代码来获取下一条指令,然后重复该循环。
答案2
答案3
例如,有一条指令告诉 x86/IA-32 处理器将一个 8 位立即值移入寄存器。该指令的二进制代码为 10110,后跟一个 3 位标识符,用于指示要使用的寄存器。AL 寄存器的标识符为 000,因此以下机器代码将数据 01100001 加载到 AL 寄存器中。
10110000 01100001
这个二进制计算机代码可以通过用十六进制表示来使其更易于阅读,如下所示
B0 61
这里,B0 表示“将以下值的副本移入 AL”,61 是值 01100001 的十六进制表示,即十进制的 97。Intel 汇编语言为此类指令提供了助记符 MOV(move 的缩写),因此上面的机器代码可以用汇编语言编写如下,并在分号后添加解释性注释(如果需要)。这样更容易阅读和记忆。
http://en.wikipedia.org/wiki/Assembler_language
换句话说,当你“组装”你的汇编程序时,你的指令如
MOV AL, 61h
被转换成数字,CPU 赋予其特殊含义,然后采取相应的行动。
答案4
在最底层,CPU 所能做的就是加法。除了加法,它还可以做减法、乘法和除法(因为这些只是不同方式的加法)。CPU 利用这一点通过将加法应用到内存地址来在内存中移动数据。
但请记住,这是最低级别的。CPU 确实以微代码的形式“理解”某些命令。请参阅 Breakthrough 的答案,写得非常好。