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


73

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

我正在考虑汇编级别的命令,例如MOV,PUSH,CALL等。


这非常有用,但是我要寻找的是允许CPU接收和发送命令的内容?

我不明白那句话。CPU通过按地址要求从内存中“接收”指令。CPU“发送”的唯一命令(至少在简化视图中)是发送到内存的命令以传递数据,以及在I / O总线上发送命令以操作I / O设备。
Daniel R Hicks

任何CPU的核心都是某种逻辑,这些逻辑(实际上)被硬连接起来以运行一个简单的过程:从指令地址寄存器中获取值,将其发送到内存,检索内存返回的指令,然后将其塞入更多内存中。硬接线逻辑的复杂嵌套,可“理解”指令的含义以及如何执行该指令。哦,然后在某个地方增加指令地址寄存器。
Daniel R Hicks

读者可能对以下问题感兴趣:计算机如何工作?计算机科学上
拉斐尔

Answers:


88

当计算机解释汇编级指令时,这些指令将转换为它们的等效二进制文件,以供CPU读取。当CPU执行指令时,它将指令的操作码部分解释为单独的“微程序”,其中包含等效的微代码。如您所知,完整的汇编指令由操作码和与之相关的所有适用数据组成(如果需要)(例如,寄存器名称,内存地址)。

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

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

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


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


2
好的,我认为:)那么命令位会切换“开关”,从而使处理器对接收到的数据进行某些处理吗?
西蒙·韦贝克

4
@Simon Verbeke,完全正确。他们只需拨动开关即可引导处理器中的电信号流(也可以引导电信号重新加载更多命令!)。开关类比是好的,因为所有内容都是数字的(逻辑1/0或true / false)。众所周知,逻辑电平是实际电压。由工程师决定是0还是1(例如,逻辑1可以指定为2伏以上)。
突破

1
编译器或汇编器将“二进制等效指令”简化为所有内容的称为“操作码”。如果您看一下RISC体系结构(如MIPS或ARM)的操作码结构,您会发现操作码中的各个位如何映射到特定操作。英特尔由于其长期性和不断扩展的趋势而不再具有简单的映射结构。
LawrenceC

3
不,我说的是由于x86架构的长寿性和一次又一次的扩展,操作码中的各个位到微操作的映射并不像MIPS或ARM中那样干脆整齐在一定程度上(例如,参见d.umn.edu/~gshute/spimsal/talref.html,英特尔操作码就是这样)。我认为1978
LawrenceC

5
应该注意的是,只有一些 CPU是经过微码处理的。一些(大多数是较小的设备)直接在汇编操作码下操作。这取决于架构。
假名称

37

处理器并不真正“知道”命令是什么。这些命令只是二进制模式,导致处理器执行我们解释命令所要表达的意思。

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

这有点像您在问,当您踩刹车时,汽车如何知道会减速。汽车不知道,制动踏板恰好间接控制着硬垫如何压在车轮上。


5
与汽车刹车踏板相似。
rjmunro

10

以指示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将其赋予特殊含义,然后采取相应的行动。


2
还值得注意的是,对该特定位模式分配助记符“ mov”是完全任意的。从原则上讲,我可以编写一个汇编程序,将该指令称为“ oof”,除了很难记住之外,它也可以正常工作。
dmckee 2011年


4

在最低的最低级别上,CPU所能做的就是添加。从加法中,它可以减去,相乘和除法(请参阅这些只是以不同的方式进行加法)。CPU通过将添加的内容应用于内存地址来使用它在内存中移动数据。

请记住,尽管这是最低级别的。实际上,CPU确实以微码的形式“理解”某些命令。参见Breakthrough的答案,写得很好。


7
逻辑运算(例如AND,OR,NOT)以及位移位比加法更基本。实际上,可以通过这些操作来表示加法。实际上,有分立的IC(Texas Instruments LS系列)除了执行这些操作外什么也不做,并且有可能构建出某种类型的CPU。Google的“乒乓示意图”,以了解如何在没有CPU的情况下制作游戏。
LawrenceC

我的意思是从更多软件的角度来看:)是的,在硬件/逻辑方面,您拥有大量的NAND和NOR门。好点子。
n0pe 2011年

2

我在developers.stackexchange.com上提供了相关的答案,请参阅计算机如何工作?在这里,我简要地介绍了有关计算机如何解释指令到移动电子的所有内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.