购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.1 一个简单的处理器

在第1章中已经介绍了6502处理器体系结构及其一个指令子集。基于第1章中的相关内容,本节将介绍处理器(从最小的嵌入式控制器到功能最强大的服务器处理器)体系结构中通常采用的通用功能单元。

计算机系统中的核心集成电路有几个不同的名称: 中央处理器 (Central Processing Unit,CPU)、微处理器(简称为处理器)。微处理器是指实现了处理器功能的单个集成电路。本书将所有类别的CPU和微处理器统称为处理器。

6052等典型的处理器包含三种不同的功能单元:

控制部件 (control unit):负责管理处理器的整体操作,主要包括从内存中取出下一条指令,通过指令译码确定要执行的操作,以及将要执行的指令分发到合适的执行单元。

算术逻辑部件 (Arithmetic Logic Unit,ALU):执行算术运算和位操作运算的组合电路。

寄存器集 (register set):为指令提供源操作数及目的操作数,也用于暂存数据。

图3.1显示了控制单元、寄存器、ALU、内存和输入/输出设备之间的控制流和数据流。

图3.1 处理器功能单元的交互

控制单元控制处理器执行每条指令。寄存器、ALU、内存和输入/输出设备对控制单元发出的命令进行响应。

3.1.1 控制单元

现代处理器的控制单元是同步时序数字电路,其功能是对处理器指令进行解释,并通过与处理器中其他功能单元与包括内存和输入/输出设备等外部组件的交互来对这些指令的执行进行管理。控制单元是冯·诺伊曼体系结构的关键部分。

就本章而言,“内存”是指位于处理器执行单元之外的随机存取存储器(Random Access Memory,RAM)。高速缓存(Cache存储器)将在后面的章节中介绍。

常见的I/O设备有键盘、鼠标、磁盘存储器以及图形视频显示器,除此之外,还有网络接口、Wi-Fi和蓝牙无线接口、扬声器的声音输出和麦克风输入等。

当计算机系统上电时,处理器会进行一个复位操作,对内部组件进行初始化。在处理器复位过程中,会把将要执行的第一条指令所在的内存地址加载到 程序计数器 (Program Counter,PC)中。底层系统软件开发者必须配置开发工具,以生成一个代码内存映像,该映像会从处理器体系结构指定的地址处开始执行。

程序计数器是控制单元的核心组件,程序计数器保存着下一条将要执行的指令的内存地址。在指令执行周期的开始阶段,控制单元从程序计数器指定的内存单元中读取指令字,并将其装载到内部寄存器中以进行译码和执行。每条指令包含的第一个字段是操作码。基于操作码的编码,控制单元可以依据操作码之后的字段(例如,内存地址或操作数)读取内存以获取指令所需要的数据。

当控制单元完成复位并开始执行指令时,它将执行如图3.2所示的重复循环。

图3.2 指令执行周期

复位过程完成后,程序计数器中保存初始的指令地址。控制单元从内存中读取第一条指令并进行译码。在译码阶段,控制单元确定指令所需的动作。

作为译码过程的一部分,控制单元能够识别指令的类型。在图3.2中给出了两种基本的指令类型,分别是分支指令和其他类型的指令。分支指令直接由控制单元执行,会导致程序计数器的内容被分支中的目标内存地址替换。能够实现分支的指令包括条件分支指令(当分支成功时)、子程序调用、子程序返回和无条件分支(也称为跳转)指令。

在控制单元的指挥下,非分支指令由处理器电路执行。

从某种意义上来说,控制单元对非分支指令的处理与分析机中的磨机类似(参见第1章),不同之处在于,控制单元不使用旋转桶上的双头螺栓来啮合磨机的各个部分,而是用指令操作码中的译码结果来激活数字电路的特定部分,被选中的电路组件执行指令所要求的任务。

执行指令的步骤包括读写寄存器、读写内存单元、指挥ALU执行数学运算,以及其他操作。

在大多数处理器中,一条指令的执行需要经过多个时钟周期。每条指令所需的时钟周期数可能会有所不同,简单指令仅需很少的时钟周期,而复杂操作则需要多个时钟周期,控制单元的作用就是协调这些动作有条不紊地进行。

由控制单元管理的电路是由简单逻辑门电路构成的,这种电路通常由多路选择器、锁存器和触发器等复杂结构组成。控制单元逻辑经常使用多路选择器,其作用是从多个数据源中选择一个发送到目的地。

执行指令——一个简单的例子

以6502中TXA和TYA两条指令为例。TXA指令将X寄存器的内容复制到A寄存器中,TYA指令的功能与TXA类似,只不过使用Y寄存器作为源寄存器。如果分别考虑两条指令,则两条指令的实现结构如图3.3所示。

图3.3 6502 TXA和TYA指令

在图3.3所示的电路中,假设X寄存器和Y寄存器是如图2.14所示的D触发器寄存器,但在6502中它们是8位寄存器,而不是4位寄存器。多路选择器是将图2.9所示的两输入一位多路选择器复制了8份,并受到同一个选择输入端的控制。在图3.3中,粗线代表8位数据总线,细线代表单个逻辑信号。短线与粗线交叉并带有的数字8表示总线位宽(即总线中的比特数量)。

TXA指令按照以下步骤执行:

1.控制单元设置Select输入,把X寄存器的数据传送到多路选择器的输出端,从而把X寄存器的数据加载到A寄存器中。

2.在设置好多路选择器的Select输入之后,控制单元必须暂停以便将数据传送到多路选择器的输出端。

3.在多路选择器输出稳定之后,控制单元在CLK信号上升沿将X寄存器中的数据加载到A寄存器中。

当执行TYA指令时,控制单元执行相同的步骤,但是TYA指令设置Select输入以把Y寄存器的数据传送到多路选择器的输出端。

这是控制单元指令执行的一个非常简单的实例。从中可以看出,任何一条指令可能需要多个执行步骤,但可能只需用到处理器的一小部分电路。目前,在执行一条指令时,处理器中大部分电路都没有用到。在执行一条指令时,处理器中未用到的组件必须由控制单元进行协调,确保它们能够保持空闲状态。

3.1.2 算术逻辑单元

在控制单元的控制下,ALU执行算术运算和位运算。为了执行运算,ALU需要输入数据(称为操作数)和执行运算的编码,其输出为运算结果。ALU运算可以使用一个或多个处理器标志(例如进位标志等)作为输入,也可将处理器标志的状态作为输出。在6502中,ALU运算能够更新进位标志、负数标志、零标志和溢出标志。

ALU是组合电路,意味着输入端的变化将会导致输出端的异步更新,并且不保留先前的任何操作。

当执行与ALU相关的指令时,控制单元会将输入应用到ALU中,在等待信号通过ALU的传播延迟之后,将ALU输出传输到指令指定的位置。

ALU中包含执行加减法运算的加法器电路。在使用二进制补码运算的处理器中,减法运算的实现如下:通过对右操作数进行二进制补码取反运算,将得出的结果加到左操作数上。在数学上,用这种方式执行减法运算相当于将表达式A-B转换为A+(-B)。

回想一下,要实现一个有符号数的二进制补码取反运算,就是将操作数中的所有位取反并将结果加1。结合这个运算,将表示减法操作的表达式A+(-B)转换为

考察这种形式的减法运算,应将6502中的进位标志和SBC指令结合使用。在执行没有借位减法运算时,C标志提供“+1”操作。如果有借位,则和必须减1,该运算可以通过把C标志设置为0来实现。

总的来说,在6502中,减法逻辑与加法逻辑是相同的,唯一的区别就是在表达式A-B中的操作数B需要通过一组非门将8位数据进行取反之后,才能将其输入加法器中。

图3.4显示了6502中加法运算和减法运算的功能。

图3.4 6502加法运算和减法运算

与图3.3类似,图3.4是6502处理器的高度简化表示,仅描述了ADC和SBC指令中涉及的组件。在图3.4中,Select输入信号表示执行的操作是加法还是减法。其中加法需要选择多路选择器中上面的输入,而减法则需要选择下面的输入。在6502架构中,A寄存器始终保存减法运算中的左操作数。

加法器的输入是左、右操作数和C标志。当执行ADC或者SBC指令时,控制单元把右操作数作为多路选择器的数据输入,并根据指令将多路选择器的Select输入设置为适合的状态。在等待信号通过非门、多路选择器和加法器的传播延迟后,控制单元会产生一个时钟沿,将加法器的输出锁存到A寄存器和处理器标志寄存器中。

在执行ADC指令或者SBC指令时,处理器标志的设置如下:

● C:进位标志。表示在加法运算中是否产生进位(C=1),或在减法运算中是否产生借位(C=0)。

● N:负数标志。结果的第7位的值。

● V:溢出标志。有符号数运算是否发生溢出(如果发生溢出,则V=1)。

● Z:零标志。如果结果为零,则Z=1,否则Z=0。

除了对两个数字进行加减法运算外,ALU还支持多种运算。在6502中,具有两个操作数的运算通常使用A寄存器作为左操作数,右操作数要么来自一个内存单元,要么由操作码之后的立即数提供(立即数位于操作码之后的一个内存单元中)。6502中的ALU操作数和结果均为8位。6502的ALU操作如下:

● ADC,SBC:带进位加法或减法。

● DEC,DEX,DEY:将内存中的数据或寄存器内容递减一。

● INC,INX,INY:将内存中的数据或寄存器内容递增一。

● AND:对两个操作数执行按位逻辑与运算。

● ORA:对两个操作数执行按位逻辑或运算。

● EOR:对两个操作数执行按位逻辑异或运算。

● ASL,LSR:将A寄存器或内存中的数据左移或者右移一位,空位补0。

● ROL,ROR:将A寄存器或内存中的数据循环左移或者循环右移一位,并空位补C标志的值。

● CMP,CPX,CPY:两个操作数相减并舍弃结果,根据相减的结果设置N、Z和C标志。

● BIT:对两个操作数执行按位逻辑与运算,并用Z标志表示结果是否为0。此外,将左操作数的第7位和第6位分别复制到N和V标志中。

与大多数复杂的现代处理器(例如x86体系结构系列)相比,6502的ALU功能比较有限。例如,6502可以执行加法和减法运算,但对于乘法和除法运算,则需要进行重复的加减法运算来实现。对于每条移位指令,6502每次只能将数据移动或者循环移动一位。而x86处理器指令集直接实现了乘法和除法指令,且移位和循环移位指令中含有一个用于指定移位次数的参数。

ALU是必不可少的逻辑设备,可以使用硬件设计语言进行设计。下面给出了类似6502中ALU的VHDL实现:

该代码将一个简单的ALU定义为以左操作数、右操作数、操作码和C标志作为输入的组合电路,ALU的输出为运算结果和C、N、V、Z标志。

接下来,我们将介绍处理器寄存器的用途及功能。

3.1.3 寄存器

寄存器是内部存储单元,用作指令操作的源操作数和目的操作数。在处理器中,寄存器的访问速度最快,但容量却非常小。通常情况下,寄存器的位宽与处理器字长相同。

如前所述,6502处理器只有3个8位的寄存器:A、X和Y。x86有6个用于暂存数据的32位寄存器:EAX、EBX、ECX、EDX、ESI和EDI。在许多处理器体系结构中,特定的寄存器用来支持特定指令的功能。例如,在x86体系结构中,REP MOVSD指令将由ECX指明长度的数据块(以字为单位),从ESI指明的源地址开始,传输到由EDI指明的目的地址。

设计一个新的处理器体系结构时,在寄存器的数量与处理器支持的指令数量和复杂度之间进行权衡非常关键。对于一个给定的集成电路芯片尺寸和制造工艺(它们共同限制了可用于处理器的晶体管数量),向体系结构增加寄存器的数量会减少用来执行指令和其他功能的晶体管数量。相反,增加具有复杂功能的指令可能会限制寄存器可用的芯片空间。在将体系结构分为CISC或RISC时,指令集复杂度和寄存器数量之间的紧张关系就会体现出来。

复杂指令集计算机(Complex Instruction Set Computer,CISC) 处理器含有丰富的指令集,该指令集提供了多种功能,例如,能够从内存中加载操作数,执行操作并将结果保存到内存中,以上功能可以在一条指令中完成。在CISC处理器中,一条指令可能需要很多个时钟周期才能执行完成规定的功能。前面提到的REP MOVSD指令就是一个例子,这条指令的执行时间可能很长。CISC处理器的寄存器数量往往较少,部分原因是指令集逻辑电路需要占用芯片空间。x86是CISC体系结构的经典示例。

● 与CISC指令相比, 精简指令集计算机(Reduced Instruction Set Computer,RISC) 处理器的指令数量较少,其中每条指令的功能也比较简单。对保存在内存中的数据执行一个操作可能需要两条加载指令以将两个操作数从内存复制到寄存器中,然后使用一条指令执行指定的操作,最后使用一条指令将结果存储到内存中。

CISC和RISC之间的主要区别在于,RISC体系结构经过优化,能够以很高的速度执行指令。尽管在RISC处理器中,读取内存、执行操作并将结果写回内存需要用到比CISC处理器更多的指令,但对于RISC处理器而言,这些操作总的完成时间与CISC处理器可能相当,甚至更短。RISC体系结构的示例详见第10章讨论的ARM和第11章讨论的RISC-V。

与CISC相比,RISC处理器中指令集复杂度的降低是为了给寄存器留出更多的芯片空间,这通常会导致RISC处理器中具有更多的寄存器。ARM架构有13个通用寄存器,而32位的RISC-V体系结构有31个通用寄存器。

在RISC体系结构中,由于有较多的寄存器可用来保存运算的中间结果,因此减少了访问内存的次数。因为访问系统内存比访问寄存器要花费更长的时间,所以这有助于提高计算机性能。

可以将寄存器看作一组D触发器,其中每个触发器保存寄存器的一位数据。寄存器中的所有触发器均可以通过公共时钟信号来加载数据。此外,在指令的控制下,在通过多路选择器对多个潜在的数据源进行选择之后,寄存器的输入数据到达触发器。

作为使用多路选择器来选择寄存器输入的一种替代,一条指令可以从处理器内部的数据总线上加载数据到寄存器中。在这种配置下,控制单元控制内部总线以确保在加载寄存器的时钟沿期间,只有所需的数据源在驱动数据总线,此时,需要禁止其他数据源将数据传输到总线上。

下面介绍处理器指令集中的指令及其使用的寻址方式。 MtNX5hTO/MgIxxpOKYD28EMUR6RFYmeX1F0Aryn16gJoNqMzpj3AXF/ogOzZoit8

点击中间区域
呼出菜单
上一章
目录
下一章
×