处理器如何“知道”不同命令的含义?
我正在考虑汇编级别的命令,例如MOV,PUSH,CALL等。
处理器如何“知道”不同命令的含义?
我正在考虑汇编级别的命令,例如MOV,PUSH,CALL等。
Answers:
当计算机解释汇编级指令时,这些指令将转换为它们的等效二进制文件,以供CPU读取。当CPU执行指令时,它将指令的操作码部分解释为单独的“微程序”,其中包含等效的微代码。如您所知,完整的汇编指令由操作码和与之相关的所有适用数据组成(如果需要)(例如,寄存器名称,内存地址)。
微码指令的级别极低(在汇编时更是如此),并控制实际的数字信号,这些信号控制着微处理器中的逻辑流。例如,一条微代码指令可以用新值更新条件代码寄存器标志,或者将CPU 寄存器与ALU单元之一连接。可能执行更复杂的任务,但这向您展示了微代码的用途的一般概念。
从编译到执行的一般流程如下。汇编指令已被汇编(转换为二进制等效值0和1,或从现在开始转换为逻辑信号)。这些逻辑信号依次由CPU解释,并转换为更低电平的逻辑信号,这些逻辑信号指示CPU的流程执行特定的指令。这可能需要一个或多个时钟周期,具体取决于处理器的体系结构和设计(大多数处理器参考手册会告诉您执行一条特定指令(例如该指令)需要多少个时钟周期)。
所有这些都是通过硬编程的微代码(物理地嵌入到处理器中的某种ROM中,在制造过程中设置的)完成的,该微代码将流引导通过实际的低级逻辑门。这在抽象汇编指令和处理器中的物理电子逻辑之间提供了接口。
因此,总而言之,处理器指令是由处理器汇编和加载的。然后,处理器将使用这些指令来查找与该特定指令相对应的微程序(以微代码的形式),这是“实际”执行该指令的过程。一旦执行了特定指令的微码(可能需要一个或多个时钟周期),处理器便会执行微码以获取下一条指令,并重复该周期。
以指示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将其赋予特殊含义,然后采取相应的行动。
建议阅读:
另请参阅 UC Berkeley的CS152:计算机体系结构和工程课程的注释,该课程中学生可以实现CPU。
如果您用Google搜索“自家的CPU”,您会发现很多好东西。
在最低的最低级别上,CPU所能做的就是添加。从加法中,它可以减去,相乘和除法(请参阅这些只是以不同的方式进行加法)。CPU通过将添加的内容应用于内存地址来使用它在内存中移动数据。
请记住,尽管这是最低级别的。实际上,CPU确实以微码的形式“理解”某些命令。参见Breakthrough的答案,写得很好。