版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
指令系统5.1指令系统概述5.2指令系统结构层定义5.3指令设计5.4寻址方式5.5指令系统结构的发展5.6指令系统实例
5.1指令系统概述
根据设计者、使用者不同的需求和要求,计算机系统通常采用分层方法构建。图5.1就是一种通俗的计算机系统抽象分层结构。图5.1中,下面三层为微体系结构层、指令系统结构(InstructionSystemArchitecture,ISA)层、操作系统层。图5.1计算机系统的抽象分层结构
对于硬件设计者来说,一个好的指令系统更容易被高效率实现;对于软件设计者来说,一个好的指令系统更便于编写程序代码。设计、评价指令系统一般从以下方面考虑:
(1)完备性:常用指令齐全,编程方便。
(2)高效性:程序占主存空间少,运行速度快。
(3)规整性:指令和数据使用规则统一简单,易学易记。
(4)兼容性:同一系列的低档计算机的程序能在高档计算机上直接运行,即向后兼容(BackwardCompatible)。
指令有两种表现形式:机器指令和助记符指令。在计算机内部,每条指令用一定位数(指令字长)、特定编码的二进制代码表示,称为机器指令(MachineInstruction)。机器指令是CPU唯一能够识别、可执行的指令。但机器指令不便于人的识别和记忆,于是出现了用特定英文符号来描述每条机器指令的做法,由此产生了助记符指令。所以,机器指令和助记符指令是一对一的。表5.1给出了Intelx86和RISC-V指令系统中两条加法指令的示例。
5.2指令系统结构层定义
5.2.1存储模式存储模式的定义包括存储器结构、特殊存储区(如堆栈等)、数据存储顺序、边界对齐等的确定。
1.数据存储顺序
不同的计算机系统采用不同的方式来存储数据。
1)大端存储(Big-EndianOrdering)大端存储是指将数据的最低有效字节存储在相应的高地址单元中,将最高或大端字节的地址作为字地址。该方式便于十进制数、ASCII字符串的显示、打印处理。IBMS370/390、Motorola680x0和大部分RISC系统等采用这种存储模式。
2)小端存储(Little-EndianOrdering)
小端存储是指将数据的最低有效字节存储在相应的低地址单元中,将最低或小端字节的地址作为字地址。该方式有利于算术运算,满足用同一个主存单元地址表示存储不同长度数据的需求。Intelx86、VAX、Alpha等系统以及AppleiOS、谷歌Android操作系统、微软WindowsforARM都采用这种存储模式。因为小端存储在商业上占主导地位,所以RISC-V也采用该模式。
例5.1一个32位的十六进制数据12345678H,存储在1000H地址开始的以字节编址的主存空间中,其存储结果见表5.2。
2.边界对齐
所谓边界对齐,是指数据存储在地址为2的整数倍(16位字长)、4的整数倍(32位字长)或8的整数倍(64位字长)起始的连续存储单元中,如图5.2(a)所示。当所存数据不能满足此对齐限制要求时,可填充一个或多个空白字节。Intelx86和RISC-V没有边界对齐限制,但MIPS系统有对齐限制。
在数据边界未对齐的计算机中,数据(例如一个字)的存储将跨两个边界对齐的存储单元,此时读/写一个完整的数据需要访问两次存储器,并需对高低字节的顺序进行调整,如图5.2(b)所示。
所以,为了简化硬件实现,缩短存储器的访问时间,通常选择多字节的数据在主存中存放时满足边界对齐的要求。例如,在Pentium4CPU中,不同位数的数据可按图5.2(c)所示方式储存。图5.2以小端模式存储数据(0807060504030201H)的情况
3.堆栈(Stack)
在所有计算机系统中,对于主存的大部分空间,允许在任何时间对其中的任何存储单元进行读/写操作,且读/写时间相同,这种特性称为主存的随机读/写特性。但有时我们希望对主存的操作有一定的顺序性,堆栈就是主存中被特殊定义的一块存储区域,它具有先进后出(FirstInLastOut,FILO)的操作规则。
在使用堆栈之前,先要对堆栈的大小以及堆栈在主存中的位置做出定义。使用堆栈时用如下三个专用地址寄存器来管理。
(1)堆栈指针(StackPointer,SP):指示当前可操作的堆栈单元。
(2)堆栈基址(StackBase,SB):指示堆栈的底部。
(3)堆栈界限(StackLimit,SL):指示堆栈的最顶端。堆栈界限的公式为
堆栈界限=堆栈基址±堆栈大小
图5.3所示为Intelx86和RISC-V系统中堆栈的两种基本操作,在此设定栈底地址大于栈顶地址,堆栈每次操作的数据由i个字节构成。压栈时,先做(SP)-i→SP,然后在SP指示的新存储单元中存入要保存的数据;弹出时,先将SP指示的存储单元中的数据读出,然后做(SP)+i→SP。在堆栈中存储数据总是从底部向顶部发展,无论对堆栈做压栈还是弹出操作,操作完成后,SP总是指向所有已存数据单元最上面的那个单元,称为栈顶单元。在正常堆栈操作的情况下,必然使最先存入堆栈中的数据总是最后从堆栈中读出。图5.3堆栈基本操作
堆栈在过程或子程序调用和返回、中断处理程序的进入和返回等场合被系统广泛应用,用户也可以利用堆栈进行数据保护操作。
为了防止堆栈操作错误,应注意以下几点:
(1)堆栈大小要按需求设置得足够大。
(2)用户对堆栈的压栈和弹出操作要成对进行,以防止堆栈溢出。
(3)最好将系统堆栈和用户堆栈分开,以免用户不慎破坏系统对堆栈的正常使用。
4.冯·诺依曼结构和哈佛结构
在冯·诺依曼计算机中规定,指令与数据均用二进制表示,并可在整个主存中混合存放,如图5.4(a)所示。从指令系统结构层的角度看,整个主存就是单一的线性地址空间。这种指令与数据混合存储的主存架构被称为冯·诺依曼结构。目前仍有许多计算机系统主存采用这种结构,如Intel系统、AMD系统等。冯·诺依曼结构的优点是指令和数据可以共享并充分利用主存资源;缺点是不正确的数据操作可能会破坏到指令,造成程序无法正常运行。图5.4两种主存结构
哈佛结构将主存分为指令存储器和数据存储器两个实体,所有的程序必须放在指令存储器的地址空间中,所有的数据必须放在数据存储器的地址空间中,如图5.4(b)所示。采用哈佛结构有以下优点:
(1)指令存储器只需做读出操作,这使得指令存储器的设计、控制变得较为简单,并可以加快读出指令的速度。
(2)所有的写操作都自动在数据存储器中执行,避免了数据对程序可能造成的破坏,减少了程序出错的机会。
(3)利用n位地址可以获得2个2n大小的地址空间(1个2n大小的程序空间和1个2n大小的数据空间)
哈佛结构的缺点是指令存储器和数据存储器有可能得不到充分利用。所以,指令存储器和数据存储器应根据实际需要做出不同容量的设计。目前大多数RISC系统采用哈佛结构。
需要注意的是,在一级Cache中设立分离的指令Cache和数据Cache与在主存中设立分离的指令存储器和数据存储器是不同的。前者的主存可以是冯·诺依曼结构,也可以是哈佛结构;而后者的主存就是哈佛结构。
Intelx86系统的主存采用冯·诺依曼结构,RISC-V系统的主存采用哈佛结构。
5.加载/存储体系结构
在许多RISC系统中,指令系统只提供了两条对主存操作的指令,即加载(Load)和存储(Store)指令,这使得访存指令的译码与执行逻辑大为简化。Load指令实现将主存的数据传送到寄存器,Store指令实现将寄存器的数据传送到主存。在这种加载/存储体系结构中,所有运算的源操作数由寄存器或指令提供,而不是直接来自主存;运算结果也必须放在寄存器中,而不是直接写入主存。
5.2.2寄存器组织
寄存器是存储体系中最上层(速度最快,容量最小)的存储部件,是CPU内部配合控制器、运算器工作的重要部件,也是指令系统结构层定义的重要对象。从指令系统结构层来看,寄存器是软件设计者唯一能操作的CPU内部资源。
寄存器的定义包括寄存器功能、寄存器所属层次、寄存器规模(数量)、寄存器字长等信息的确定。
寄存器的基本功能是为CPU运行提供所需信息,保存CPU运行产生的结果。寄存器的主要用途是对频繁使用的数据进行快速访问。因此,为了获得高性能和低功耗,指令系统必须设计足够多的寄存器,并且编译器要充分利用这些寄存器。
指令系统结构层可见的寄存器是可以程序访问的。其中,一部分寄存器允许用户程序使用,称为用户程序可见的寄存器,如通用寄存器;另一部分寄存器只允许在内核模式下由操作系统使用,它们通常是控制高速缓存、主存、I/O设备及其他硬件的专用寄存器。通常将用户程序可见的一组寄存器称为寄存器组(RegisterSet)或寄存器文件(RegisterFile)。
地址寄存器的作用是在CPU访问主存或外设资源时提供主存地址或I/O接口地址(外设地址),或提供生成地址的相关信息。地址寄存器可以有一到多个。变址寄存器是一种特殊的地址寄存器,它具有每次使用完内部地址之后能自动对其修改的功能。
数据寄存器主要用来存放原始数据和处理结果,作为数据传输的来源和目的地。
指令寄存器暂存从主存中获得的CPU要执行的当前指令,并将该指令输出给控制器,由控制器译码、执行它。
标志寄存器也称为程序状态字(ProgramStatusWord,PSW),是在内核模式和用户模式下均可使用的寄存器,它既用于保存CPU的当前工作状态,又用于为CPU运行提供必要的控制信息。记录在标志寄存器中、表明CPU工作状态的信息为条件码(ConditionCode),也称为状态标志。典型的条件码包括:
Z———零标志。当CPU运行结果为0时,该标志置位,否则清零。
S———符号标志。当CPU运行结果为负数时,该标志置位,否则清零。
C———进位标志。当CPU做加法运算产生进位或做减法运算产生借位时,该标志置位,否则清零。
O———溢出标志。当CPU运行结果过大或过小而超出数据可表示范围时,该标志置位,否则清零。
P———奇偶标志。当CPU运行结果符合偶校验状况(即结果中1的个数为偶数个)时,该标志置位,否则清零。
A———半加进位标志。当CPU做加/减运算时,若低4位向高4位产生进位或借位,则该标志置位,否则清零。
在标志寄存器中为CPU运行提供控制信息的标志称为控制标志,典型的控制标志有:
I———中断允许标志。当I设置为1时,允许CPU接受来自CPU之外的可屏蔽中断请求,否则中断被禁止。
T———单步跟踪标志,也称陷阱标志。当T设置为1时,允许CPU单步执行程序,否则连续执行程序。该标志主要在调试程序时使用。
5.2.3数据类型
数据作为指令的处理对象,需要有不同的类型、不同的格式。数据类型不同,则处理方法不同,需要的硬件支持也不同。
计算机系统可以处理的数据分为两大类:数值型数据和非数值型数据。数值型数据主要是面向数字计算的,是计算机系统中最早出现的数据类型,它包括带符号数与无符号数、定点整数与定点小数、浮点数、二十进制数等。非数值型数据在现代计算机中被广泛使用,如文字、图像处理,它包括逻辑数据(布尔值)、字符及字符串、汉字编码、指针(地址)等。
在高级语言中,数据通常需要事先设定好类型。而在机器语言中,数据类型取决于对其所做的操作,即指令功能。也就是说,同一个数据,对其进行逻辑运算,该数据类型即为逻辑数据;对其进行字符处理,该数据类型即为字符数据。
5.2.4I/O模式
在指令系统结构层对I/O模式的定义主要涉及I/O结构。I/O结构的设计类似于主存结构,给I/O系统中的每个I/O设备分配不同的I/O地址,对I/O设备的操作也像对存储单元一样通过I/O地址进行读/写操作。I/O地址有两种编码方式:存储器映射方式和I/O映射方式。
存储器映射方式也称统一编址方式,就是将主存的一部分地址空间分配给I/O设备。这种映射方式将主存与I/O设备放置在同一个地址空间中,I/O设备与主存被同样看待,它们使用相同的指令和控制信号,可以做完全相同的操作。这样做的好处是不需要专门的I/O指令,可以简化控制。但缺点也是明显的,在地址空间确定的情况下,两者的地址扩充会相互制约。ARM和RISC-V采用此方式。
5.2.5指令类型
指令系统是指令系统结构层的主要特征,它的每一条指令规定了计算机的基本功能,并可以被CPU执行。由指令构成的程序控制了计算机系统的运行,并决定了计算机系统要完成的任务。
逻辑运算类指令提供处理用户希望使用的其他类型数据的能力。一般计算机中都设有与、或、非、异或逻辑运算指令。有些计算机还设有位操作指令,如位测试、位清除、位设置等。
程序控制类指令用来控制程序的走向,具有改变指令执行顺序的功能。它包括无条件和条件分支(跳转)指令、无条件和条件循环指令、过程(子程序)调用和返回指令、软中断和中断返回指令。条件分支和条件循环指令依据的条件主要是标志寄存器中的状态标志,如进位标志、零标志、符号标志、溢出标志、奇偶标志。计算机之所以具有智能,在于它具有决策能力,而条件分支类指令正是决策能力的具体实现。
系统控制类指令包括空操作、等待及某些特权指令。特权指令是指具有特殊权限的指令,它们只供操作系统或其他系统软件使用,一般不直接提供给用户使用。通常在单用户、单任务的计算机中不需要设置特权指令,而在多用户、多任务的计算机系统中,必须设置特权指令。特权指令主要用于系统资源的分配和管理,如检测用户的访问权限,修改虚拟存储管理的段表、页表,改变系统的工作模式,创建和切换任务等。在某些多用户计算机系统中,为了统一管理外围设备,I/O指令也被当作特权指令,用户不能直接使用它们,需要输入/输出时通过系统调用来实现。
输入/输出(I/O)类指令完成主机与外围设备之间的信息传送,包括输入/输出数据,主机向外设发送控制命令或读取外设的工作状态等。该类指令本质上实现的也是传送操作,所以有时也将该类指令归属于数据传送类。由于硬件支持不同,因此用指令操作I/O有如下不同的方式:
(1)设置专用的I/O指令:I/O编址采用独立编址方式,即主存与I/O处于各自独立编址的地址空间。早期x86系统仅采用此方式。
(2)用存储器传送类指令实现I/O操作:I/O编址采用存储器映射方式,即主存与I/O在同一地址空间统一编址。RISC-V系统采用此方式。现代x86系统同时采用以上两种方式。
5.3指令设计图5.5指令的格式
5.3.1指令格式为了使指令能够有效地指挥计算机完成各种操作,一条指令应包含两个基本要素:操作码和地址码,如图5.5所示。
操作码(Operationcode)指定指令要完成的功能(即计算机要完成的某个基本操作)。
地址码又称操作数地址或操作数(Operand),用来提供该指令的操作对象。它可以直接提供操作数,也可以提供操作数的存放地址。
指令格式就是对操作码、地址码字段的布局及用二进制编码的表示。
5.3.2地址码设计
指令功能不同,需要的操作数数量也有所不同。对地址码字段布局可以为指令指定源操作数、目的操作数和下条指令地址等信息,格式如图5.6所示。图5.6地址码字段的格式
图5.6中,源操作数字段指示指令执行开始时所需原始数据的来源;目的操作数字段指示指令执行结束时结果数据的存放地;下条指令地址字段指示CPU欲执行的下一条指令从主存中何地址获取。根据指令需要,源操作数可以有0到多个,来源于指令本身、主存、寄存器或I/O端口;目的操作数可以有0到1个,目的地可以是主存、寄存器或I/O端口;下条指令地址字段仅在程序控制类指令或部分系统控制类指令中使用,在指令执行顺序发生改变时,由该字段提供转移地址(顺序指令地址由程序计数器PC提供)。
按照地址码字段的数量,指令也可以分为四地址指令、三地址指令、两地址指令、一地址指令和零地址指令,其指令格式如图5.7所示。图5.7多地址码字段的指令格式
指令中的地址码字段数和机器的字长有着比较密切的关系:一地址指令格式是8位机通常采用的地址码结构,16位机更多采用二地址指令格式,而32位以上的计算机有条件选择三地址结构。
指令中地址码字段数愈多,完成同样功能所需的指令条数愈少。对于相同的操作,不同地址码结构的计算机有不同的实现方案。出于指令功能、兼容性等考虑,往往在一个指令系统中会出现几种地址结构指令混杂的情况。
5.3.3操作码设计
操作码是用来指示计算机执行某种操作或完成某种功能的,每条指令有唯一确定的操作码,不同指令的操作码用不同的二进制编码表示。操作码的编码位数决定了指令系统的规模或计算机操作的种类。
1.定长操作码编码方式
对所有指令的操作码用相同位数的二进制数进行编码即为定长操作码编码方式。例如,某计算机的指令系统需要设置N条指令,若所有指令的操作码均用n位二进制数表示,则应满足关系式N≤2n。从2n个编码中选出N个编码分配给N条指令,即可完成操作码设计。
操作码长度固定的好处是操作码构造简单,有利于简化硬件设计,提高指令译码和后续执行速度;缺点是操作码占用指令空间较大,且指令规模(条数)扩充受到限制。RISC系统一般采用这种编码方式,如SUN公司的SPARC指令系统。
2.变长操作码编码方式
对不同类型的指令操作码用不固定长度的二进制数进行编码即为变长操作码编码方式,也称作扩展操作码编码方式。扩展操作码技术是一种重要的指令优化技术,其技术核心如下:
(1)使程序中指令的平均操作码长度尽可能短,以减少操作码在程序中占用的总位数。
(2)尽可能充分地利用指令的二进制数位,以增加指令字表示的操作信息。
扩展操作码的设计原则如下:
(1)如果指令字长固定,则长地址码对应短操作码,操作码长度随地址码长度缩短而增加。
(2)如果指令字长可变,则以指令使用频度(指令在程序中出现的概率)作为设计依据,使用频度高的指令用短操作码,使用频度低的指令用长操作码,这便是霍夫曼(Huffman)编码原理。
(3)设计总是从短操作码开始,并要保证当前使用的操作码编码与未来要扩展的操作码编码能够有效地区分。
1)基于霍夫曼编码原理设计变长操作码
统计发现,在程序设计过程中,由于指令功能的不同和设计者对指令使用偏好的不同,会导致一个指令系统中的各种指令的使用频度大不相同。表5.3是针对SPECint92测试程序对x86指令使用情况的统计结果。
例5.2某计算机有10条指令,它们的使用频度分别为0.30、0.20、0.16、0.09、0.08、0.07、0.04、0.03、0.02、0.01。用Huffman树(最优二叉树)对它们的操作码进行编码,并计算平均代码长度。
解图5.8为基于霍夫曼编码原理构造的Huffman树。根据Huffman树得出的Huffman编码结果及各编码的长度如表5.4所示。图5.8例5.2Huffman树
例5.3某计算机系统中有20条指令的使用频度是80%,80条指令的使用频度是15%,40条指令的使用频度是5%,试设计固定长度和可变长度的操作码。
解(1)定长操作码:140条指令可用8位操作码长度(140≤28),从256种编码中选出140种编码分配给140条指令作为它们的操作码。
(2)扩展操作码:一种设计结果如表5.5所示,其中↓代表编码连续变化。
2)基于特定规则扩展操作码
设计扩展操作码不仅要考虑操作码的可分辨性,还应考虑其是否便于快速译码和简化硬件。图5.9所示为两种以某种特定规则设计的扩展操作码。图5.9特定规则的扩展操作码编码方法
3)依据地址码数量扩展操作码
对于指令字长度固定的指令系统,为了充分利用指令的二进制位,操作码长度一般随地址码数量多少而变化。
例5.4某指令系统的指令长度确定为32位,由三地址、二地址、一地址、零地址指令组成,其中各类指令中地址字段位数如表5.6所示,问:各类指令的操作码可以设计为几位?各类指令数最多可以是多少?
5.3.4指令长度设计
指令长度的确定与CPU的复杂度、主存结构、数据传输宽度等有关。程序员希望有更多的操作码、更多的操作数、更多的寻址方式、更大的主存和寄存器地址范围,这使得指令长度趋向于更长,进而使CPU更复杂,取指令和执行指令的速度有可能会降低。所以,需要权衡考虑指令长度的确定。
指令长度设计的一般原则如下:
(1)短的操作码与多地址码字段配合,长的操作码与简单地址码组合。
(2)指令长度一般设计为数据传输宽度的整数倍。
(3)指令长度为主存储器最小可寻址单位(字节)的整数倍。
在实际的计算机系统中,有如下三种常用的设计方案:
(1)定长操作码,变长指令码。也就是说,即操作码长度固定,地址码长度随指令功能需要而变化,致使指令长度变化。在8086指令系统中,所有指令操作码长度为8位,最短的指令为1字节,最长的指令为5字节。
(2)变长操作码,定长指令码。在指令长度固定的情况下,让操作码位数随地址码长度的减少而扩展,如例5.4所示。在RISC-V指令中,除了一个固定长度的7位基本操作码字段外,还有7+3位的两个附件操作码字段,可以扩展操作码长度,以便增加指令数目,见5.6.1节。
(3)定长操作码,定长指令码。在早期的MIPS指令系统中,所有指令采用6位定长操作码、32位定长指令码的格式。
5.4寻址方式
寻址方式就是指令获取操作数的方式。换句话说,寻址方式是规定如何对地址码字段作出解释以找到所需操作数的方式,或者程序转移时找到跳转地址的方式。寻址方式的设定决定了每个地址码字段的长度(二进制位数),设计时要考虑两个方面:一是要能够有效压缩地址码字段长度,二是要能够支持灵活的程序设计。
寻址方式在指令中以以下两种方式呈现:
(1)隐式寻址:由操作码决定其寻址方式。
(2)显式寻址:指令中设置寻址方式字段,由寻址方式字段的不同编码来指定操作数的寻址方式。
5.4.1基本寻址方式
一台计算机可以采用多种寻址方式。多数计算机都会首先采用公认的基本寻址方式,之后再增加某些独特的寻址方式,以此构成本系统的寻址方式。下述寻址方式就是在大多数计算机系统中会出现的基本寻址方式。
1.隐含寻址
该寻址方式的特征是:操作数的存放地由操作码指定。以x86乘法指令mulb1为例,该指令实现(a1)×(b1)→ax,其中乘数之一的8位寄存器a1和乘积存放地16位寄存器ax被隐含指定。
2.立即寻址
该寻址方式的特征是:操作数在指令中,见图5.10。图5.10立即寻址
3.寄存器寻址
该寻址方式的特征是:操作数在指令指定的寄存器中,见图5.11。图5.11寄存器寻址
寄存器寻址在寻址方式中占有十分重要的地位,它具有如下优点:
(1)与立即寻址相比,寄存器寻址的操作数在不改变程序的情况下可以方便地修改。
(2)利用寄存器存取数据的速度比访问主存更快,功耗更小,所以有利于加快指令的执行,降低CPU功耗。
(3)由于寄存器数量有限,寄存器地址比主存单元地址要短得多,因而这种方式可以有效缩短指令长度。
4)用寄存器存放基址值、变址值可派生出其他寻址方式,使编程更具有灵活性。
4.直接寻址
该寻址方式的特征是:操作数地址在指令中,操作数在主存单元中,见图5.12。图5.12直接寻址
指令的地址字段给出操作数所在主存单元的实际地址,根据该地址直接访问主存便可获得操作数,故称直接寻址。
直接寻址方式的缺点是:直接提供的主存地址需要较多的二进制位,造成指令字较长,不便于操作数在主存中存放地址的灵活修改;若地址码位数受限,会限制操作数存放的主存空间。
5.寄存器间接寻址
该寻址方式的特征是:操作数地址在指令指定的寄存器中,操作数在主存单元中,见图5.13。图5.13寄存器间接寻址
6.相对寻址
该寻址方式的特征是:操作数地址由程序计数器和指令提供的地址偏移量决定,操作数在主存单元中,见图5.14。图5.14相对寻址
7.基址寻址
该寻址方式的特征是:操作数地址由指令指定的基址寄存器和指令提供的地址偏移量决定,操作数在主存单元中,见图5.15。图5.15基址寻址
用指令提供的基址寄存器寻址位B或寄存器地址选择RB(其中存放欲访问存储区域的基准地址),将指令中给出的偏移地址D(为带符号整数补码)与基准地址求和即获得操作数的有效地址,即EA=(RB)+D,根据EA访问主存即可获得操作数。
基址寄存器的字长应足以指向整个主存空间,而位移量只需覆盖本存储区域即可。利用基址寻址方式,既能缩短指令的地址字段长度,又可以扩大寻址空间。
相对寻址与基址寻址方式的本质相同,差别仅在于提供基准地址的寄存器不同。
8.堆栈寻址
该寻址方式通常由指令操作码指定,用在涉及堆栈操作的指令中,所寻址的操作数在堆栈中,故该寻址方式实质上也是一种隐含寻址方式。
在x86系统中,压栈、调用指令中的目的操作数地址或弹出、返回指令中的源操作数地址均由堆栈指针SP隐含指定,即EA=(SP)。依据SP对堆栈进行操作数压栈或弹出后,SP的值会自动修改指向新的栈顶单元,见图5.3。
5.4.2RISC-V和x86寻址方式
1.RISC-V寻址方式
RISC-V充分体现了RISC指令系统的特点,它在基本指令模块RV32/64I中仅采用了极简的寻址方式:立即寻址、寄存器寻址、基址寻址、相对寻址。每种寻址方式与相应类型的指令格式配合使用(见5.6.1节),使操作数获取速度尽可能地快,且能够支持较灵活的操作数获取。
2.x86寻址方式
x86指令系统采用了一套复杂的寻址方式。16位系统的指令使用1字节(ModR/M)指示操作数的寻址方式,32/64位系统的指令使用2字节(ModR/M和SIB)以提供更多、更复杂的寻址方式。
x86的寻址方式可分为三类:
(1)立即寻址:操作数以64/32/16/8位立即数的形式出现在指令中。
(2)寄存器寻址:操作数放在64/32/16/8位的通用寄存器中。
(3)主存储器寻址:按照x86系统主存的组织方式,主存的线性地址(LA)由段基址和有效地址(EA)构成,如图5.16所示。图5.16x86存储单元寻址方式示意图
图5.16中,EA计算如下:
式(5.3)中,按照4个分量组合有效地址的方法不同,可以将主存寻址分为7种模式,见表5.7。多样的寻址方式可以灵活获取操作数,同时也增加了实现的复杂度,降低了数据的获取速度。
5.5指令系统结构的发展
在已进入计算机软、硬件协同设计的今天,计算机的每一项设计决定都应该综合考虑以下因素:①技术支持;②计算机体系结构;③编程语言;④编译技术;⑤操作系统。
由于指令系统是计算机软、硬件的交界面,因此无论是计算机硬件技术的发展还是计算机软件技术的发展,都必然会引起指令系统的演变和发展。指令系统结构的发展历程见图5.17,其中CISC(ComplexInstructionSetCommputer,复杂指令集计算机)结构和RISC(ReducedInstructionSetComputer,精简指令集计算机)结构是目前在商业上占主导地位的指令系统结构。CISC设计更关注功能,RISC设计更关注速度。CISC指令系统崇尚大而全的设计理念,RISC指令系统崇尚少而精、精而快的设计理念。图5.17指令系统结构的发展
5.5.1CISC
由于硬件实现的限制,早期的计算机是简单的。随着大规模集成电路的发展和对计算机功能日趋强大的需求,指令系统受到硬件可以实现相当复杂的结构和成本一路下降的支持,变得越来越丰富和完备,形成了复杂指令集计算机,即CISC。
早期CISC设计有如下特点:
(1)指令系统复杂,即指令数多,寻址方式多,指令格式多。
(2)绝大多数指令执行需要多个时钟周期。
(3)有多种指令可以访问存储器。
(4)CPU控制器采用微程序控制方式实现。
(5)寄存器数量有限。
规模庞大的指令系统在提供丰富指令、有助于灵活程序设计的同时,也存在诸多弊端:
(1)为适应丰富的指令系统,CPU控制器必须很复杂,相应的主存储器必须有更大空间,这会增加指令执行的时间,抵消复杂指令预期带来的速度优势。
(2)繁多的指令会使计算机研制周期变长,调试和维护难度变大。
(3)复杂指令系统必然增加硬件设计和制造的复杂性,增加了研制成本。
5.5.2RISC
在20世纪70年代,很少有设计者会考虑到简化计算机体系结构与计算机实现及速度之间的相互作用。1980年Ditzel和Patterson分析了高级语言结构面临的困难,主张将计算机设计的关注点放在较简单的体系结构上。之后的CISC系统发展遇到的复杂体系结构成为系统速度提升障碍的问题,使设计者更认识到简化指令系统对构建快速计算机的重要性。
1982年以后,一种新的称作精简指令集计算机(RISC)的结构出现了。基于RISC结构的指令系统都遵从RISC思想:
①指令字定长;
②使用Load/Store指令;
③寻址方式有限;
④指令数量有限。
当时对指令系统的衡量标准也从汇编语言程序员的使用性能转向对编译器的支持能力。面向语言的机器设计策略彻底被RISC终结。
RISC结构计算机具有如下特点:
(1)只设置使用频度高的简单指令,所以指令的操作种类少,寻址方式少。
(2)指令格式规范,长度固定,便于简单统一译码,可使控制器简化,硬件结构精简。
(3)仅通过Load和Store指令访问主存。
(4)通用寄存器数量多,一般有几十甚至几百个,大多数操作在寄存器之间进行。
(5)在非流水线RISC中,单条指令可在单机器周期内完成;在流水线RISC中,对于大多数指令有CPI=1。
(6)采用硬布线控制器,不使用微代码(即微程序),有利于提高时钟频率和CPU速度,能够更好地响应中断。
(7)可简化硬件设计,降低成本,便于超大规模集成电路实现。
(8)有利于多流水线、多核CPU实现。
(9)适宜高度优化编译器(即编译程序)。
(10)精简的指令使程序阅读、分析难度加大。
(11)不能同CISC兼容。解决办法:一是将源程序在CISC机器上重新编译,二是用目标代码翻译器将CISC代码翻译成RISC代码。
随着芯片密度和硬件速度的提高,RISC系统越来越复杂(采用多流水线、多核结构),同时CISC设计也在关注与RISC相同的技术焦点,如增加通用寄存器数量和更加强调指令流水线设计等。实践表明,RISC设计中包括某些CISC特色会有好处,CISC设计吸纳RISC优点更有利于增强自身性能。目前展现的发展趋势是RISC和CISC正逐渐融合。例如RISC代表之一的PowerPC处理器设计融入了CISC技术,而CISC代表之一的x86处理器设计则采纳了RISC技术。未来,RISC系统是否会完全取代CISC系统,RISC-V是否能够统领天下,我们拭目以待。
5.6指令系统实例
5.6.1RISC-V指令系统1.RISC-V的与众不同1)免费、开放RISC-V是第一款开源的指令集架构,开源让RISC-V的免费、共享成为可能,从而降低了成本。RISC-V的免费、开源更容易获得来自操作系统、软件供应商和工具开发人员的广泛支持,每个人都可以为低功耗、性能、安全等进行优化设计,同时保持与他人设计完全兼容。
2)简约、模块化
与以往的ISA不同,RISC-V是简约、模块化的。它的核心模块是固定不变的基础整数ISA,即RV32/64I,简洁到仅有47条指令。RISC-V架构师的目标是让RV32/64I在从最小的到最快的所有计算设备上都能有效工作,并强调简约性来保证它的低成本。
3)稳定、可扩展
RISC-V不仅是一个开放的ISA,其基金会还保证基本指令集和经核准的可选扩展部分是一个不变的ISA,这种稳定性使得软件开发者确信为RISC-V编写的软件可以永远运行在所有RISC-V核上,而软件管理者可以依赖它来保护他们的软件投资。
正是由于RISC-V属于一个开放的、非营利性质的基金会,所以RISC-V完全有可能挑战主流专有ISA的主导地位。
2.RISC-V的指令格式
RISC-VISA有6种基本指令格式,如图5.18所示,其中:
opcode:操作码,该字段表示指令的基本操作。
rd:目的操作数寄存器,存放操作结果。
funct3、funct7:附加操作码。
rs1:第一源操作数寄存器。
rs2:第二源操作数寄存器。
imm:立即数(补码)或地址偏移。图5.18RISC-V指令格式
在图5.18中,R型是用于寄存器寄存器运算的指令,I型是用于立即数运算和访存Load操作的指令,S型是用于访存Store操作的指令,B型是用于条件分支操作的指令,U型是用于立即数加载和加PC的指令,J型是用于无条件跳转的指令。不同格式是通过操作码字段的值(编码)来区分的:在第一个字段(opcode)中为每种格式分配了一组不同的操作码值,以便硬件知道如何处理指令的其他部分,见图5.19。图5.19带有指令布局、格式类型和指令名称的RV32I操作码编码图
3.RV32/64I指令
RV32/64I全部指令见表5.8,该基础指令系统可以支持构建一个功能比较完整的32/64位RISC处理器。
5.6.2x86指令系统
1.Intelx86指令系统发展
随着x86CPU功能不断提升,其指令格式也在不断扩展,指令数量也在不断扩大。表5.9是x86指令系统的发展历程,从中可以看出这个系列指令系统的规模和始终坚守的向后兼容特性。据不同的统计结果显示,到2015年,x86指令已达到1338或3600条。
2.Intel64和IA-32体系结构的指令格式
Intel64和IA-32体系结构指令格式如图5.20所示,它是对8086指令格式(图中有阴影字段,占1~5字节)的扩展,它由可选的指令前缀(按任意次序)、基本操作码字段(最多3字节)、寻址方式指定字段(如果需要,由ModR/M和SIB字节组成)和地址偏移量字段(如果需要)、立即数字段(如果需要)组成。指令长度最短为1字节,最长为17字节。图5.20Intel64和IA-32体系结构指令编码格式
1)指令前缀(InstructionPrefixes)
每条指令可以加或不加前缀,指令前缀分为4组:
(1)组1:封锁和重复前缀(LockandRepeatPrefixes)。Lock前缀强制在多处理器环境中共享存储器的独占使用。Repeat前缀引发一条指令对串的每个元素重复执行。
(2)组2:段超越前缀(SegmentOverridePrefixes)。该前缀允许地址跨越不同属性的段(CS、SS、DS、ES、FS、GS)。
(3)组3:操作数长度超越前缀(Operand-SizeOverridePrefix)。该前缀允许程序在16位与32位操作数之间转换。
(4)组4:地址范围超越前缀(Address-SizeOverridePrefix)。该前缀允许程序在16位与32位地址空间之间转换。
每组(Group)包含一个到多个前缀码(每个前缀码1字节),每条指令允许使用多个前
2)操作码(Opcode)
基本操作码为1~3字节,某些指令附加的3位操作码在ModR/M字节中。该字段用来指明指令的类型和功能。8086系统对操作码采用1字节的固定长度编码,而从80386开始扩展了操作码。
Intel64和IA-32指令包括以下类型:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人事招聘面试评分标准试题及答案
- 智能家电安装调试师岗位招聘考试试卷及答案
- 自来水生产工公司招聘笔试题库及答案
- 钻孔岗前安全培训试题(钻机工)含钻机及答案
- 2026秋人教版新教材九年级上册英语Unit 5 Section A 2a-2d 教案
- 医院感染防控常见问题与处理方法
- 日常修缮维护合同范本
- 小区物业续签合同范本
- 2026年教师编制考试教育政策法规试题及答案
- 2026年江西上饶市事业单位工勤技能考试题库(含答案)
- 2026-2027学年岭南版(新版)初中美术七年级上册教学计划及进度表(第一学期)
- 2026年六安霍邱县沣源水务有限责任公司公开招聘工作人员10名考试备考试题及答案详解
- (语文)2027版高中《晨读晚测小纸条》高三二轮复习(学生+教师版)
- 湖北省鄂州市鄂城区2025-2026学年七年级下学期期末质量监测语文试卷(含答案)
- 消防接警询问要素和规范用语
- 鸟粪石细菌矿化:原理、进展及资源环境领域的创新应用
- 焊接施工进度管控方案
- 人工智能训练师(三级高级工)国家职业技能考试题库(2026年版)
- 污水处理池模板工程专项施工方案
- 2026年一级建造师《建设工程经济》考前冲刺练习题库(完整版)附答案详解
- 节假日值班值守工作制度
评论
0/150
提交评论