计算机组成原理 | 指令系统

75 阅读19分钟

指令系统

概述

计算机的工作就是反复执行指令,指令是用户使用计算机与计算机本身运行的基本功能单位。

不同层次的用户使用不同的程序设计工具:

  • 微程序设计用户使用微指令
  • 一般机器级用户使用机器指令
  • 汇编语言级用户使用汇编语言指令
  • 高级语言级用户使用高级语言指令

高级语言指令和汇编指令属于软件层次,而机器语言指令和微指令属于硬件层次。软件程序的指令需要“翻译”成机器语言指令后才能被计算硬件识别并执行。

机器指令是计算机硬件于软件的界面,也是用户操作和使用计算机硬件的接口。

完整的指令系统应满足的要求

要求解释
完备性完备性即要求所设计的指令系统种类齐全、功能完备、能够编写任何可计算的程序; 但是指令系统的功能复杂度和硬件复杂度有关,需折中考虑
规整性规则性主要包含对称性和均齐性。 对称性是指寄存器和存储单元都可以被同等对待,所有指令都使用各种寻址方式; 均齐性是指指令系统提供不同数据类型的支持,方便程序设计, 如算术运算指令能支持字节、节和双字整数运算,也能支持十进制和单、双精度浮点运算等。
有效性有效性是指令编写的程序能高效地运行,方便硬件实现和编译器实现,程序占用的存储资源少,运行效率高。
兼容性系统计算机新一代的指令系统能兼容旧的指令系统,使旧一代计算机上开发的软件能兼容新计算机,正常运行。
可扩展性指令格式中的操作码要预留一定的编码空间,以便扩展指令功能

指令格式

指令是计算机中传输控制信息的载体,指令格式是用二进制代码表示指令的结构。

指令格式要明确指令处理什么操作数,对操作数进行何种操作,通过何种方式获取操作数等信息。

计算机组成原理-指令格式.drawio

通过何种方式获取操作数通常由寻址方式字段决定,寻址方式字段决定地址码中操作数存放的位置和访问方式,寻址方式字段可以在地址码字段中。

指令字长度

指令长度是指一条指令所包含的二进制,也称指令字长。可根据字节是否固定分为定长变长指令系统两类。

定长指令系统的指令长度固定,结构简单,有利于CPU取指令、译码和指令顺序寻址,方便硬件实现。但定长指令系统存在平均指令长度较长、冗余状态较多、不容易扩展的问题,精简指令系统计算机中采用定长指令系统。

变长指令系统的指令长度可变,结构灵活,冗余状态较少,平均指令长度较短,可扩展性好。但指令变长也会给指令和译码带来诸多不便,取指令过程涉及多次访存操作,下一条指令的地址必须在指令译码完成后才能确定,大大增加了硬件控制系统的设计难度。

指令最终要存储到存储器中,无论是定长指令还是变长指令,指令字长都应该是字节的整数倍数,根据指令字长和机器字长的关系,可将指令分为半字长单字长多字长指令3类。

指令字长越长,占用主存空间越大,需要的访问时间越长:

  • 对于半字长指令,CPU访问一次主存可以读取两条;
  • 对于单字长指令,CPU访问一次主存只能读取一条;
  • 对于双字长指令,CPU则需要两个存储空间才能完成取指令→多字节指令的取指令速度慢,会影响指令的执行速度,但多指令能提供足够长的操作码字段和地址码字段,从而可以设计更多的指令格式,还能扩大寻址范围。

指令地址码

计算机组成原理-指令地址码.drawio

三地址指令:具有两个操作对象的运算叫双目运算,其指令包括两个源操作数和一个目的操作数。

image.png

双地址指令:同样是为双目运算类而设的,只是为了压缩指令的长度,将运算结果之间存放在第一操作数地址中

image.png

单地址指令:单地址指令只有一个地址码字段,常见的单地址有:

  • 单目运算类指令,如逻辑运算的求反操作;
  • 隐含操作数双目运算类为了进一步缩短指令长度,将双目运算类指令的一个操作数约定隐含与CPU的某个寄存器(如累加器AC)中

零地址指令:零地址的指令格式中只有操作码而没有地址码字段,常见的零地址指令有:

  • 指令本身不需要任何操作数,如只是为了占位和延时而设置的空操作指令NOP、等待指令WAIT、停机指令HALT、程序返回指令RET
  • 指令需要一个操作数,但该操作数隐含与CPU的某个寄存器中

指令操作码

操作码的长度即操作码字段包含的二进制数,有定长操作码变长操作码两种。

  • 定长操作码不仅指操作码的长度固定,而且在指令中的位置也是固定的;
  • 变长操作码中操作码的长度可变,而且操作码的位置也不固定,采用变长操作码可以有效压缩指令操作码的平均长度。

可以采用扩展操作码技术来实现变长操作码,其基本思想是操作码的长度随地址码数目减少而增加。

以下是简单的扩展码,这类指令长度固定,不同操作数指令的操作码长度不一致:

计算机组成原理-扩展操作码.drawio

指令寻址方式

运行程序之前把指令和数据(或称操作数)存放在主存的相应地址单元中,运行程序时,不断地从主存指令和数据,由于主存是地址访问的存储器,只有获取指令和操作数在主存的地址后,CPU才有访问所需要的指令和数据。寻址方式就是寻找指令或操作数有效地址的方法。

顺序寻址方式

程序中的机器指令序列在主存中往往按顺序存放,程序按照指令顺序执行的。

因此,如果知道第一条指令的有效地址,通过增加一条指令所占用主存单元数量,就很容易知道下一条指令的有效地址,这种计算指令有效地址的方式称为指令的顺序寻址方式。

采用顺序寻址方式时的下一条指令的有效地址应通过PC+1得到;其中“1”是指一条指令的字节长度。

计算机组成原理-顺序寻址.drawio

跳跃寻址方式

如果程序出现分支或转移,就会改变程序的执行顺序,此时就要采取跳跃寻址方式。

跳跃指下一条指令的地址不一定能通过P+1获得,最终的地址由指令本身及指令需要测试的条件决定。

计算机组成原理-跳跃寻址.drawio

操作寻址方式

操作数的来源基本有三种情况:

  • 操作数直接来自指令地址字段;
  • 操作数存放在寄存器中,即寄存器操作数,操作数地址隐含表示或显示表示;
  • 操作数存放在存储器中,即存储器操作数。

常见的寻址方式有:立即寻址、直接寻址、间接寻址、寄存器寻址、寄存器间接寻址、相对寻址、变址寻址、基址寻址和堆栈寻址。

计算机组成原理-寻址方式.drawio

假设最终的操作数为S,有效地址为EA,则S=(EA),括号表示访问EA的主存单元或寄存器的内容。

I字段又称为寻址方式特征码,I字段的位数与需要支持的寻址方式有关,寻址过程就是把I字段和D字段的不同组合转换成有效地址的过程。

立即寻址

立即寻址方式中,I字段为表示立即寻址的编码,假设I=000D字段就是操作数本身,也就是S=DS=D有效地址的内容。

立即寻址时操作数与指令一起存放,取指令时操作数随指令一起被送到CPU内的指令寄存器中。指令执行时可直接从指令寄存器中获取操作数,无须访问其他存储单元。

计算机组成原理-立即寻址.drawio

立即寻址取操作数快,但其形式地址字段D的位宽有限,因此操作数能表示的范围有效。

立即寻址一般用于变量赋初值,例如:

Mov EAX,2008H //功能是为寄存器EAX赋初值2008H

直接寻址

直接寻址方式时操作数在主存储器中,操作数地址是由形式地址字段D直接给出,也就是EA=D。假设将寻址方式码I设置为001,注意不同寻址方式I会设置不同的编码。

计算机组成原理-直接寻址.drawio

例如:Mov EAX, [2008H]功能是将2008H主存单元的内容送入寄存器EAX中 。

直接寻址的特点:

  • 地址直观,不需要通过计算即可直接从指令中获得操作数的有效地址;
  • CPU根据该有效地址访问主存获得操作数;
  • 直接寻址方式存在的不足。寻址范围受限于指令中直接地址的二进制位数;数据地址存在于指令中,程序和数据在内存中的存放位置受到限制,灵活性不够。

寄存器寻址

寄存器寻址时操作数在CPU的某个通用寄存器中,形式地址D表示通用寄存器的编号,寄存器中的内容即所要的操作数。

计算机组成原理-寄存器寻址.drawio.png

D表示通用寄存器的编号;寄存器的内容即所要的操作数。

EA=D,S=R[D]表示将通用寄存器组R看作数组D表示数组下标。

寄存器寻址具有下列优点:

  • 获得操作数不需要访问主存,指令执行速度快;
  • 所需要的地址较短,有利于缩短指令的长度,节省存储空间;

寄存器寻址也是计算机中常用的寻址方式,但由于CPU中寄存器数量有限,因此这种寻址方式不能为操作数提供大量的存储空间。

例如:Mov EAX,ECX表示将寄存器ECX中的内容送入寄存器EAX中。

间接寻址

间接寻址是相对直接寻址而言的,形式地址D给出的不是操作数的有效地址,而且操作数的间接地址。

也就是说,D指向的主存单元的内容才是操作数的有效地址,D只是一个间接地址,此时EA=(D)

计算机组成原理-间接寻址.drawio.png

寄存器间接寻址

寄存器间接寻址时操作数编地址存放在寄存器中,实际操作数存放在主存中,形式地址字段D为存放操作数地址的寄存器号,EA=R[D]。以寄存器的内容为地址访问主存单元,即可得到所需的操作数。

计算机组成原理-寄存器间接寻址.drawio

由于操作数地址存放在寄存器中,因此指令访问操作数时,只需访问一次内存,比间接寻址少访问一次。

寄存器间接寻址可减少主存访问次数提高编程灵活性,还可以扩充寻址范围。

例如:Mov AL, [EBX],假设EBX=2010H,主存2010H单元的内容为60H,该指令执行后寄存器AL中的内容为60H

相对寻址

相对寻址说把程序计数器PC中的内容加上指令的形式地址D,形成操作数的有效地址,因此EA=PC+D, S=(PC+D)

计算机组成原理-相对寻址.drawio

因为取指令过程中PC会修改,而计算操作数的有效地址则在译码分析或执行阶段完成,所以PC的内容应为PC的当前值,也就是下一条将要执行指令的地址值,所以有EA=PC+1+D,其中1是指一条指令的字节长度。

相对寻址的优点是编程时只需确定程序内部操作数与指令之间的相对距离,而无须确定操作数在主存中的绝对地址,便于实现程序浮动。除可用于访问内存外,相当寻址也可以用于分支转移类指令,实现相对跳跃转移,有利于程序在主存中灵活定位。

例题:

计算机指令字长为定长16位,内存按字节寻址,指令中的数据采用补码表示,且PC值在取指令阶段完成修改。

(1)若采用相对寻址指令的当前地址为2003H,且要求数据有效地址为200AH,则该相对寻址指令的形式地址字段的值为多少?

答:相对寻址指令地址为2003HPC在取指后修改,则取指后PC=2003H+2H=2005H,因为指令长度为16位占两个主存单元,所以D=200AH-2005H=5H

(2)若采用相对寻址指令的当前地址为2008H,且要求数据有效地址为2001H,则该相对寻址指令的形式地址字段的值为多少?

答:相对寻址地址为2008H,取指后PC=2008H+2H=2010H,所以D=2001H-2010H=F7H

变址寻址

在变址寻址方式下,指定一个寄存器来存放变化的地址,这个寄存器称为变址寄存器,此时形式地址字段D应该增加一个变址寄存器编号字段X

变址寄存器X与形式地址D之和即为操作数的有效地址,也就是EX=R[X]+D

计算机组成原理-变址寻址.drawio.png

变址寻址中变址寄存器提供修改量,而指令提供基准量。寄存器X的内容可变,而D的值一经设定,在指令执行过程中保持不变。

变址寻址主要应用于对线性表之类的数组元素进行重复的访问,此时,只需将线性表的起始地址作为基值赋给在指令的形式地址,使变址寄存器的值按顺序变化,即对线性表中成块数据进行相同的操作,不需要修改程序,极大地方便了程序设计。

例:Mov EAX,32[ESI]功能是将变址寄存器ESI的值加上偏移量32来形成地址访问主存,并将结果送到EAX中。

基址寻址

在基址寻址方式下,指定一个寄存器来存放基地址,这个寄存器称为;同时用指令的形式地址字段D存放一个变化的地址值。

基址寻址和变址寻址的区别是基址寄存器的值一经过设定,在程度执行过程中不再改变;可以通过不同的形式地址D访问不同的存储地址,这一点与变址寻址相反。

基址寻址面向系统,用于程序的重定位,也能扩展寻址空间。变址寻址是面向用户的,主要用于解决程序循环问题,变址寄存器中的内容由用户设置。

偏移寻址:以某寄存器的内容与指令中的形式字段之和作为有效地址。

相对寻址、变址寻址和基址寻址都称为偏移寻址。

堆栈寻址

堆栈以先进后出的方式存储数据。寻找存放在堆栈中操作数地址的方法称为堆栈寻址

分为存储器堆栈寄存器堆栈

  • 存储器堆栈:在内存空间中开辟堆栈区
  • 寄存器堆栈:将寄存器作为堆栈区

无论是哪种类型的堆栈,数据的存取都通过栈顶进行。堆栈操作分为两种——进栈出栈。进栈是将指定数据传送到堆栈中;出栈是将栈顶的数据传送给指定的寄存器。

(1)存储器堆栈

计算机组成原理-存储器堆栈.drawio

内存基于地址访问,所以需要设置一个堆栈指针寄存器(SP)指向栈顶单元。

若主存按字节编址,以字节为单元出进栈,则进栈时SP向低地址方向变化。

(2)寄存器堆栈

为满足用户对堆栈速度的要求,采用寄存器堆栈。

寄存器不基于地址访问,所以不需要设置堆栈提示器

计算机组成原理-寄存器堆栈.drawio

寄存器堆栈与存储器堆栈不同:

  • 寄存器堆栈定固定不动,而存储器堆栈栈顶随着堆栈操作而移动
  • 进行堆栈操作时,寄存器堆栈的数据移动,而存储器堆栈中的数据不动
  • 寄存器堆栈速度快,但容量有效;存储器堆栈速度较慢,但容量很大
  • 寄存器堆栈必须采用专用堆栈指令进行控制;存储器堆栈规则不一定

其他寻址

其他寻址方式有:

(1)变址+间接寻址方式

先进行变址再进行间接寻址,即把变址寄存器X中的内容与指令中的形式相加作为操作数地址的指示器.

例如EA=(R[X]+D)

(2)间接+变址寻址方式

先进行间接寻址再进行变址寻址,即根据指令中的形式地址D的内容访问存储器得到偏移量,然后将其与变址寄存器X中的内容相加作为操作数地址的指示器。

例如EA=R[X]+(D)

(3)相对+间接寻址方式

先进行相对寻址再进行间接寻址,即吧程序计数器PC中的内容与指令中的形式地址D相加,再进行间接寻址。

例如EA=(PC+D)

CISC和RISC

CISC为复杂指令集计算机(Complex Instruction Set Computer)

RISC为精简指令集计算机(Reduced Instruction Set Computer)

复杂指令系统计算机

指令系统越来越庞大、复杂,某些计算机中的指令多达数百条,同时寻址方式的种类也很多,称这类计算机为复杂指令系统计算机(CISC)

Intel x86,IA64指令系统是典型的CSIC指令系统。

CISC指令集功能设计:面向目标程序增强指令功能:增强运算性能指令功能;提高传送指令功能;增加程序控制指令功能。

CISC具有的特点

  • 指令系统复杂庞大,指令数目一般多达二三百条
  • 寻址方式多
  • 指令格式多
  • 指令字长不固定
  • 对访存指令不加限制
  • 各种指令使用频率相差大
  • 各种指令执行时间相差大
  • 大多数采用微程序控制器

CISC结构存在缺点:

  • 各种指令的使用频率相差悬殊
  • 指令系统的复杂性带来了计算机体系结构的复杂性,这不仅增加研制时间和成本,而且还容易造成设计错误
  • 指令系统的复杂性给VLSI设计增加了很大负担,不利于单片集成
  • 复杂的指令需要复杂的操作,因而运行速度慢
  • 由于各指令功能不均衡,不利于采用先进的计算机体系技术(如流水线技术)来提高系统的性能

精简指令系统计算机

精简指令系统计算机(RISC)体系结构的基本思路是:针对CISC指令系统指令种类太多、指令格式不规范、寻址方式太多的缺点,通过减少减少指令种类、规范指令格式和简化寻址方式来方便处理器内部的并行处理,从而大幅度地提高处理器的性能。

RISC是在继承CISC的成功技术并克服CISC缺点的基础上产生并发展起来的。

RISC特点

  • 选取使用频率最高的一些简单指令,并在此基础上补充一些有用但不复杂的指令,避免使用复杂指令
  • 大多数指令在一个时钟周期内完成
  • 采用load-store结构。由于访问主存指令花费时间较长,因此在指令系统中应尽量减少访问主存指令,只允许LOAD(取数)和STORE(存数)两种指令访问主存,其余指令只能对寄存器操作数进行处理
  • 采用简单的指令格式和寻址方式,指令长固定
  • 固定的指令格式。指令长度、格式固定,可简化指令的译码逻辑,有利于提高流水线的执行效率
  • 面向寄存器的结构。为减少访问主存,CPU内应设置大量的通用寄存器
  • 采用硬布线控制逻辑,这样可以打打提高速度
  • 注重逻辑的优化,力求有效地支持高级语言程序。为高级语言程序生成优化的代码
  • 充分利用流水线来提高性能