CPU是怎样执行指令的






























抓取指令 指令是什么?指令在哪里?CPU将抓取到的指令放在哪了?
PC计数器增加 什么是PC计数器?PC计数器保存的是什么?PC计数器自增后指向哪里?
解码指令 指令为什么需要被解码?指令是如何被解码的?
抓取操作数 操作数是什么?操作数在哪里?抓取后将他们放在哪里?
执行操作 CPU是如何执行操作的?
保存结果 结果是什么?从哪里得到?保存到哪里?
重复上述步骤 循环什么?从哪里开始循环?

下面以实际的代码片段来分析一下每个步骤的执行

基本的寄存器

  • PC: Program Counter 程序计数器 保存CPU当前执行的指令的地址
  • IR:Instruction Register 指令寄存器 保存CPU抓取的指令
  • ALU:算术逻辑单元,接受两个或者一个输入,产生一个输出,可以执行简单的逻辑操作
  • A,B,C:存放数据的寄存器

假设我们这里用c来写这样一行代码

float result=50.00*0.01

那么经过编译器后,这行代码会产生多句汇编代码,汇编器又会将汇编代码转化成二进制的机器代码,机器代码是可以直接被CPU执行的



CPU和RAM

为了便于理解,我们将RAM中保存的机器指令用符号表示

1.  在初始时,PC保存着指令100(指令的地址)  
2.  CPU从指令内存中抓取指令100(LOAD A,2000),存放到指令寄存器IR中
3.  PC计数器自增,指向下一条指令地址(104)   
4.  CPU解析指令---将地址为2000的内存数据放到寄存器A中
5.  CPU从指令内存中抓取指令104(LOAD B,2004),存放到指令寄存器IR中
6.  PC计数器自增,指向下一条指令地址(108)
7.  CPU解析指令---将地址为2004的内存数据放到寄存器B中
8.  CPU从指令内存中抓取指令108(Multiply A,B,C),存放到指令寄存器中
9.  PC计数器自增,指向下一条指令地址(112)
10. CPU解析指令---将寄存器A和B的内容相乘,结果保存在寄存器C中
11.将寄存器C中的值保存在内存地址为2008的数据块中

上面的分析是非常简化的,具体的执行流程肯定是要复杂的多,但是先了解基本概念再深入细节绝对是正确的学习姿势。在理解的过程中,把我两个抽象是很重要的

  • 指令集的概念
    指令集就好比是CPU能够看得懂的语言,如常见的Intel的IA32指令集。编译器将高级语言C,java等写成的代码编译成机制语言,也就是机器指令,对应的CPU能够读懂该指令,接着就是在寄存器,RAM之间不断的搬移数据,一般会将得到的结果写入RAM,显示器一刷新,就是我们看到的。

  • 虚拟地址的概念
    我们可以将RAM看成一大块字节数组,CPU所看到的地址都是虚拟地址,如100,真正得到硬件地址还需要操作系统的配合。

客官,捧个钱场?