首页 第5章

第5章

举报
开通vip

第5章null第5章 指令系统第5章 指令系统5.1 指令系统的发展 5.2 指令格式 5.3 数据表示 5.4 寻址方式(编址方式) 5.5 指令类型null5.6 指令系统的兼容性 5.7 精简指令系统计算机(RISC)和复杂指令系统计算机(CISC) 5.8 指令系统举例 5.9 机器语言、汇编语言和高级语言 习题 null5.1 指令系统的发展 计算机系统主要由硬件(hardware)和软件(software)两部分组成。所谓硬件就是由中央处理机(CPU)、存储器以及外部设备等组成的实际...

第5章
null第5章 指令系统第5章 指令系统5.1 指令系统的发展 5.2 指令格式 5.3 数据表示 5.4 寻址方式(编址方式) 5.5 指令类型null5.6 指令系统的兼容性 5.7 精简指令系统计算机(RISC)和复杂指令系统计算机(CISC) 5.8 指令系统举例 5.9 机器语言、汇编语言和高级语言 习题 null5.1 指令系统的发展 计算机系统主要由硬件(hardware)和软件(software)两部分组成。所谓硬件就是由中央处理机(CPU)、存储器以及外部设备等组成的实际装置。软件则是为便于用户使用计算机而编写的各种程序,最终转换成一系列机器指令后在计算机上执行。 计算机的性能与它所设置的指令系统有很大的关系,而指令系统的设置又与机器的硬件结构密切相关。通常性能较好的计算机都设置有功能齐全、通用性强、指令丰富的指令系统,但这需要复杂的硬件结构来支持。null在20世纪50年代和60年代早期,由于计算机采用分立元件(电子管或晶体管),其体积庞大,价格昂贵,因此,大多数计算机的硬件结构比较简单。所支持的指令系统一般只有定点加减、逻辑运算、数据传送和转移等十几至几十条最基本的指令,而且寻址方式简单。到60年代中、后期,随着集成电路的出现,计算机的价格不断下降,硬件功能不断增强,指令系统也越来越丰富。除了具有以上最基本的指令以外,还设置了乘除法运算指令、浮点运算指令、十进制运算指令以及字符串处理指令等,指令数多达一、二百条,寻址方式也趋于多样化。null随着集成电路的发展和计算机应用领域的不断扩大,计算机的软件价格相对不断提高。为了继承已有的软件,减少软件的开发费用,人们迫切希望各机器上的软件能够兼容,以便在旧机器上编制的各种软件也能在新的、性能更好的机器上正确运行,因此,在60年代出现了系列(series)计算机。null所谓系列计算机是指基本指令系统相同,基本体系结构相同的一系列计算机,如IBM 370系列,VAX-11系列,IBMPC (XT/AT/286/386/486/Pentium)微机系列等。一个系列往往有多种型号,各型号的基本结构相同,但由于推出的时间不同,所采用的器件也不同,因此在结构和性能上可以有很大差异。通常是新推出的机种在性能和价格方面要比早推出的机种优越。系列机能解决软件兼容问题的必要条件是该系列的各机种有共同的指令集,而且新推出的机种的指令系统一定包含旧机种的所有指令,因此在旧机种上运行的各种软件可以不加任何修改地在新机种上运行。null计算机发展至今,其硬件结构随着超大规模集成电路(VLSI)技术的飞速发展而越来越复杂化,所支持的指令系统也趋于多用途、强功能化。指令系统的改进是围绕着缩小指令与高级语言的语义差异以及有利于操作系统的优化而进行的。为了便于操作系统的实现和优化,还设置有控制系统状态的特权指令、管理多道程序和多处理机系统的专用指令等。null然而,指令结构太复杂也会带来一些不利的因素,如 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 周期长,正确性难以保证且不易维护等;此外,实验证明,在如此庞大的指令系统中,只有诸如算术、逻辑运算、数据传送、转移和子程序调用等几十条最基本的指令才是经常使用的,而需要大量硬件支持的大多数较复杂的指令却利用率很低,造成硬件资源的极大浪费。为了解决这个问题,在70年代末人们提出了便于VLSI实现的精简指令系统计算机,简称RISC(见5.7节)。null5.2 指令格式 5.2.1 指令格式 计算机是通过执行指令来处理各种数据的。为了指出数据的来源、操作结果的去向及所执行的操作,一条指令必须包含下列信息: (1) 操作码,具体说明了操作的性质及功能。一台计算机可能有几十条至几百条指令,每一条指令都有一个相应的操作码,计算机通过识别该操作码来完成不同操作。 (2) 操作数的地址。CPU通过该地址就可以取得所需的操作数。 (3) 操作结果的存储地址。把对操作数的处理所产生的结果保存在该地址中,以便再次使用。null(4) 下一条指令的地址。一般来说,当程序顺序执行时,下条指令的地址由程序计数器(PC)指出,仅当改变程序的运行顺序(如转移、调用子程序)时,下条指令的地址才由指令给出。 从上述分析可知,一条指令实际上包括两种信息即操作码和地址码。操作码(operation code)用来表示该指令所要完成的操作(如加、减、乘、除、数据传送等),其长度取决于指令系统中的指令条数;地址码用来描述该指令的操作对象,或者直接给出操作数或者指出操作数的存储器地址或寄存器地址(即寄存器名)。根据地址码部分所给出地址的个数,指令格式可分为如下几种。null1. 零地址指令 格式: OPCODE OPCODE——操作码 指令中只有操作码,而没有操作数或没有操作数地址。这种指令有两种可能: (1) 无需任何操作数。如空操作指令,停机指令等。 (2) 所需的操作数是默认的。null2. 一地址指令 格式: OPCODE A OPCODE——操作码 A——操作数的存储器地址或寄存器名 指令中只给出一个地址,该地址既是操作数的地址,又是操作结果的存储地址。 在某些字长较短的微型机中,大多数算术逻辑运算指令也采用这种格式,第一个源操作数由地址码A给出,第二个源操作数在一个默认的寄存器中,运算结果仍送回到这个寄存器中,替换了原寄存器内容,通常把这个寄存器称为累加器。null3. 二地址指令 格式: OPCODE A1 A2 OPCODE——操作码 A1——第一个源操作数的存储器地址或寄存器地址。 A2——第二个源操作数和存放操作结果的存储器地址或寄存器地址。 这是最常见的指令格式,两个地址指出两个源操作数地址,其中一个还是存放结果的目的地址。对两个源操作数进行操作码所规定的操作后,将结果存入目的地址 。null4. 三地址指令: 格式: OPCODE A1 A2 A3 OPCODE——操作码 A1——第一个源操作数的存储器地址或寄存器地址 A2——第二个源操作数的存储器地址或寄存器地址 A3——操作结果的存储器地址或寄存器地址 其操作是对A1,A2指出的两个源操作数进行操作码(OPCODE)所指定的操作,结果存入A3中。 null5. 多地址指令 在某些性能较好的大、中型机甚至高档小型机中,往往设置一些功能很强的,用于处理成批数据的指令,如字符串处理指令,向量、矩阵运算指令等。为了描述一批数据,指令中需要多个地址来指出数据存放的首地址、长度和下标等信息。 以上所述的几种指令格式只是一般情况,并非所有的计算机都具有。 null在计算机中,指令和数据一样都是以二进制码的形式存储的,从表面来看,两者没有什么差别。但是,指令的地址是由程序计数器(PC)规定的,而数据的地址是由指令规定的,在CPU控制下访存绝对不会将指令和数据混淆。为了程序能重复执行,一般要求程序在运行前后所有的指令都保持不变,因此在程序执行过程中,要避免修改指令。在有些计算机中如发生了修改指令情况,则按出错处理。 null5.2.2 指令操作码的扩展技术 指令操作码的长度决定了指令系统中完成不同操作的指令条数。若某机器的操作码长度为K位,则它最多只能有2k条不同指令。指令操作码通常有两种编码格式,一种是固定格式,即操作码的长度固定,且集中放在指令字的一个字段中。这种格式对于简化硬件设计,减少指令译码时间非常有利,在字长较长的大、中型机和超级小型机以及RISC上广泛采用。另一种是可变格式,即操作码的长度可变,且分散地放在指令字的不同字段中。这种格式能够有效地压缩程序中操作码的平均长度,在字长较短的微型机上广泛采用。 null显然,操作码长度不固定将增加指令译码和分析的难度,使控制器的设计复杂化,因此对操作码的编码至关重要。通常是在指令字中用一个固定长度的字段来表示基本操作码,而对于一部分不需要某个地址码的指令,把它们的操作码扩充到该地址字段,这样既能充分地利用指令字的各个字段,又能在不增加指令长度的情况下扩展操作码的长度,使它能表示更多的指令。例如,设某机器的指令长度为16位,包括4位基本操作码字段和三个4位地址字段,其格式如图5.1所示。 null 图5.1 指令格式 null一种可供扩展的方法和步骤如下: (1) 15条三地址指令的操作码由4位基本操作码从0000~1110给出,剩下一个码点1111用于把操作码扩展到A1,即4位扩展到8位; (2) 15条二地址指令的操作码由8位操作码从11110000~11111110给出,剩下一个码点11111111用于把操作码扩展到A2,即从8位扩展到12位; (3) 15条一地址指令的操作码由12位操作码从111111110000~111111111110给出,剩下一个码点111111111111用于把操作码扩展到A3,即从12位扩展到16位;null(4) 16条零地址指令的操作码由16位操作码从1111111111110000~1111111111111111给出。 除了这种方法以外,还有其他多种扩展方法。在可变长度的指令系统的设计中,到底使用何种扩展方法有一个重要的原则,就是使用频度(即指令在程序中的出现概率)高的指令应分配短的操作码;使用频度低的指令相应地分配较长的操作码。这样不仅可以有效地缩短操作码在程序中的平均长度,节省存储器空间,而且缩短了经常使用的指令的译码时间,因而可以提高程序的运行速度。null假如某计算机模型有7条指令(I1~I7),它们在程序中出现的概率用Pi表示,则可考虑表5.1所示的方案,这就是扩展操作码,使用频率高的指令的操作码为2位,低的用4位。这不是压缩到最小代码的方案,因为在计算机中的操作码还是希望有一定的规整性,否则会引起硬件实现的复杂化。另外在计算机内存放的指令长度一般是字节的整数倍,所以操作码与地址码两部分长度之和是字节的整数倍。在考虑操作码长度时还应考虑地址码的要求。 null表5.1 指令出现概率与操作码长度的选择null由此可见,操作码扩展技术是一种重要的指令优化技术,它可以缩短指令的平均长度,减少程序的总位数以及增加指令字所能表示的操作信息。当然,扩展操作码比固定操作码译码复杂,使控制器的设计难度增大,且需更多的硬件来支持。 null5.2.3 指令长度与字长的关系 字长是指计算机能直接处理的二进制数据的位数,它与计算机的功能和用途有很大的关系,是计算机的一个重要技术指标。首先,字长决定了计算机的运算精度,字长越长,计算机的运算精度越高,因此,高性能的计算机字长较长,而性能较差的计算机字长相对要短一些。其次,地址码长度决定了指令直接寻址能力,若为n位,则给出的n位直接地址寻址2n字节。。扩大寻址能力的方法,一是通过增加机器字长来增加地址码的长度;二是采用地址扩展技术,把存储空间分成若干个段,用基地址加位移量的方法来增加地址码的长度。null为了便于处理字符数据和尽可能地充分利用存储空间,一般机器的字长都是字节长度(即8位)的1,2,4或8倍,也就是8,16,32或64位。 指令的长度主要取决于操作码的长度、操作数地址的长度和操作数地址的个数。各指令的长度不是固定的,但也不是任意的。为了充分地利用存储空间,指令的长度通常为字节的整数倍。 null指令的长度与机器的字长没有固定的关系,它既可以小于或等于机器的字长,也可以大于机器的字长。前者称为短格式指令,后者称为长格式指令,一条指令存放在地址连续的存储单元中。在同一台计算机中可能既有短格式指令又有长格式指令,但通常是把最常用的指令(如算术逻辑运算指令、数据传送指令)设计成短格式指令,以便节省存储空间和提高指令的执行速度。 null5.3 数据表示 在计算机中的基本数据有逻辑(布尔)数、定点数(整数)、浮点数(实数)、十进制数、字符串、数组等。对这些数据的运算可以设置专门的指令;也可以仅设置最简单的算术逻辑运算指令,而通过程序的执行实现其他类型数据的处理,但后者的速度下降很多。在机器中若设置能直接对矩阵向量数据(数组)进行运算的指令及硬件,可以大大提高对向量、数组的处理速度,这一般在巨型机中才采用。 null 图5.2 存储器中数据的存放(举例)null目前计算机所用数据字长一般为32位。存储器的地址,一般按字节表示。计算机的指令系统可支持对字节、半字、字、双字的运算,有些计算机有位处理指令。为便于硬件实现,一般要求多字节数据对准边界,如图5.2(a)所示 。图5.3为按字节编址的双字数据的两种字节次序: (1) 低字节为低地址,如图5.3(a)所示; (2) 高字节为低地址,如图5.3(b)所示。 null 图5.3 两种字节次序 null5.4 寻址方式(编址方式) 在程序执行过程中,操作数可能在运算部件的某个寄存器中或存储器中,也可能就在指令中。组成程序的指令代码,一般是在存储器中的。所谓寻址方式(或编址方式)指的是确定本条指令的数据地址及下一条要执行的指令地址的方法,它与计算机硬件结构紧密相关,而且对指令格式和功能有很大影响。不同的计算机有不同的寻址方式,但其基本原理是相同的。在这里我们仅介绍几种被广泛采用的基本寻址方式。 null1. 直接寻址 指令的地址码部分给出操作数在存储器中的地址,图5.4(a)仅给出一个操作数地址;当有多个地址时,情况类似,不再重复,该指令的寻址方式由操作码表示。图5.4(b)增加了一个寻址方式字段M。 2. 寄存器寻址 计算机的中央处理器一般设置有一定数量的通用寄存器,用以存放操作数、操作数的地址或中间结果。假如指令地址码部分给出某一通用寄存器地址,而且所需的操作数就在这一寄存器中,则称为寄存器寻址。null 图5.4 直接寻址方式null3. 基址寻址 在计算机中设置一个专用的基址寄存器,或由指令指定一个通用寄存器为基址寄存器。操作数的地址由基址寄存器的内容和指令的地址码A相加得到,如图5.5所示。 基址寄存器主要用于为程序或数据分配存储区,对多道程序或浮动程序很有用,实现从浮动程序的逻辑地址(编写程序时所使用的地址)到存储器的物理地址(程序在存储器中的实际地址,有时称为有效地址)的转换。 null 图5.5 基址寻址过程null另外,当存储器的容量较大,由指令的地址码部分直接给出的地址不能直接访问到存储器的所有单元时,通常把整个存储空间分成若干个段,段的首地址存放于基址寄存器或段寄存器中,段内位移量由指令给出。存储器的实际地址就等于基址寄存器的内容(即段首地址)与段内位移量之和,这样通过修改基址寄存器的内容就可以访问存储器的任一单元。 综上所述,基址寻址主要用以解决程序在存储器中的定位和扩大寻址空间等问题。通常基址寄存器中的值只能由系统程序设定,由特权指令执行,而不能被一般用户指令所修改,因此确保了系统的安全性。 null4. 变址寻址 变址寻址的过程如图5.6所示。 图5.6 变址寻址过程null5. 间接寻址 在寻址时,有时根据指令的地址码所取出的内容既不是操作数,也不是下一条要执行的指令,而是操作数的地址或指令的地址,这种方式称为间接寻址或间址。根据地址码指的是寄存器地址还是存储器地址,间接寻址又可分为寄存器间接寻址和存储器间接寻址两种方式。间接寻址有一次间址和多次间址两种情况,大多数计算机只允许一次间址。对于存储器一次间址情况,需访问两次存储器才能取得数据,第一次从存储器读出操作数地址,第二次读出操作数。 null图5.7(a)和图5.7(b)分别为寄存器间址与存储器间址的操作数寻址过程。 图5.7 间址寻址过程 null图5.8以转移指令Jump为例,来说明在直接寻址和间接寻址方式下如何确定下一条要执行的指令的地址。 图5.8 确定Jump指令的转移地址 null6. 相对寻址 把程序计数器PC的内容(即当前执行指令的地址)与指令的地址码部分给出的位移量(disp)之和作为操作数的地址或转移地址,称为相对寻址。主要用于转移指令,执行本条指令后,将转移到(PC)+disp,(PC)为程序计数器的内容。相对寻址有两个特点: (1) 转移地址不是固定的,它随着PC值的变化而变化,并且总是与PC相差一个固定值disp,因此无论程序装入存储器的任何地方,均能正确运行,对浮动程序很适用。null(2) 位移量可正、可负,通常用补码表示。如果位移量为n位,则这种方式的寻址范围在(PC)-2(n-1)到(PC)+2(n-1)-1之间。 计算机的程序和数据一般是分开存放的,程序区在程序执行过程中不允许修改。在程序与数据分区存放的情况下,不用相对寻址方式来确定操作数地址。 null7. 立即数 所需的操作数由指令的地址码部分直接给出,就称为立即数(或直接数)寻址方式。这种方式的特点是取指时,操作码和一个操作数同时被取出,不必再次访问存储器,提高了指令的执行速度。但是由于这一操作数是指令的一部分,不能修改,而一般情况下,指令所处理的数据都是在不断变化的(如上条指令的执行结果作为下条指令的操作数),故这种方式只能适用于操作数固定的情况。通常用于给某一寄存器或存储器单元赋初值或提供一个常数等。null8. 堆栈寻址 见5.5节的说明。 以上这些寻址方式,在计算机中可以组合使用,例如在一条指令中可以同时实现基址寻址与变址寻址,其有效地址为: 基址寄存器内容+变址寄存器内容+指令地址码Anull5.5 指令类型 指令系统决定了计算机的基本功能,因此指令系统的设计是计算机系统设计中的一个核心问题。它不仅与计算机的硬件结构紧密相关,而且直接影响到编写操作系统和编写编译程序的难易程度。因此设计一个合理而又有效的指令系统是至关重要的,它对机器的性能价格比有很大影响。 一台计算机最基本的、必不可少的指令是不多的,因为很多指令都可以用这些最基本的指令组合来实现。 null5.5.1 指令的分类及功能 1. 算术逻辑运算指令 一般计算机都具有这类指令。这里讲的算术运算一般指的是定点数运算,即相当于高级语言中对整数(integer)的处理。通常根据算术运算的结果置状态位,一般有Z(结果为0)、N(结果为负)、V(结果溢出)、C(产生进位或借位)四个状态位。当满足括弧内所提出的条件时,相应位置成“1”,否则为“0”。 通常计算机具有对两个数进行与、或、非(求反)、异或(按位加)等操作的逻辑运算指令。有些计算机还设置有位操作指令。 null2. 移位操作指令 移位操作指令分为算术移位、逻辑移位和循环移位三种,可以将操作数左移或右移若干位,如图5.9所示。 算术逻辑移位指令还有一个很重要的作用,就是用于实现简单的乘除运算。算术左移或右移n位,分别实现对带符号数据乘以2n或整除以2n的运算;同样,逻辑左移或右移n位,分别实现对无符号数据乘以2n或整除以2n的运算。移位指令的执行时间比乘除运算的执行时间短。因此采用移位指令来实现上述乘法、除法运算可取得较高的速度。 null 图5.9 移位操作null3. 浮点运算指令 高级语言中的实数(real)经常是先转换成浮点数的形式而后再进行处理。某些机器没有设置浮点运算指令而用子程序实现,其速度较低。因此主要用于科学计算的计算机应该设置浮点运算指令,一般能对单精度(32位)、双精度(64位)数据进行处理。 null4. 十进制运算指令 在人机交互作用时,输入输出的数据都是以十进制形式表示的。在某些数据处理系统中输入输出的数据很多,但对数据本身的处理却很简单。在不具有十进制运算指令的计算机中,首先将十进制数据转换成二进制数,再在机器内运算;尔后又转换成十进制数据输出。因此,在输入输出数据频繁的计算机系统中设置十进制运算指令能提高数据处理的速度。 null5. 字符串处理指令 字符串处理指令是一种非数值处理指令,一般包括字符串传送、字符串比较、字符串查询、字符串转换等指令。其中“字符串传送”指的是数据块从主存储器的某区传送到另一区域;“字符串比较”是一个字符串与另一个字符串逐个字符进行比较,以确定其是否相等;“字符串查询”是查找在字符串中是否含有某一指定的子串或字符;“字符串转换”指的是从一种数据表达形式转换成另一种表达形式。例如,从ASCII码转换成EBCDIC码(扩充的BCD码)。这种指令在需对大量字符串进行各种处理的文字编辑和排版方面非常有用。 null6. 数据传送指令 这类指令用以实现寄存器与寄存器,寄存器与存储器单元,存储器单元与存储器单元之间的数据传送。对于存储器来讲,数据传送包括了对数据的读(相当于取数指令)或写(相当于存数指令)操作。数据传送时,数据从源地址传送到目的地址,而源地址中的数据保持不变,因此实际上是数据复制。 数据传送指令一次可以传送一个数据或一批数据。 有些机器设置了数据交换指令,完成源操作数与目的操作数互换,实现双向数据传送。 null7. 转移类指令 这类指令用以控制程序流的转移。在大多数情况下,计算机是按顺序方式执行程序的,但是也经常会遇到离开原来的顺序转移到另一段程序或循环执行某段程序的情况。 按转移的性质,转移指令分为无条件转移、条件转移、过程调用与返回、陷阱(trap)等几种。 (1) 无条件转移与条件转移null无条件转移指令不受任何条件约束,直接把程序转移到指令所规定的目的地,在那里继续执行程序,在本书中以jump表示无条件转移指令。条件转移指令则根据计算机处理结果来决定程序如何执行。它先测试根据处理结果设置的条件码,然后根据所测试的条件是否满足来决定是否转移,本书中用branch表示条件转移指令。null条件码的建立与转移的判断可以在一条指令中完成,也可以由二条指令完成。前者通常在转移指令中先完成比较运算,然后根据比较的结果来判断转移的条件是否成立,如条件为“真”则转移,如条件为“假”则顺序执行下一条指令。在第二种情况中,由转移指令前面的指令来建立条件码,转移指令根据条件码来判断是否转移,通常用算术指令建立的条件码N、Z、V、C来控制程序的执行方向,实现程序的分支。 有的计算机还设置有奇偶标志位P。 null转移指令的转移地址一般采用相对寻址和直接寻址两种寻址方式来确定。若采用相对寻址方式,则称为相对转移,转移地址为当前指令地址(即当前PC的值)和指令地址码部分给出的位移量之和,即PC←(PC)+位移量;若采用直接寻址方式,则称为绝对转移,转移地址由指令地址码部分直接给出,即PC←目标地址。null(2) 调用指令与返回指令 在编写程序过程中,常常需要编写一些经常使用的、能够独立完成某一特定功能的程序段,在需要时能随时调用,而不必多次重复编写,以便节省存储器空间和简化程序设计。这种程序段就称为子程序或过程。 除了用户自己编写的子程序以外,为了便于各种程序设计,系统还提供了大量通用子程序。需要时,可直接调用,而不必重新编写。通常使用调用(过程调用/系统调用/转子程序)指令来实现从一个程序转移到另一个程序的操作,在本书中用call表示调用指令。 nullcall指令与jump指令、branch指令的主要差别是需要保留返回地址,也就是说当执行完被调用的程序后要回到原调用程序,继续执行call指令的下一条指令。返回地址一般保留于堆栈中,随同保留的还有一些状态寄存器或通用寄存器内容。保留寄存器内容有两种方法:① 由调用程序保留从被调用程序返回后要用到的那部分寄存器内容,其步骤是先由调用程序将寄存器内容保存在堆栈中,当执行完被调用程序,返回到调用程序后,再从堆栈中取出并恢复寄存器内容。②由被调用程序保留并最后恢复本程序要用到的那些寄存器内容,也是保存在堆栈中。这两种方法的目的都是为了保证调用程序继续执行时寄存器内容的正确性。null调用(call)与返回(return)是一对配合使用的指令,返回指令从堆栈中取出返回地址,继续执行调用指令的下一条指令。 (3) 陷阱(trap)与陷阱指令 在计算机运行过程中,有时可能出现电源电压不稳、存储器校验出错、输入输出设备出现故障、用户使用了未定义的指令或特权指令等种种意外情况,使得计算机不能正常工作。这时若不及时采取措施处理这些故障,将影响到整个系统的正常运行。因此,一旦出现故障,计算机就发出陷阱信号,并暂停当前程序的执行(称为中断),转入故障处理程序进行相应的故障处理。null陷阱实际上是一种意外事故中断,它中断的主要目的不是为了请求CPU的正常处理,而是 通知 关于发布提成方案的通知关于xx通知关于成立公司筹建组的通知关于红头文件的使用公开通知关于计发全勤奖的通知 CPU已出现了故障,并根据故障情况,转入相应的故障处理程序。 在一般计算机中,陷阱指令作为隐含指令(即指令系统中不提供的指令,它所完成的功能是隐含的)不提供给用户使用,只有在出现故障时,才由CPU自动产生并执行。也有些计算机设置可供用户使用的陷阱指令或“访管”指令,利用它来实现系统调用和程序请求。 null8. 堆栈及堆栈操作指令 堆栈(stack)是由若干个连续存储单元组成的先进后出(first in last out,简称FILO)存储区,第一个送入堆栈中的数据存放在栈底,最近送入堆栈中的数据存放在栈顶。栈底是固定不变的,而栈顶却是随着数据的入栈和出栈在不断变化。为了表示栈顶的位置,有一个寄存器或存储器单元用于指出栈顶的地址,这个寄存器或存储器单元就称为堆栈指针(stack pointer,简称SP)。任何堆栈操作只能在栈顶进行。null在堆栈结构的计算机中,堆栈是用来提供操作数和保存运算结果的主要存储区,大多数指令(包括运算指令)通过访问堆栈来获得所需的操作数或把操作结果存入堆栈中。而在一般计算机中,堆栈主要用来暂存中断和子程序调用时现场数据及返回地址,用于访问堆栈的指令只有压入(即进栈)和弹出(即退栈)两种,它们实际上是一种特殊的数据传送指令。压入指令(PUSH)是把指定的操作数送入堆栈的栈顶,而弹出指令(POP)的操作刚好相反,是把栈顶的数据取出,送到指令所指定的目的地。 null在一般的计算机中,堆栈从高地址向低地址扩展,即栈底的地址总是大于或等于栈顶的地址(也有少数计算机刚好相反)。当执行压入操作时,首先把堆栈指针(SP)减量(减量的多少取决于压入数据的字节数,若压入一个字节,则减1;若压入两个字节,则减2,以此类推),然后把数据送入SP所指定的单元;当执行弹出操作时,首先把SP所指定的单元(即栈顶)的数据取出,然后根据数据的大小(即所占的字节数)对SP增量。 null由于堆栈具有先进后出的性质,因而在中断、子程序调用过程中广泛用于保存返回地址、状态标志及现场信息。例如,假设有一主程序M和两个子程序A,B,它们的调用关系是M调用A,A又调用B,如图5.10所示。 null 图5.10 子程序嵌套调用 null堆栈还有一个重要的作用,就是用于子程序调用时参数的传递,特别是在不同语言(如Pascal语言和汇编语言)程序之间相互调用过程中,使用堆栈来传递参数更加普遍。利用堆栈传递参数时,首先把所需传递的参数压入堆栈中,然后调用子程序。为了在子程序中方便地访问到堆栈中的任一参数,除了指向栈顶的堆栈指针(SP)以外,通常还设置了一个指向参数区的参数指针,利用该指针访问堆栈就像访问存储器一样不受堆栈先进后出性质的限制,可以直接用变址方式访问堆栈中的各个参数。null9. 输入输出(I/O)指令 计算机所处理的一切原始数据和所执行的程序(除了固化在ROM中的以外)均来自外部设备的输入,处理结果需通过外部设备输出。输入输出指令的一般格式如下: OP REG A 其中OP是操作码,表示I/O指令。REG是寄存器名,用于指定与外部设备交换数据的寄存器。A是外部设备中的寄存器地址或设备码,其长度一般为8~16位,可以表示256~64K个设备寄存器(输入数据寄存器/输出数据寄存器/控制寄存器)。 null输入指令完成从A地址所指定的外部设备寄存器中读入一个数据到REG寄存器中;输出指令刚好相反,是把REG寄存器中的数据送到A地址所指定的外部设备寄存器中。此外,I/O指令还可用来发送和接收控制命令和回答信号,用以控制外部设备的工作。 有些计算机采用外部设备与存储器统一编址的方法把外部设备寄存器看成是存储器的某些单元,任何访问存储器的指令均可访问外部设备,因此不再专设I/O指令。null10. 特权指令 某些指令使用不当会破坏系统或其他用户信息,为了安全起见,这类指令只能用于操作系统或其他系统软件,而不提供给用户使用,称为特权指令。 一般来说,在单用户、单任务的计算机中不一定需要特权指令,而在多用户、多任务的计算机系统中,特权指令却是必不可少的。它主要用于系统资源的分配和管理,包括改变系统的工作方式、检测用户的访问权限、修改虚拟存储器管理的段表、页表和完成任务的创建和切换等。null在某些多用户的计算机系统中,为了统一管理所有的外部设备,输入输出指令也作为特权指令,不允许用户直接使用。需输入输出时,可通过系统调用,由操作系统来完成。 11. 其他指令 (1) 向量指令 见5.7.4小节 (2) 多处理机指令null在多处理机或多处理器系统中,为了管理共享的公共资源和相互通信,一般设置“测试与设定”或“数据交换”指令,这些指令的最主要特点是在执行过程中不允许打断。例如,在sun microsystems的SPARC处理机中有一条“读写字节”指令,它从存储器某单元读出一个字节后立即写回一个全“1”字节,可以用它来防止多个处理器同时修改共享数据区的内容。 null其方法是:当计算机总清或初始化时,在该单元中写入一个非全“1”值(例如全“0”),其后当某处理器要访问共享数据区时,先执行这条指令,当读出的值非全“1”时,表示没有处理器正在访问该数据区,因此本处理器可以对数据区的数据进行访问修改,同时将该单元置“1”,此后若有其他处理器读该单元,将得到全“1”值,表示该数据区有处理器在访问而需等待之。当处理器访问完毕时,恢复该单元为非全“1”值,此后允许其他处理器访问该数据区,所以这条指令相当于一把锁;当访问者没有将锁打开时,其他处理器不得访问被锁的数据区。null(3) 控制指令 包括等待指令、停机指令、空操作指令、开中断、关中断、置条件码指令等。 当用户程序执行完毕时,可安排一条停机指令,此时机器不再继续执行程序。但在多用户情况下,则不允许停机,因为其他用户程序可能正在等待,此时通常让机器处于动态停机状态:执行等待指令或执行只有1~2条指令的小循环程序。 空操作指令除了将程序计数器增量外(若空操作指令为字节指令则加1,4字节指令则加4),不进行其他操作。null5.5.2 双字长运算(子程序举例) 有时候,需对双字长操作数进行运算,而机器本身并没有双字长指令,这样就需要通过子程序予以实现。 1. 双字长加法运算 假设在寄存器R1,R2和R3,R4分别存放两个双字长操作数,其中R1,R3为高位。加法运算可分为两种情况讨论: (1) 假设机器设置有ADD(加法指令)和ADC(加进位的加法指令),则执行下列两条指令后在R3、R4中得到运算结果。 null 指令 操作说明 xK: ADD R2,R4 ;低位相加,R4←(R2)+(R4), 并根据运算结果置进位位C。 K+1:ADC R1,R3 ;高位相加,并加进位位C, R3←(R1)+(R3)+C (2) 假设机器仅设置ADD指令,而没有ADC指令,则应执行下列程序: 指令 操作说明 K: ADD R2,R4 ; 低位相加,R4←(R2)+(R4),并根据 运算结果置进位位C K+1: BCC K+3 ;如C=0,程序转移到K+3;如C=1,顺 序执行下一条指令 K+2: ADD #1,R1 ; R1←(R1)+1 K+3: ADD R1,R3 ; 高位相加,R3←(R1)+(R3) null2. 双字长减法运算 假设在R1,R2和R3,R4分别存放双字长被减数和减数,其中R1,R3为高位,R2,R4为低位。求两数之差。 现举例说明,设操作数字长为4位,那么双字长为8位,且设定为不带符号位的正数,被减数X:0010 1100,减数Y:0001 1010。计算得: [-Y]补=11100110, [X-Y]补=X+[-Y]补=00101100+11100110=00010010。null在上例中低位向高位产生进位信号。但在计算机中对低位进行减法运算时因低位够减,所以不产生借位,即C=0。高位部分实际上相当于补码相减。 若减数为0001 1110,则 (-Y)补=11100010, (X-Y)补=X+(-Y)补=00101100+11100010=00001110。 在上例中,低位无进位信号,但此时低位不够减,向高位借位,所以C=1。高位部分相当于反码相减。null双字长减法运算步骤可归纳如下: (1) 低位相减:若不够减,置C=1;够减,置C=0。 (2) 高位相减:若上次运算后,C=0,减数取补码;C=1,减数取反码。 null5.6 指令系统的兼容性 各计算机公司设计生产的计算机,其指令的数量与功能、指令格式、寻址方式、数据格式都有差别,即使是一些常用的基本指令,如算术逻辑运算指令、转移指令等也是各不相同的,因此尽管各种型号计算机的高级语言基本相同,但将高级语言程序(例如FORTRAN语言程序)编译成机器语言后,其差别是很大的。因此将用机器语言表示的程序移植到其他机器上去几乎是不可能的。从计算机的发展过程已经看到,由于构成计算机的基本硬件发展迅速,计算机的更新换代是很快的,这就存在软件如何跟上的问题。 null一台新机器推出交付使用时,仅有少量系统软件(如操作系统)可提交用户,大量软件是不断充实的,尤其是应用程序,有相当一部分是用户在使用机器时不断产生的,这就是所谓第三方提供的软件。为了缓解新机器的推出与原有应用程序的继续使用之间的矛盾,1964年在设计IBM360计算机中所采用的系列机思想较好地解决了这一问题。从此以后,各个计算机公司生产的同一系列的计算机尽管其硬件实现方法可以不同,但指令系统、数据格式、I/O系统等保持相同,因而软件完全兼容。当研制该系列计算机的新型号或高档产品时,尽管指令系统可以有较大的扩充,但仍保留原来的全部指令,保持软件向上兼容的特点。 null例如,Intel公司的80×86微处理器系列是完全向上兼容的,Intel8086是16位微处理器,它的指令由1~6个字节组成。随着大规模集成电路技术的发展,Intel公司在80年代初推出了在片内具有存储管理与保护机构的Intel 80286新一代微处理器。80286包括了8086的全部指令,增加了一些有关过程调用、成批数据传送的高级指令以及专用于虚地址保护方式的15条保护控制类新指令。Intel公司在1985年宣布了与8086,80286兼容的32位80386微处理器,其指令字的长度在1~10几个字节之间。null在以后发表的Pentium,Pentium Ⅱ以及1999年1月推出的Pentium Ⅲ微处理器中也都增加了一些指令,但仍保持软件向上兼容的特点。 80×86系列的第一个微处理器8086是16位微处理器,能够寻址的主存容量为1MB(20位地址)。80286地址线扩充到24位,访存空间达到16MB。从80386开始直到Pentium Ⅲ,均是32位地址线,可寻址的主存容量为4GB。这样大的寻址空间允许Intel的微处理执行多任务,这在8086是不可能实现的。null从80286开始,所有的Intel处理器可以运行在两种操作模式: 实模式和保护模式。 在实模式,该系列的所有先进处理器(包括Pentium系列在内),其操作犹似一台快速的8086(8086只能工作于实模式),只能访问1MB主存。当机器加电时,自动选择实操作模式,进入DOS操作系统(DOS是一个实模式的操作系统)。 在保护模式,4GB主存对处理器都是有效的,因此可执行专门设计的特权指令及其有关的功能,包括支持多任务操作、存储管理和保护、虚拟存储器以及片内的数据cache和指令cache。null5.7 精简指令系统计算机(RISC)和复杂指令系统计算机(CISC) 5.7.1 什么是复杂指令系统计算机 随着VLSI技术的发展,计算机的硬件成本不断下降,软件成本不断提高,使得人们热衷于在指令系统中增加更多的指令和复杂的指令,来提高操作系统的效率,并尽量缩短指令系统与高级语言的语义差别,以便于高级语言的编译和降低软件成本。另外,为了做到程序兼容,同一系列计算机的新机器和高档机的指令系统只能扩充而不能减去任意一条,因此也促使指令系统越来越复杂,某些计算机的指令多达几百条。 null但是日趋庞大的指令系统不但使计算机的研制周期变长,而且增加了调试和维护的难度,还可能降低系统的性能。 5.7.2 RISC的产生与发展 1. RISC的产生 1975年IBM公司开始研究指令系统的合理性问题,IBM的John cocke提出精简指令系统的想法。后来美国加州伯克莱大学的RISC Ⅰ和RISC Ⅱ机、斯坦福大学的MIPS机的研究成功,为精简指令系统计算机(reduced instruction set computer,简称RISC)的诞生与发展起了很大作用。 null对CISC进行测试表明,各种指令的使用频率相差悬殊,最常使用的是一些比较简单的指令,仅占指令总数的20%,但在程序中出现的频率却占80%。而较少使用的占指令总数20%的复杂指令,为了实现其功能而设计的微程序代码(参见第6章)却占总代码的80%。 复杂的指令系统必然增加硬件实现的复杂性,这不仅增加了研制时间和成本以及设计失误的可能性,而且由于复杂指令需要进行复杂的操作,与功能较简单的指令同时存在于一个机器中,很难实现流水线操作(参见第6章),从而降低了机器的速度。null另外还难以将基于CISC技术的高档微型机的全部硬件集成在一个芯片上或将大、中型机的CPU装配在一块板上,而对电路的延迟时间来讲,芯片内部、芯片之间与插件板之间的电路,其延迟时间差别很大,这也会影响CISC的速度。 由于以上原因,终于产生了不包含复杂指令的RISC。null2. RISC的发展 现将目前影响最大的一些RISC芯片及推出该产品的公司列于表5.2。 表5.2 生产RISC芯片的公司及其产品null5.7.3 RISC的特点 精简指令系统计算机的着眼点不是简单地放在简化指令系统上,而是通过简化指令使计算机的结构更加简单合理,从而提高运算速度。 计算机执行程序所需要的时间P可用下式表示: P=I×CPI×T 其中I是高级语言程序编译后在机器上运行的指令数,CPI为执行每条指令所需的平均周期数,T是每个机器周期的时间。 nullRISC是在继承CISC的成功技术并克服CISC的缺点的基础上产生并发展起来的,大部分RISC具有下述一些特点: (1) 优先选取使用频率最高的一些简单指令,以及一些很有用但不复杂的指令。避免复杂指令。 (2) 指令长度固定,指令格式种类少,寻址方式种类少。指令之间各字段的划分比较一致,各字段的功能也比较规整。 (3) 只有取数/存数指令(load/store)访问存储器,其余指令的操作都在寄存器之间进行。 (4) CPU中通用寄存器数量相当多。算术逻辑运算指令的操作数都在通用寄存器中存取。null以上这些特点将通过“5.8 指令系统举例”来说明。 (5) 大部分指令在一个或小于一个机器周期内完成。 (6) 以硬布线控制逻辑为主,不用或少用微码控制。 (7) 一般用高级语言编程,特别重视编译优化工作,以减少程序执行时间。 以上三个特点请参阅第6章。null5.8 指令系统举例 5.8.1 SPARC的指令系统 SPARC指令字长32位,有三种指令格式、六种指令类型。 1. SPARC的指令类型 (1) 算术运算/逻辑运算/移位指令31条 SPARC有多条加法和减法指令,没有乘法和除法指令,但设置了一条乘法步指令、执行一次“加和移位”操作。 null下面对4条加法指令(ADD,ADDCC,ADDX,ADDXCC)作一说明: 以CC结尾的加法指令表示除了进行加法运算以外还要根据运算结果置状态触发器N,Z,V,C;X表示加进位信号;XCC表示加进位信号并置N,Z,V,C。 null(2) LOAD/STORE指令22条 取/存字节(LDSB/STB)、半字、字、双字共20条指令,其中一半是特权指令。SPARC结构将存储器分成若干区,其中有4个区分别为用户程序区、用户数据区、系统程序区和系统数据区。并规定在执行用户程序时,只能从用户程序区取指令,在用户数据区存取数据;而执行系统程序时则可使用特权指令访问任一区。 另外还有两条供多处理机系统使用的数据交换指令SWAP和读后置字节指令LDSTUB。null(3) 控制转移指令5条 (4) 读/写专用寄存器指令8条 以上指令共计66条,此外还有: (5) 浮点运算指令 (6) 协处理器指令 由于SPARC为整数运算部件(IU),所以当执行浮点运算指令或协处理器指令时,将交给浮点运算器或协处理器处理,当机器没有配置这种部件时,将通过子程序实现。null2. SPARC的指令格式 共有三种格式。 格式1. CALL指令 OP disp (位移量,30位) 31 30 29 0 格式2. SETHI指令和Branch指令 OP rd OP2 imm22(立即数) OP a Cond OP2 disp22(位移量) 31 30 29 28 25 24 22 21 0 null格式3. 其他指令 OP rd OP3 rs1 i asi rs2 OP rd OP3 rs1 i Simm13 OP rd OP3 rs1 OPf rs2 31 30 29 25 24 19 18 14 13 12 5 4 0 其中OP,OP2,OP3为指令操作码,OPf为浮点指令操作码。实际上整数部件IU大部分指令码固定在第31,30位(OP)和第24~19位(OP3)。 null为了增加立即数长度和位移量长度,总共有3条指令将指令码缩短了,其中CALL为调用指令,Branch为转移类指令,SETHI指令的功能是将22位立即数左移10位,送入rd所指示的寄存器中,然后再执行一条加法指令补充上后面10位数据,这样就可生成32位字长的数据。 rs1,rs2为通用寄存器地址,一般用作源操作数寄存器地址。 rd为目的寄存器地址,此寄存器通常用来保存运算结果或从存储器中取来的数据。惟有执行STORE指令时,rd中保存的是源操作数,并将此操作数送往存储器的指定地址中。null加法指令的汇编语言表示形式为: ADD rs1 rs2 rd Simm13是13位扩展符号的立即数,在对它进行运算时,假如它的最高位为1,那么在最高位前面的所有位都扩展为1;假如它的最高位为0,那么在最高位前面的所有位都扩展为0。 i用来选择第二个操作数,假如i=0,第二操作数在rs2中;假如i=1,Simm13为第二操作数。null3. 各类指令的功能及寻址方式 (1) 算术逻辑运算指令 功能: (rs1) OP(rs2)→rd(当i=0时) (rs1) OP Simm13→rd(当i=1时) 本指令将rs1,rs2的内容(或Simm13)按操作码所规定的操作进行运算后将结果送rd。RISC的特点之一是所有参与算术逻辑运算的数均在寄存器中。 (2) LOAD/STORE指令(取数/存数指令) 功能: LOAD指令将存储器中的数据送rd中 STORE指令将rd的内容送存储器中null存储器地址的计算(寄存器间址寻址方式): 当i=0时,存储器地址=(rs1)+(rs2); 当i=1时,存储器地址=(rs1)+Simm13。 在RISC中,只有LOAD/STORE指令访问存储器。 (3) 控制转移类指令 此类指令改变PC值,SPARC有五种控制转移指令: ① 条件转移(Branch) 根据指令中的Cond字段(条件码)决定程序是否转移。转移地址由相对寻址方式形成。null② 转移并连接(JMPL) 采用寄存器间址方式形成转移地址,并将本条指令的地址(即PC值)保存在以rd为地址的寄存器中,以备程序返回时用。 ③ 调用(CALL) 采用相对寻址方式形成转移地址。为了扩大寻址范围,本条指令的操作码只取两位,位移量有30位。 ④ 陷阱(trap) 采用寄存器间址方式形成转移地址。 ⑤ 从trap程序返回(RETT) 采用寄存器间址方式形成返回地址。null(4) 读/写专用寄存器指令 SPARC有四个专用寄存器(PSR,Y,WIM,TBR),其中PSR称为程序状态寄存器。几乎所有机器都设置PSR寄存器(有的计算机称为程序状态字PSW)。PSR的内容反映并控制计算机的运行状态,比较重要,所以读/写PSR(RDPSR,WRPSR)指令一般为特权指令。 4. 某些指令的实现技巧 在SPARC中,有一些指令没有设置,但很容易用一条其他指令来替代,这是因为SPARC约定R0的内容恒为零,而且立即数可以作为一个操作数处理,表5.3中列出的一些指令就属于这种情况。 null表5.3 某些指令的实现 null5.8.2 Pentium微处理器指令系统 1. 程序员能见到的寄存器(图5.11) 2. Pentium指令系统 Pentium的指令格式如图5.12所示。 指令包括以下字段: (1) OP(操作码) 每条指令都有操作码,某些指令在操作码中还包含有操作数长度W(8位,16位或32位)或立即数是否需扩充符号位(S)等信息。null 图5.11 程序员能见到的寄存器 null 图5.12 Pentium的指令格式null(2) MOD/RM 本字节与下一字节,提供寻址信息。 MOD/RM字节指出操作数在寄存器中还是在存储器中。 (3) SIB 当MOD/RM为某些值时,需要SIB参与决定寻址方式。 图5.13说明在实模式下32位地址的形成过程。 寄存器与其编码之间的关系如表5.4所示。 null 图5.13 实模式下形成32位地址null表5.4 寄存器编码null(4) disp 当寻址方式指示用到disp(位移量)时,则存在8位,16位或32位的位移量字段。 (5) Imm 当寻址方式指示使用立即数时,存在8位,18位或32位立即数。 null5.8.3 IBM大型机指令系统 IBM公司于1964年推出IBM360系列机,1970年推出IBM370系统。IBM370对IBM360是完全向上兼容的,它增加了少量新指令,如长字符串指令(长传送与长比较),扩充了字节处理指令和十进制运算指令,并取消了数据对准要求。 1983年IBM推出了370的扩充结构:IBM370-XA(eXtended Architecture),首次在3080系列上实现,后来又有扩充结构ESA/370,于1986年推出3090系列。ESA/370增加了指令格式,称为扩充格式,有16位操作码,包括了向量运算与128位长度的浮点运算指令。null下面简单介绍IBM360/370的结构及其指令系统。 IBM360是32位机器,按字节寻址,支持的数据类型有:字节、半字、字、双字(双精度实数)、装配的十进制数(用四位二进制码表示一个十进制数,一个字节放两个十进制数)和未经装配(拆卸)的字符串(一
本文档为【第5章】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_358721
暂无简介~
格式:ppt
大小:444KB
软件:PowerPoint
页数:0
分类:其他高等教育
上传时间:2011-09-30
浏览量:10