计算机组成原理-7-指令系统

7. 指令系统


课程回顾

图7-1 课程内容

机器:介绍计算机的基本硬件。

  • 【第一章】介绍了计算机的基本组成结构。并以一个程序为例,介绍了计算机的程序和指令的执行过程。
  • 【第二章】介绍了计算机的发展历程,科普性质。
  • 【第三章】介绍了系统总线,总线将计算各各个部分连接在一起,使其协调工作。
  • 【第四章】介绍了存储器的工作原理、存储器和CPU之间的相互连接。
  • 【第五章】介绍了IO接口、三种控制方式、IO设备。

数字:CPU中的ALU如何完成计算。

  • 【第六章】介绍了数据的表示方式、运算方法、逻辑电路。

CPU:具体介绍内部结构。

  • 首先会介绍计算机的“硬件”和“软件”之间的接口——计算机的指令系统。
  • 然后进一步介绍CPU内部的结构和功能。重点将介绍“中断部分”的设计。
  • 核心是讲解CPU中控制器的工作原理和设计方式。也就是“排队逻辑”、“寄存器和解码器”、“控制存储器”。

整体思路:自顶向下。

7.1 机器指令

执行操作
硬件具体执行
返回硬件状态
返回执行结果
软件
指令系统
硬件
图7-2 指令系统在计算机中的地位

  要想在计算机上运行高级语言程序、汇编语言程序,必须利用编译程序、汇编程序,将高级语言指令/汇编指令转换成由01代码组成的“机器指令”,才能够在计算机硬件中按序执行。“机器指令”就是计算机系统的CPU能够直接识别和执行的操作命令,一个处理器能够执行的所有指令的集合称为“指令集”。“指令集”就是计算机系统软件和硬件的交界面,其设计的过程涉及到很多“计算机体系结构”知识,但本课程只负责具体的实现,下面给出指令的基本格式:

图7-3 指令的一般格式
  • 上图中,操作码的字段连续,实际上也可以分开字段存放。

  “操作码”主要反映机器做什么操作、对什么类型的数据做操作、操作数的寻址方式等信息。比如IBM 360中的8种加法指令就指出数据类型,如浮点数加法、尾数基值2进制/16进制、定点数加法等等。“操作码”又分为“固定长度操作码”、“可变长度操作码”:

  1. 固定长度操作码:所有操作码放在一个字段内,指令译码时间短。适用于指令字长较长计算机、RISC中,如 IBM 370 操作码8位。
  2. 可变长度操作码:操作码分散在指令字的不同字段中,可以压缩操作码的平均长度,比如常用的x86处理器。主要有两种方法,要么保留一个编码的码点作为扩展的标志,要么利用操作码中的某一位作为扩展的标志。

下面介绍“保留编码码点作为扩展标志”的可变长度操作码——扩展操作码技术,操作码的位数随地址数的减少而增加。下图中,OP是操作码,A1、A2、A3 都是地址码,长度均为4位,指令字长总计16位。然后将 1111 作为扩展标志,若当前四位为 1111,则实际的操作码在下一段。显然短操作码一定不能是长操作码的前缀

图7-4 扩展操作码——保留1111作为扩展标志
  • “三地址指令(二地址指令/一地址指令)”每减少 1 个,便可以增加 24 个“二地址指令(一地址指令/零地址指令)”。
  • 常用指令用短操作码表示、不常用指令用长操作码表示。借鉴了Huffman编码的思想,可以加快指令查找速度。

  “地址码”给出了操作码要操作的操作数地址。减少地址码个数来增加地址码字段长度,进而增加寻址范围。比如下图中固定指令字长为32位、操作码为8位,不同的地址码个数对应的寻址空间和访存次数如下:

图7-5 四地址指令、三地址指令、二地址指令、一地址指令
  • 【四地址指令】最全面的存储格式。每次执行需要访存四次——当前操作码及下一操作码、第一操作数、第二操作数、结果。地址空间太小,几乎不可能用于访存。
  • 【三地址指令】实际上会用CPU中的控制器会使用寄存器 “计数器PC” 的自增/减运算来指明下一指令,于是 A4 所占比特位被释放,寻址范围扩大到 256。还是需要四次访存。
  • 【二地址指令】若进一步将运算结果 A3 保存在原操作数 A1或A2 中,于是再释放 A3 所占比特位。若将结果默认保存在 ACC寄存器中,那么只需要三次访存。
  • 【一地址指令】若某个操作数以隐含的方式保存在 ACC 中,那么可以再释放一个操作数所在的比特位。只需指明除了 ACC 中操作数外,另一个需要运算的操作数地址即可。此时只需要两次访存——读取指令、读取操作数。
  • 【零地址指令】无需地址码的指令。可以是有隐含寻址的指令,比如将 ACC 进行取反、清零、判0/1等。也可以是堆栈类指令,比如将栈顶两元素求和并保存在栈顶。

注:PC见“1.3节-计算机的工作步骤”介绍的CPU控制器。

  最后总结一下,“指令字长”取决于操作码的长度、地址码的长度、地址码的个数(若指令字长可变)。若 指令字长固定 时,通常指令字长≤存储字长;若 指令字长可变,通常按字节的倍数变化。当指令的地址字段为寄存器时,指令执行阶段不访存。当用一些硬件资源代替指令字中的地址码字段后:

  • 可扩大指令的寻址范围:如上图7-5。
  • 可缩短指令字长:若上图7-5中,不增加地址码长度,而是直接删除,就可以缩短指令字长。
  • 可减少访存次数:如上图7-5。

7.2 操作数类型和操作类型

  通常,操作数类型 有如下四种:

  1. 地址:绝对地址是无符号整数、相对地址是有符号数。
  2. 数字:最常见,定点数、浮点数、十进制数
  3. 字符:用ASCII码表示。
  4. 逻辑数:用于逻辑运算。

  假设内存按字节编址,存储字长64位(双字),机器字长32位(单字),于是 数据在存储器中的存放方式 有如下三种:

  1. 从任意位置开始存储:优点是不浪费存储资源。缺点是除了访问一个字节之外,访问其它任何类型的数据,都可能花费两个存储周期的时间;并且读写控制比较复杂,需要判断数据是否为跨字节存储。

  2. 从一个存储字的起始位置开始访问:优点是无论访问何种类型的数据,均可在一个周期内完成,读写控制简单。缺点是浪费了宝贵的存储资源

  3. 边界对准方式:从地址的整数倍位置开始访问,数据存放的起始地址是数据长度(按照编址单位进行计算)的整数倍。本方案是前两个方案的折衷,既可以在一个周期内可以完成存储访问,也不至于特别浪费存储空间。

  “汇编语言程序设计”课程中介绍过 操作类型,这里只给出简单介绍:

  1. 数据传送:从数据源传送到目的,或者置“1”,清“0”(特殊的传送指令)。
寄存器寄存器存储器存储器
目的寄存器存储器寄存器存储器
汇编指令MOVESTORE
MOVE
PUSH
LOAD
MOVE
POP
MOVE
  1. 算术逻辑操作:加、减、乘、除、与、或、非等,如8086中ADD、SUB、MUL、DIV、AND、OR、NOT、XOR等。
  2. 移位操作:算术移位、逻辑移位、循环移位(带进位和不带进位)。
  3. 转移:无条件转移 JMP、条件转移 JZ/JO/JC、调用和返回 CALL/RETURN、陷阱(Trap)与陷阱指令等。“陷阱指令”用于意外事故的中断,介绍如下。
  • 一般不提供给用户直接使用,在出现事故时,由CPU自动产生并执行(隐指令),并不是指令集中的指令。如操作码非法、操作数访问越界、除数为0等。
  • 设置供用户使用的陷阱指令,如8086 INT TYPE 软中断,提供给用户使用的陷阱指令,完成系统调用。
  1. 输入输出:如IN/OUT。并不是每一种指令集都有,若将IO端口的编址空间看作是内存编址空间的一部分,就无需输入输出指令。

注:上述指令具体见“汇编语言程序设计”课程。

7.3 寻址方式

  寻址方式指的是确定本条指令的操作数地址、下一条要执行指令的指令地址。其中“指令寻址”较为简单,主要分为以下两种:

  1. 顺序寻址:取完一条指令后,顺序的取出下一条指令,(PC)+1–>PC。
  2. 跳跃寻址:由转移指令指出下一条指令地址,下图中是 JMP。
图7-6 指令寻址的两种方式

  为了提升处理器的灵活性、性能和代码的紧凑性,“数据寻址”则有较多方式。如下图所示,为了区分不同的寻址方式,需要添加“寻址特征”标志位,假设“指令字长=存储字长=机器字长”,下面介绍十种寻址方式,来求解有效地址 EA:

图7-7 添加寻址特征标志位的指令格式

形式地址A:指令字中的地址,并不是真实地址。
有效地址EA:操作数的真实地址,由“寻址特征”和“形式地址”进行一定的运算和转换得到。

  1. 立即寻址/立即数寻址:寻址特征是“井号#”,于是形式地址A就是操作数本身。执行阶段无需访存,但A的位数限制了操作数的范围。

  2. 直接寻址:寻址特征是“蓝色”,于是EA=A,有效地址就直接是形式地址。执行阶段只需访存一次,A的位数决定了寻址范围。缺点是操作数的地址不易修改(必须修改A)。

  3. 隐含寻址:操作数地址隐含在操作码中。如8086中,MUL指令的被乘数隐含在 AX(16位) 或 AL(8位)中;MOVS指令的源操作数的地址隐含在 SI 中、目的操作数的地址隐含在 DI 中。指令字中少了一个地址字段,可缩短指令字长。

  4. 间接寻址:EA=(A),有效地址由形式地址间接提供,也就是 EA 保存在内存单元中,指令中的 A 是这个内存单元的地址。执行阶段需要至少两次访存,优点是可扩大寻址范围、便于编制程序。如下是“一次间址”、“多次间址”。

下右图给出实际应用,JMP就是间接寻址。80出要进入子程序,于是保存断点 81 到 A 所表示的内存单元中,子程序结束时会跳转到 A 查找有效地址。于是通过“间接寻址”实现了函数的调用和返回。

  1. 寄存器直接寻址/寄存器寻址:EA=Ri,有效地址即为寄存器编号。执行阶段不访存、只访问寄存器,执行速度快。寄存器个数有限所以 Ri 范围很小,可缩短指令字长。

  2. 寄存器间接寻址:EA=(Ri),形式地址是寄存器编号,有效地址就保存在这个寄存器中。执行阶段需要访存。优点是便于编制循环程序,要修改操作数地址,只要修改寄存器内容即可。

  1. 基址寻址
  • 采用专用寄存器作基址寄存器:EA=(BR)+A,BR为基址寄存器。通过调整 BR 内容,可扩大寻址范围。主要用于“多道程序设计”,分时运行多道程序时,可以将不同程序的起始地址放入到BR中,在执行过程中动态的形成操作数的地址,称为“程序的动态定位”。BR内容由操作系统或管理程序确定,不可修改。
  • 采用通用寄存器作基址寄存器:EA=(R0)+A,R0 是基址寄存器的寄存器编号。由用户指定哪个通用寄存器作为基址寄存器,基址寄存器的内容由操作系统确定,在程序的执行过程中 R0的内容 不变,形式地址 A 可变。

  1. 变址寻址:EA=(IX)+A,IX 为变址寄存器,既可以是专用寄存器,也可以是通用寄存器。可扩大寻址范围。和“基址寻址”不同的是,IX的内容由用户给定,在程序的执行过程中IX内容可变,形式地址A不变,便于处理数组问题(A为起始地址、IX为下标)。
  1. 相对寻址:EA=(PC)+A,A是相对于当前指令的位移量(可正可负,补码)。A的位数决定操作数的寻址范围,特别有利于“程序浮动”,也就是程序在内存中的位置发生变化。广泛用于转移指令,所以应该归属到“指令寻址”中,而不是当前的“数据寻址”。

偏移量的设置:注意下右图想跳转到8个字节后,但当取指令后,PC的值就已经自动加2(二字节指令),所以偏移量要比原来小2!

  1. 堆栈寻址:栈顶地址由 SP 指出,是先进后出的队列,SP的修改与主存编址方法有关。分为“硬堆栈”(栈顶是寄存器、栈底是内存)、“软堆栈”(指定的一段内存空间)。通常栈顶地址最低、栈底地址最高,假如主存编址的数据只占用1个单位,于是如下右图,进栈 (SP)-1→SP、出栈 (SP)+1→SP。

【例】设数据块首地址为D,求N个数的平均值,“直接寻址”、“变址寻址”、“相对寻址”各需几条指令?

【思考题】为什么在指令当中,要设置多种寻址方式?
【ChatGPT】主要有以下几个原因:

  1. 灵活性和功能性:不同的寻址方式为程序员和编译器提供了不同的数据访问方法。例如,立即寻址允许直接在指令中提供一个值,而寄存器寻址允许快速访问CPU内的寄存器。这种多样性使得在处理各种计算和数据管理任务时,可以选择最合适的寻址方式。
  2. 提高性能:某些寻址方式可以更有效地利用现代CPU的高速缓存和内存层次结构。例如,基于寄存器的寻址通常比基于内存的寻址更快,因为寄存器的访问速度远超内存。通过选择最优的寻址方式,可以减少访问内存的次数,从而提升程序的执行速度。
  3. 代码紧凑性和节省空间:不同的寻址方式可以帮助生成更紧凑的代码。例如,短距离跳转指令可能使用相对寻址,因为它们需要的地址偏移量比较小,从而减少了指令所需的字节数。这在嵌入式系统和其他资源受限的环境中尤其重要。
  4. 支持高级编程抽象:多种寻址方式支持高级语言构造(如数组、结构体、指针等)的高效实现。例如,间接寻址和基址加偏移寻址方式可以方便地实现数组和结构体的访问,从而使得高级语言能够更有效地编译到机器码。
  5. 兼容性和扩展性:在某些情况下,不同的寻址方式可以帮助保持向后兼容性,同时允许新的指令和功能的引入。这样,即使硬件架构升级,现有的软件和操作系统也能继续运行,同时还能利用新硬件的增强功能。

7.4 指令格式举例

  设计“指令格式”时应考虑的各种因素,下面是简要介绍,“计算机体系结构”课程会详细介绍:

  1. 指令系统的兼容性:兼容老版本,否则新的指令集很难占领市场。
  2. 操作类型:指令个数、操作的难易程度、使用频率
  3. 数据类型:确定哪些数据类型可参与操作
  4. 指令格式:指令字长是否固定、操作码位数、是否采用“扩展操作码技术”、地址码位数、地址个数、寻址方式类型
  5. 寻址方式:指令寻址、操作数寻址
  6. 寄存器个数:寄存器的多少直接影响指令的执行时间

比如“汇编语言程序设计”课程中介绍的8086是典型的复杂指令计算机,指令字长为1~6个字节,地址格式有零地址、一地址、两地址(7.1节-机器指令”)。下面是 IBM 360 的指令格式:

图7-8 IBM 360 的5种指令格式
  1. RR格式:寄存器-寄存器格式,结果保存在其中一个寄存器中。
  2. RX格式:寄存器-存储器格式,有效地址由 基址寻址X 和 变址寻址B 得到。
  3. RS格式:寄存器-存储器格式,应用于寄存器和存储器之间的数据的成组传送,对象是 [R1,R3] 之间的所有数据。
  4. SI格式:立即数-存储器格式,立即数和内存操作数之间的操作。
  5. SS格式:存储器-存储器格式,将从 B1+D1 开始的 L 个数据依次转存到 B2+D2 开始的内存中,典型指令就是内存中的数据传输(十进制运算/字符串处理)、翻译指令。

注:R是数据寄存器地址、X是变址寄存器、B是基址寄存器、D是偏移地址、I是立即数、L表示数据长度。

【习题7.19】CPU内有32个32位的通用寄存器,设计一种能容纳64种操作的指令系统。假设指令字长等于机器字长,试回答以下问题。
(1) 如果主存可直接或间接寻址,采用寄存器-存储器型指令,能直接寻址的最大存储空间是多少?画出指令格式并说明各字段的含义。
(2) 在满足(1)的前提下,如果采用通用寄存器作基址寄存器,则上述寄存器-存储器型指令的指令格式有何特点?画出指令格式并指出这类指令可访问多大的存储空间?

  1. 指令系统有64种操作,则需要操作码OP长度为6位。采用“寄存器-存储器型指令”,寄存器地址占5位,寻址标志位还需要1位(直接寻址/间接寻址),剩下的20位全部给存储器,也就是直接寻址的最大存储空间为 220 = 1M word。
    由于寻址特征与主存地址有关,所以将寻址标志位放在主存地址之前、而不是在OP之后,指令格式如下:
  1. 还是OP占6位、寄存器地址占5位,新增了“基值寻址”,于是寻址标志位为2位。剩下的19位,再抽出5位作为基址,于是剩下14位作为形式地址。如下图。
    但实际上,直接寻址和间接寻址都是访存,那么它们都用“基址寻址”的方式找到要访问的主存地址完全没有问题,于是下图中的 B 可以省略,形式地址 A 为15位。由于 EA=(BRi)+A,所以可访问的最大存储空间为 232 = 4 GB。

启示:访问内存时,尽量选择“基址寻址”、“变址寻址”,用于扩大访问范围。而不是将单字节指令变成双字节指令。

7.5 RISC技术

一、RISC的产生和发展
  早期指令集设计并不复杂,但是随着发展,为了面向目标程序、高级语言、操作系统等进行优化,就会将一些常用操作直接定义成一个指令,于是指令集逐渐变得复杂,甚至达到400多条指令,甚至某些复杂指令只能使用“微程序”执行指令,也就是CISC架构(Complex Instruction Set Computer,复杂指令集计算机)。但经过仔细分析发现,典型程序中80%的语句仅仅使用处理机中20%的指令(二八定律),执行频度高的简单指令,因复杂指令的存在,执行速度无法提高。这就启示我们能否用20%的简单指令组合不常用的80%的指令功能?于是便诞生了 RISC架构(Reduced Instruction Set Computer,精简指令集计算机)

参考视频:“除了国产替代,卖出100亿的RISC-V还给芯片带来了什么?【差评君】

RISC的主要特征如下,主要是为了简化指令设计、加快指令执行速度来提升效率:

  • 选用使用频度较高的一些简单指令,复杂指令的功能由简单指令来组合
  • 指令长度固定、指令格式种类少、寻址方式少
  • 只有LOAD/STORE指令访存
  • CPU中有多个通用寄存器
  • 采用流水技术一个时钟周期内完成一条指令
  • 采用组合逻辑实现控制器

CISC的主要特征如下,主要是为了简化编译器设计、减少执行的指令数量来提升效率:

  • 系统指令复杂庞大,各种指令使用频度相差大
  • 指令长度不固定、指令格式种类多、寻址方式多
  • 访存指令不受限制
  • CPU中设有专用寄存器
  • 大多数指令需要多个时钟周期执行完毕
  • 采用微程序控制器

RISC和CISC的比较:

  1. RISC更能充分利用VLSI芯片的面积。
  2. RISC更能提高计算机运算速度,可以用CPU性能公式计算。指令数、指令格式、寻址方式少,通用寄存器多,采用组合逻辑,便于实现指令流,都是提升指令运行速度。
  3. RISC便于设计,可降低成本,提高可靠性。
  4. RISC不易实现指令系统兼容,缺点。

RISC和CISC在现代处理器中的应用【ChatGPT】:

RISC架构:主导地位,常用于移动设备、嵌入式设备。

  1. ARM
    应用领域:ARM架构广泛应用于移动设备(如智能手机和平板电脑)、嵌入式系统、微控制器等领域。随着技术的进步,ARM架构也开始进入服务器和桌面计算领域。
    特点:高能效、简化的指令集、低功耗设计。
  2. RISC-V
    应用领域:RISC-V是一种开放标准的指令集架构(ISA),其设计简洁、可扩展,被应用于从微控制器到高性能计算服务器的广泛设备中。
    特点:开源、可自由扩展的指令集、广泛的社区支持。
  3. MIPS
    应用领域:虽然新的MIPS架构的应用有所减少,但它仍然在一些嵌入式系统、网络设备和教育领域中有所应用。
    特点:曾经广泛应用于家用游戏机、路由器等嵌入式设备。

CISC架构:兼容性好,常用于个人计算机、服务器、工作站。

  1. Intel x86/x86-64
    应用领域:x86架构是目前个人计算机、笔记本电脑、企业服务器和一些高端工作站的主导架构。x86-64(或称为AMD64,Intel的实现称为Intel 64)扩展了x86架构,支持64位计算。
    特点:广泛的软件兼容性、强大的性能、丰富的功能集合。
  2. Intel Itanium(IA-64)
    应用领域:主要用于高端服务器市场,但由于市场接受度不高和性能问题,其影响力和市场份额已大大减少。
    特点:Itanium采用了一种被称为显式并行指令计算(EPIC)的架构,尽管它在某种程度上试图克服传统CISC和RISC架构的限制,但通常还是被归类为CISC。

RISC与CISC相结合:旨在利用RISC的高性能和高效率特性,同时保持与CISC架构的兼容性,尤其是在软件生态系统中。这种结合并不是创建一个全新的指令集架构,而是通过设计实现的方式在同一处理器中融合这两种架构的优点。

  1. Intel的x86处理器
    技术手段:现代的Intel x86处理器内部使用了一种“微操作”(micro-operations,或称μops)的技术。外部它们仍然接受传统的x86指令集(CISC风格),但在内部,这些复杂的CISC指令首先被解码成更简单、标准化的操作(即μops),这些操作具有RISC风格的特点。之后,这些操作被发送到一个高度优化的执行引擎,该引擎按照RISC原则设计,以提高执行效率和处理速度。
    目的:这样做的目的是结合CISC的软件兼容性和RISC的高性能执行效率。
  2. Transmeta Crusoe
    技术手段:在2000年代初期,Transmeta公司推出了Crusoe处理器,其使用了一种名为“代码变形”(Code Morphing)的技术,能够在软件层面上将x86指令动态翻译成处理器内部的VLIW(Very Long Instruction Word)指令,后者更接近RISC风格的设计。
    目的:Crusoe旨在提供与x86架构兼容的同时,通过其RISC风格的内核提高能效和减少芯片复杂性。
  3. ARM的Dynamic Binary Translation
    技术手段:虽然ARM本身是一种RISC架构,但通过使用动态二进制翻译技术(如Apple的Rosetta 2),它可以运行为CISC架构(如Intel x86)编写的软件。这种方法通过软件层面的翻译,而不是处理器设计本身的混合,实现了架构之间的兼容。
    目的:这使得基于ARM的系统能够运行广泛的现有软件,而无需原生支持,从而结合了RISC架构的能效优势和CISC架构庞大的软件生态。
  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虎慕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值