处理器、内存和指令

处理器CPU

CPU是一台计算机的核心,计算机工作时,CPU不断的从内存中获取指令,并发起一些列由该指令所定义的操作,当这些操作完成后,它接着再取下一条指令,这样连续不断、循环往复。CPU完成这些动作,组成CPU的各个物理结构发挥着不同的作用,CPU包括:

  • 算术逻辑部件(ALU) 可以执行定点或浮点算术运算操作、移位操作以及逻辑操作,也可执行地址运算和转换
  • 寄存器(Register) 包括寄存器、专用寄存器和控制寄存器。通用寄存器又可分定点数和浮点数两类,它们用来保存指令执行过程中临时存放的寄存器操作数和中间(或最终)的操作结果。通用寄存器是中央处理器的重要部件之一
  • 控制部件 主要负责给各个部件发送控制信息,是各个部件在正确的时间点上执行某个动作。同时,它还负责决定在某个时间点上哪个部件有权使用总线,以免彼此发生冲突

寄存器

在处理器的底部或者四周,有大量的引脚,可以接受从外面来的电信号,或者向外发出电信号。假如我们要进行一个加法运算,被加数会通过引脚读入CPU,然后相同的引脚会输入加数。此过程寄存器就发挥作用了,被加数读入CPU后,会被寄存器电路锁住,然后相同的引脚再读加数,都读取完后,我们的引脚还可以干其他的事。寄存器是双向器件,可以从一段接收输入并加以锁存,同时,也可以产生输出。寄存器是一个存储结构,所以它也有大小,早期的计算机,只能存放4比特、8比特或16比特,分别是4位、8位和16位寄存器。现在的寄存器一般都是32位或64位,也就是可以存32比特和64比特。之所以叫寄存器,是因为数据只能在里面存一会,然后被取出送外别处,这时候寄存器也就空闲出来了(实际的场景,寄存器不会空闲,因为不断的有各种数据进到CPU)。在CPU中,寄存器的数量不止一个,就像我们刚才的加数和被加数就分别存在在了不同的寄存器。常见的主要寄存器有:

  1. 数据寄存器 其主要功能是作为CPU和主存、外设之间信息传输的中转站,用以弥补CPU和主存、外设之间操作速度上的差异
  2. 指令寄存器 保存当前正在执行的一条指令
  3. 程序计数器 用来指出下一条指令在主存储器中的地址
  4. 地址寄存器 用来保存CPU当前所访问的主存单元的地址
  5. 累加寄存器 当运算器的算术逻辑单元ALU执行算术或逻辑运算时,为ALU提供一个工作区,可以为ALU暂时保存一个操作数或运算结果,是一个通用寄存器
  6. 程序状态字寄存器 一个保存各种状态条件标志的寄存器

寄存器编号

某一个寄存器,我们需要为每个位编号,编号规则是从右到左,从0开始。比如一个8位的寄存器,从左到右编号分别为:7 6 5 4 3 2 1 0,位0是最低位,在最右边,位7是最高位,在最左边。同样的,16位寄存器编号从0-15,0-7是低字节,8-15是高字节。32位寄存器可以存4个字节,0-15为低字节,16-31为高字节。

算术逻辑部件

该部件可以完成加、减、乘、除四则运算,与、或、非、异或等逻辑操作,以及移位、比较和传送等操作。上面的累加寄存器,我们也可以看着是该部件的一部分,运算逻辑部件完成上面的这些运算后,会将结果保存在累加寄存器中。然后通过寄存器输出到其他位置(主存)。

内存

刚才做加法时,我们通过寄存器和算术逻辑部件以及控制部件完成了加法,那么寄存器中的数是从哪里来的呢?答案是存储器,刚才的寄存器也是一种存储器,但是它的存储能力很有限,但是它的优点是读写的速度快(对于CPU)。于是我们需要另外一种存储器,它就是内存,它可以存更多东西相比于寄存器。内存是按照字节来组织的,单次访问的最小单元是1字节(1 Byte),这是内存最基本的存储单元。

每个存储单元中,各位的编号分别是0-7。每个字节对应着一个地址,从0000H开始,注意这里是16进制,也就是说地址可以从0000H到FFFFH,说明这个内存的容量是65536字节(FFFFH = 65536D)。处理器可以从内存中读取或写入数据,这个时候,处理器需给出一个地址,同时还要指明是读取还是写入,如果是写入,还要提供待写入数据。图中的字长控制表示本次访问的字长是8位还是16位或者64位。如果某一次访问内存给出的字长是16,地址是0002H,那么会访问0002H和0003H,0002H作为低8位,0003H为高8位。

指令和指令集

处理器的制造者除了制造出CPU,还要指定某些数,这些不同的数可以指示处理器进行不同的操作,这就叫着指令。指令存放在内存中,一条接着一条。CPU读取到不同的指令,就进行不同的动作。指令由操作码和操作数组成,可以没有操作数。操作码告诉CPU它是做什么的,以及怎么做。

如图中,如果我们从0000H位置开始读取了一条指令B85D00,首先我们读取到指令B8,它就是一个指令的操作码,操作码B8是让CPU进行传送,并且是传送到寄存器RA中,传送的数据就是操作数,它紧跟在操作码后,即0001H和0002H位置的5D00,该操作数直接包含在指令中,我们成为立即数。所以这条指令CPU执行完成后,005DH就被传送到了RA寄存器中了。注意在读取的时候,我们可能是一个字节一个字节读取,也可能是两个字节两个字节读取,这与CPU和内存之间的数据线连接方式有关。如果是两个字节读取,那么它是以5D为低八位还是00呢,这和不同的CPU有关,如果是高字节位于高地址、低字节位于低地址,则称为低端字节序。相反则称为高端字节序

第一条指令的操作码只有一个字节8B,有时,一个字节的操作码不够,还需要两个字节来表示,如第二条指令的8B1E003F,它的操作码是8B1E,同样8B表示传送,1E表示寄存器(RB寄存器),8B1E003F这条指令的意思就是将003F地址单元的数传送到寄存器(003F地址的内容不会变,依然是1002,相当于复制),这里的操作数是一个地址003F,而第一条的操作数是一个数,所以003F不是立即数,而是地址。F4以下的指令旁边都有解释。注意F4这条指令只有操作码,没有操作数,它表示让CPU停止工作。

Intel 8086处理器

接下来看一个比较古老的处理器,因为古老,所以它的地位也相当高,对于Intel公司,他制造新的CPU时,需要考虑兼容老的CPU,所以我们以Intel 8086处理器来加深对处理器的认识。8086共有8个16位通用寄存器,分别命名为AX BX CX DX SI DI BP SP,前四个寄存器又可以分成两个8位的寄存器,所以总共8个8位寄存器:AH AL BH BL CH CL DH DL,这样我们可以进行8位也就是一个字节的数据的传输或运算,而且当我们使用其中一个8位寄存器时,不影响另一个,比如使用AL时,不会影响AH。

这里先只做简单的介绍,后面我们会已该处理器为基础讲解其他知识。

坚持原创分享,您的支持将鼓励我不断前行!