Sim*_*eke 73 cpu computer-architecture cpu-architecture
处理器如何“知道”不同命令的含义?
我正在考虑汇编级命令,如 MOV、PUSH、CALL 等...
Bre*_*ugh 87
当计算机解释汇编级指令时,这些指令将转换为它们的二进制等价物供 CPU 读取。当 CPU 执行指令时,它会将指令的操作码部分解释为单独的“微程序”,其中包含它们的微码等价物。如您所知,一条完整的汇编指令由操作码和随附的任何适用数据组成(如果需要)(例如寄存器名称、内存地址)。
微码指令是非常低级的(比汇编更是如此),并控制控制微处理器中逻辑流的实际数字信号。例如,一条微代码指令可以用新值更新条件代码寄存器标志,或者将 CPU寄存器与ALU单元之一连接。更复杂的任务是可能的,但这向您展示了微码用于什么的一般概念。
从编译到执行的一般流程如下。汇编指令被组装(变成它们的二进制等效 0 和 1,或从现在开始,逻辑信号)。这些逻辑信号依次由 CPU 解释,并转化为更底层的逻辑信号,引导 CPU 的流程执行特定指令。这可能需要一个或多个时钟周期,具体取决于处理器的体系结构和设计(大多数处理器参考手册会告诉您执行特定指令需要多少个时钟周期,例如这条指令)。
所有这一切都是通过硬编程微代码(物理地嵌入处理器中的某种ROM 中,在制造过程中设置)完成的,它引导流通过实际的低级逻辑门。这提供了抽象汇编指令和处理器中的物理电气逻辑之间的接口。
因此,总而言之,处理器指令是由处理器组装和加载的。然后处理器将使用这些指令来查找与该特定指令对应的微程序(以微代码的形式),这就是“实际”执行指令的内容。一旦执行了特定指令的微代码(可能需要一个或多个时钟周期),处理器就会执行微代码以获取下一条指令,并且循环重复。
小智 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 将其关联一个特殊的含义,然后进行相应的操作。
推荐阅读:
还可以查看CS152:加州大学伯克利分校的计算机体系结构和工程的课程笔记,这是一门学生实现 CPU 的课程。
如果你在谷歌上搜索“自制 CPU”,你会发现很多好东西。