Presentation is loading. Please wait.

Presentation is loading. Please wait.

第4章 指 令 系 统 4.1 指令系统的发展与性能要求 4.2 指令格式 4.3 指令和数据的寻址方式 4.4 典型指令

Similar presentations


Presentation on theme: "第4章 指 令 系 统 4.1 指令系统的发展与性能要求 4.2 指令格式 4.3 指令和数据的寻址方式 4.4 典型指令"— Presentation transcript:

1 第4章 指 令 系 统 4.1 指令系统的发展与性能要求 4.2 指令格式 4.3 指令和数据的寻址方式 4.4 典型指令
第4章 指 令 系 统 4.1 指令系统的发展与性能要求 4.2 指令格式 4.3 指令和数据的寻址方式 4.4 典型指令 4.5 CISC和RISC 本章小结 习题4

2 4.1 指令系统的发展与性能要求 4.1.1 指令系统的发展   计算机系统主要由硬件和软件两部分组成。 软件是为计算机编写的各种程序。 所谓程序, 是指能完成一定功能的指令序列。 而指令则是要求计算机执行某种操作的命令, 是计算机硬件能够直接识别和执行的二进制机器指令, 简称机器指令。 从计算机组成的角度来讲,指令可认为是软件与硬件的接口。 一台计算机中所有机器指令的集合, 构成了该计算机的指令系统。

3   随着微电子技术的发展, 计算机硬件功能不断增强, 指令系统也越来越丰富, 甚至廉价的微处理器都设置了乘除运算指令和十进制运算指令。 有的微处理器还设置了浮点运算、 字符串处理指令等, 使得指令系统中指令的数目多达数百条, 寻址方式也趋于多样化。    随着集成电路的发展和计算机应用领域的不断扩大, 计算机软件的价格相对不断提高。   为了在新研制的计算机上继承现有的软件, 减少软件的开发费用, 在20世纪60年代出现了系列计算机。

4   系列计算机是指具有相同的基本指令系统和基本体系结构, 但具有不同组成和实现的一系列不同型号的机器。 典型的系列机有Intel公司的x86系列机、 Motorola公司的M68x0 和M680x0系列机、 DEC公司的Alpha系列机、 SGI公司的MIPS系列机、 IBM公司的PowerPC系列机和SUN公司的SPARC系列机等。     为了使计算机系统具有更强的功能、 更高的性能和更好的性能价格比, 以满足广泛的或专门的应用需要, 在机器指令系统的设计、 发展和改进上有两种不同的途径和方向。

5    一种途径和方向是如何进一步增强原有指令的功能以及设置更为复杂的新指令来取代原先由软件子程序完成的功能, 实现软件功能的硬化。 按照这种途径和方向来发展, 机器的指令系统越来越庞大和复杂, 采用这种途径设计成CPU的计算机为复杂指令系统计算机(Complex Instruction Set Computer, CISC)。 另一种途径和方向是如何通过减少指令总数和简化指令的功能来降低硬件设计的复杂度, 提高指令的执行速度。 按照这种途径和方向发展,机器的指令系统精炼简单, 采用这种途径设计成CPU的计算机为精简指令系统计算机(Reduced Instruction Set Computer, RISC)。 有关CISC和RISC的详细内容将在本章4.5节中介绍。

6 4.1.2 对指令系统性能的要求   计算机的性能与它所设置的指令系统有很大的关系, 它不仅与计算机的硬件结构密切相关, 而且还会直接影响到用户程序和编译程序的编制及运行效率等。 通常性能较好的计算机所设置的指令系统应满足如下四个方面的要求。

7   1. 完备性   完备性要求指令系统包含的指令丰富、 功能齐全、 使用方便, 使得在用汇编语言编写程序时, 指令系统直接提供的指令足够使用, 而不必用软件来实现。 例如, 比较转移指令可直接用硬件来实现, 也可以用基本指令编写的程序来实现。 采用硬件指令的目的是为了简化程序设计, 提高执行的速度, 但增加了CPU内部结构设计和编译程序设计的复杂度。

8 2. 有效性 有效性是指利用该指令系统所编写的程序能够高效率地运行, 主要表现为程序占用的存储空间小、 执行的速度快。  3
  2. 有效性   有效性是指利用该指令系统所编写的程序能够高效率地运行, 主要表现为程序占用的存储空间小、 执行的速度快。    3. 规整性   规整性包括指令系统的对称性、 匀齐性、 指令格式和数据格式的一致性。    对称性是指在指令系统中所有的寄存器和存储器单元都可同等对待, 所有的指令都可使用各种寻址方式。

9   匀齐性是指一种操作性质的指令可以支持各种数据类型, 如算术运算指令可支持字节、字、 双字的运算等。    指令格式和数据格式的一致性是指指令长度和数据长度有一定的关系, 以方便处理和存取, 如指令长度和数据长度通常是字节长度的整数倍。    4. 兼容性   兼容性主要表现在两个方面, 一个是同一公司生产的系列机具有软件兼容性, 另一个是不同公司的不同硬件结构的机器具有软件兼容性。

10   向后兼容是指在某个时期投入市场的该型号机器上编制的软件, 不加修改就能运行于在它之后投入市场的机器上。    而兼容机则是指不同厂家生产的具有同一体系结构的计算机, 或者具有与原装机(有版权厂家的系列机产品)软件兼容的非版权厂家的产品。 对于兼容机, 一般要求做到向上向 后兼容。 兼容机在外形、 功能、 价格上与原装机可能有很大差别, 但体系结构相同, 可运行原装机的软件。

11 4.1.3 计算机语言   为了解决一些实际问题, 我们必须编写各种功能的程序, 通过翻译程序将其转换成计算机能识别的一串指令或语句后在计算机上运行。 我们把编程所用的工具称为计算机语言。 计算机语言可分为低级语言和高级语言。    低级语言面向计算机硬件, 要求用户掌握较多的硬件 知识, 编制程序有一定的难度且开发时间较长, 一般为专业人员使用, 但是用低级语言编制的程序占用存储空间小、 执行效率高。

12   低级语言又可分为机器语言和汇编语言。 计算机能够直接识别和执行的惟一语言是二进制机器语言。 由于用二进制语言编程和阅读很不方便, 因此采用了如汇编语言和高级语言之类的符号语言。    用汇编语言编写的程序, 计算机不能直接识别, 必须将它汇编成机器代码后才能在计算机上运行。 汇编语言依赖于计算机的硬件结构和指令系统, 不同的机器有不同的指令系统, 所以用汇编语言编写的程序不能在其他类型的机器上运行。

13 4.2 指令格式 一条指令通常由操作码和地址码两部分组成, 其格式为:
         4.2 指令格式 一条指令通常由操作码和地址码两部分组成, 其格式为: 操作码是该指令所要完成的操作的编码, 不同的操作码表示不同的指令功能, 它是指令格式中必不可少的部分; 地址码是该指令操作所需要的数据地址的编码。 地址码是一个广义的概念, 它可以表示操作数据的地址或与操作数据相关的地址, 即给出数据在主存单元的地址或在寄存器的地址, 它也可以表示操作数本身或作为地址位移量, 还可以指出操作结果的存放地址等, 因此也称为形式地址。

14 1. 三地址指令 OP 4. 零地址指令 空操作指令NOP、 停机指令HLT
4. 零地址指令   1. 三地址指令 OP 空操作指令NOP、 停机指令HLT OP A1 A2 A3 8051的比较转移指令CJNE R0, R1, NEXT, 其中NEXT为标号 2. 二地址指令    OP A1 A2 x86指令ADD AX, BX 3. 一地址指令 OP A x86指令INC AX

15 4.2.2 操作码   操作码的位数决定了不同功能指令的多少, 位数越多, 所能表示的操作功能就越丰富。   指令的操作码通常有两种编码格式: 一种是等长操作码, 另一种是变长操作码。 等长操作码对于简化硬件设计、 减少指令译码时间非常有利, 如IBM370指令系统, 操作码的长度固定为8位。 而变长操作码的操作码长度是可变的, 且分散在指令字的不同字段中, 这种格式能够有效地压缩程序中操作码的平均长度, 如Pentium、 SUN SPARC指令系统。

16   1. 等长操作码   设指令格式中等长操作码的位数为n位, 则该机器最多可以设计2n条不同功能的指令。   反过来, 若指令系统中包含有N条不同功能的指令, 采用等长操作码设计时, 至少需要[lg N]位。 等长操作码的指令格式如图4.1所示, 由于不同指令的地址码的个数不同, 指令的长度也是变化的。

17 图4.1 等长操作码的指令格式

18   2. 变长操作码   变长操作码具体有两种不同的编码, 即Huffman(哈夫曼)编码和扩展操作码。 实际上, 扩展操作码是Huffman编码与等长操作码的折中编码方案。 扩展操作码的指令格式如图4.2所示。 图4.2 扩展操作码的指令格式

19   假设某机器的指令系统中所有指令的长度都固定为16位, 有二地址指令、 一地址指令和零地址指令等三种指令格式。 设二地址指令的操作码字段为4位, 每一地址码字段均为6位, 一地址指令和零地址指令的操作码采用扩展操作码的方法构成, 如图4.2所示。 二地址指令的操作码为4位, 如果全部用来表示二地址指令, 则可以表示24=16种。 如果机器只需要15条二地址指令, 则可以取其中的0000~1110共15种组合来表示二地址指令的操作码。 将剩下的一种编码1111作为一地址指令操作码的扩展标志, 扩展到二地址指令的A1字段,就形成了一地址指令。

20   由于A1字段的位数是6位, 因此用一个扩展标志1111就可以扩展出26=64种一地址指令的操作码。 如果机器只需要62条一地址指令, 即取 ~ 作为一地址指令的操作码, 则余下的两种编码 、 都可以作为零地址指令操作码的扩展标志, 扩展到一地址指令的A字段, 就形成了零地址指令。 由于A字段的位数是6位, 因此用两个标志位最多可以扩展出2×26=128种零地址指令的操作码。 上面描述的操作码扩展情况如表4.1所示。

21 例:一条16位指令:0xFF23,它是几地址指令?操作数是多少?
求:能够编码的二地址指令的最大条数?一地址?零地址?

22 [例4. 1]设一台模型机共有7种不同的指令, 使用频度Pi如表4

23

24 指令操作码的平均码长, 即平均操作码编码长度可用如下公式计算:
  指令操作码的平均码长, 即平均操作码编码长度可用如下公式计算: 其中, n为指令的种类。 在表4.2中, 等长操作码的平均码长为3位; 扩展操作码的平均码长为

25       =0.40×2+0.30×2+0.15×2+0.05×4        +0.04×4+0.03×4+0.03×4       =2.3(位)   由此可见, 操作码扩展技术是一种重要的指令优化技术, 它可以缩短指令的平均长度,减少程序的总位数及增加指令字所能表示的操作信息和地址信息。 当然, 扩展操作码比等长操作码的译码要复杂, 相应控制器的电路设计也较复杂。

26 4.2.3 指令字长与机器字长的关系   一个指令字中所包含的二进制代码的位数, 称为指令字长度, 简称指令字长。 而机器字长是指计算机一次能直接处理的二进制数据的位数, 通常所说的64位机就是指机器字长为64位。 指令字长与机器字长有密切关系。 1、指令字长等于机器字长的指令, 称为单字长指令; 2、指令字长等于机器字长一半的指令, 称为半字长指令; 3、指令字长等于机器字长两倍的指令, 称为双字长指令。 在很多计算机系统中, 为便于指令的存取, 机器字长通常与主存单元的位数相一致。

27   在计算机系统中, 如果各种指令的指令字长度是相等的, 则称为定长的指令格式。 如果各种指令的指令字长度是变化的, 则称为变长的指令格式。 如SUN SPRAC采用的是定长的指令格式, 而IBM370、 PDP-11、 Pentium采用的则是变长的指令格式。    计算机的指令格式与机器的字长、 存储器结构及指令的功能都有很大的关系。 因此, 如何合理、 科学地设计指令系统, 使指令字既能给出足够的信息, 其长度又尽可能地短, 又能方便存取、 缩短取指时间和节省存储空间, 是提高机器综合性能的主要措施之一。

28   [例4.2] 某指令系统采用定长的指令格式, 设指令字长为16位, 每个地址码的长度为6位, 指令分为二地址指令、 一地址指令和零地址指令三类。 若二地址指令为K种, 零地 址指令为L种, 问一地址指令最多能设计多少种。 (K ≤ 24-1, L ≤ 26 )   解: 画出三类指令的指令格式如图4.3所示。   设一地址指令为X种, 根据题意, 有     ((24-K)×26-X)×26≥L     X≤210-K×26-L×2-6 所以, 一地址指令最多能设计[210-K×26-L×2-6]种(加括号“[ ]”表示取整)。

29 图4.3 三类指令的指令格式

30 4.2.4 指令格式举例   不同的机器在指令格式的设置上各有不同的考虑, 即使同一种机器也因为指令为不同类型而采用几种格式, 下面以IBM370和PDP-11为例, 简要介绍大型机和小型机中有代表性的指令格式的设置情况。    1. IBM370的指令格式   IBM370曾是大型机的重要代表, 它根据操作数的不同来源将指令分为RR型、 RS型、 RX型、 SI型和SS型。 相应地设置了5种主要的指令格式, 如图4.4所示。

31 图4.4 IBM370的指令格式

32   IBM370是32位机器, 按字节寻址, 支持的数据类型有字节、 半字、 字、 双字、 压缩BCD码和非压缩BCD码。 机内有16个32位的通用寄存器、 4个双精度(64位)浮点寄存器。    IBM370采用变长的指令格式, 指令基本字长为16位, 根据指令中所包含的存储单元地址数, 指令长度可增加到32位或48位。 没有对操作码进行扩展的情况, 几乎所有指令的操作码都集中在指令字的高8位, 其中最左边两位表明指令的格式和长度, 其余6位用来规定具体的操作。

33   图4.4中, Ri、 Rj为16个通用寄存器中的任意两个寄存器号, 分别用4位字段表示。 Rx为变址寄存器号, Rb为基址寄存器号, 均借用16个通用寄存器, 因此也分别占4位。 A为 形式地址, 占12位。 I为立即数, 占8位, 一般用来表示较小的常数或字符。 L可以是一个8位字段或两个4位字段, 用来指定一个或两个操作数的长度。 在RR格式中, 两操作数均 来自通用寄存器, 所以指令字长为16位。 RX格式中, 一个操作数来自通用寄存器, 另一操作数通过Rx和Rb的内容与A相加, 获得其存储器有效地址, 指令字长增加到32位。

34   RS格式与SI格式类似, 只不过前者指令提供了三个地址信息, 两个为通用寄存器号, 另一个是由基址寄存器和位移量形成的有效地址; 后者则在指令中直接给定立即数。 SS格式给出两个存储单元地址, 均通过基址寻址获得, 使指令字长增加为48位。 用SS格式来实现将一组数据从存储器某一区间传送到另一区间的操作是非常方便的。

35 题目解读 4.3 指令和数据的寻址方式 指令的寻址方式  形成指令有效地址的方式, 称为指令的寻址方式。 指令的寻址方式有两种, 即顺序寻址方式和跳跃寻址方式。   1. 顺序寻址方式   计算机每次访存取指时, 指令的地址都是直接由程序计数器PC给出的, 取指完成后PC自动进行调整, 形成下一条指令在主存单元的地址, 从而保证程序的顺序执行。 指令的顺序寻址方式是指当执行一段程序时, 要执行的下一条指令便是程序中当前正在执行指令的下一条指令。 需要分析这句话

36 假定每条指令字长为2字节。程序在内存中的存储如下: …
假定每条指令字长为2字节。程序在内存中的存储如下: …. 0x0FE:34 0x0FF:10 0x100:AB 0x101:CD 0x102:12 0x103:34 …. 当前[PC]=0x100,则: 1、要取出的指令的有效地址是? 2、指令字是什么? 3、下一条指令的有效地址是什么?

37   2. 跳跃寻址方式   指令的跳跃寻址方式是指程序不是顺序执行的, 要执行的下一条指令的地址并不是程序计数器PC的当前值, 而是根据当前指令的执行结果来确定的。 例如条件转移指令, 它在条件满足的情况下立即修改程序计数器PC的内容, 等到下一次取指令时, 就已经完成转移了。   再如无条件转移指令、 调用子程序指令等都是直接跳跃到另外一个地址去执行程序, 这些指令都有修改PC内容的功能。 修改PC的方法有两种: 一种是在当前PC值的基础上加减一个位移量, 这称为相对寻址; 另一种是直接替换PC的值, 称为绝对寻址。

38 复习: 1. 计算机系统中,硬件能够直接识别的指令是() A. 机器指令 B. 汇编语言指令 C. 高级语言命令 D. 特权指令 2
复习: 1. 计算机系统中,硬件能够直接识别的指令是() A. 机器指令 B. 汇编语言指令 C. 高级语言命令 D. 特权指令 2. 下列几项中,不符合RISC指令系统特点的是() A. 指令长度固定,指令种类少 B. 寻址方式种类尽量多,指令功能尽可能强 C. 增加寄存器的数目,以尽量减少访存次数 D. 选取使用频率最高的一些简单指令以及很有用但不复杂的指令 3. 寻址方式是指寻找指令或操作数的_______地址的方法。 4. 寻址分为_________寻址和____________寻址。 5.指令集大致可以分为RISC指令集和________指令集。 6. 某指令系统字长为16位,地址码4位,试提出一种方案,使该指令系统有8条三地址指令、16条二地址指令、128条一地址指令。

39 4.3.2 操作数的寻址方式   所谓操作数的寻址方式, 是指形成操作数的有效地址的方式。 常见的寻址方式有隐含寻址、 立即寻址、 寄存器直接寻址、 寄存器间接寻址、直接寻址、 间接寻址、 相对寻址、 基址寻址、变址寻址、自动增量/减量寻址及堆栈寻址共11种。    需要提醒读者的是, 一台计算机的指令系统不一定同时具有这11种寻址方式, 而有的还可能会采用一些更复杂的寻址方式, 如x86系列机中采用的段寻址方式, 某些大型机中采用的存储器二次间接寻址方式、 复合寻址方式等。

40   在描述操作数的寻址方式时, 本书将使用如下符号:   OP: 操作码。   X: 寻址模式。   I: 间接特征。   R: 通用寄存器。   Rb: 基址寄存器。   Rx: 变址寄存器。   A: 形式地址, 它可以是操作数的有效地址、 地址位移量或立即数等。   E: 操作数的有效地址。   (E): 地址E的内容。   S: 操作数。

41 以下我们以一地址指令为例, 介绍操作数的寻址方式。 设一地址指令的基本格式如下:
  以下我们以一地址指令为例, 介绍操作数的寻址方式。 设一地址指令的基本格式如下: 其中, X、 I、 A组成该指令操作数的有效地址。 若操作数的寻址方式中只有直接和间接两种, 则只设计间接特征位I, 一般I=0表示直接, I=1表示间接; 若操作数的寻址方式中直接和间接特征与其他寻址方式的结合不是很明显, 则只设计寻址模式, 一般用X、 MOD或M等表示。

42   若操作数的寻址方式中直接和间接特征能与其他寻址方式结合成各种复合寻址方式, 则可同时设计寻址模式X和间接特征位I。 另外, 在此格式中假设系统中的特殊寄存器都只有一个, 若有多个特殊寄存器, 则需要在指令格式中设计相应的  地址字段。    1. 隐含寻址   有些类型的指令不是明显地给出操作数的地址, 而是隐含地由累加器给出操作数。    例如, 8086汇编语言中有: CWD; 把AX中的内容按照符号位扩展为DX: AX双字, 源操作数的地 址隐含为AX寄存器。

43 IDIV BL; 把AX中的带符号数除以BL寄存器中的带符号数, 其中一个源 操作数的地址隐含为AX寄存器   又例如, Z80汇编语言中有:  AND 0FH; 把累加器A的内容与立即数0FH相“与”, 其中一个源操作数 的地址隐含为累加器A   2. 立即寻址   指令的形式地址字段给出的不是操作数的地址, 而是操作数本身, 这种寻址方式称为立即寻址。   例如, 8086汇编语言中有: 

44   MOV AX, 1234H; 把立即数1234H传送到AX寄存器, 源操作数采用的就是立即寻址。立即寻址用于给寄存器或存储单元赋初值。 由于指令自带操作数, 因此取操作数时不需 要额外的访存时间。   3. 寄存器直接寻址   寄存器寻址可分为寄存器直接寻址和寄存器间接寻址两种, 通常所说的寄存器寻址指的是寄存器直接寻址。 这里的寄存器一般为通用寄存器, 在某些计算机系统中, 基址寄存器和变址寄存器也可以作为通用寄存器使用。

45    在单地址指令中, 若操作数的寻址方式同时具有寄存器直接寻址和寄存器间接寻址两种寻址方式, 并且不再采用其他的寻址方式, 则该指令的指令格式设计如图4.6和4.7所示,指令格式中, I为间接特征位, 占1位。 I=0, 表示寄存器直接寻址, I=1, 表示寄存器间接寻址。 R为寄存器的编码, 即寄存器的地址。 如果CPU中有N个通用寄存器, 则指令格式中的寄存器寻址段占[lb N]位。   寄存器直接寻址的操作示意图如图4.6所示。 在寄存器直接寻址中, 寄存器的编码R为操作数的有效地址, 而寄存器R中的内容为操作数。 即操作数的有效地址E=R, 操作数S=(E)=(R)。

46 图4.6 寄存器直接寻址方式

47   由于采用寄存器寻址时, 操作数均来自于CPU内的通用寄存器, 因此操作速度快。 这种寻址方式被广泛应用于使用频度高的算术逻辑运算类指令中, 在汇编程序设计中应用得最普遍。    4. 寄存器间接寻址   寄存器间接寻址的操作示意图如图4.7所示。 在寄存器间接寻址中, 寄存器R的内容为操作数在主存中的有效地址, 由寄存器R的内容访存所得到的内容才是真正的操作数, 即操 作数的有效地址E=(R), 操作数S=(E)=((R))。

48 图4.7 寄存器间接寻址方式

49   5. 直接寻址   在单地址指令中, 若操作数的寻址方式同时具有直接寻址和间接寻址两种寻址方式, 并且不再采用其他的寻址方式, 则该指令的指令格式设计如图4.8和4.9所示, 指令格式中, I为间接特征位, 占1位。 I=0, 表示直接寻址, I=1, 表示间接寻址。    直接寻址的操作示意图如图4.8所示。 在直接寻址中, 指令中的形式地址就是操作数在主存中的有效地址, 即操作数的有效地址E=A, 操作数S=(E)=(A)。

50 图4.8 直接寻址方式 在直接寻址中, 指令中的形式地址就是操作数在主存中的有效地址, 即操作数的有效地址E=A, 操作数S=(E)=(A)。

51   6. 间接寻址   通常所说的间接寻址是指存储器间接寻址。 在间接寻址中, 指令的形式地址字段并不是操作数在主存的有效地址, 而是操作数有效地址的指示器。 由指令中的形式地址可以间接找到或推导出操作数在主存的有效地址。    存储器间接寻址有一次间接和多次间接两种情况, 大多数计算机只允许一次间接。 存储器一次间接寻址的操作示意图如图4.9所示。 指令中的形式地址A是操作数在主存中有效地址的地址, 即操作数的有效地址E=(A),操作数S=(E)=((A))。

52 图4.9 一次间接寻址方式 操作数的有效地址E=(A),操作数S=(E)=((A))

53   7. 相对寻址——通常用于指令寻址   相对寻址是相对于程序计数器PC而言的。 指令中的形式地址A是一个地址位移量, 用补码表示, 即位移量的最高位为符号位, 其值可正可负。 相对寻址方式的操作示意图如图 4.10所示。 在相对寻址方式中, 操作数在主存中的有效地址等于程序计数器PC的内容加上指令格式中的位移量, 即操作数的有效地址E=(PC)+A, 操作数S=(E)=((PC)+A)。

54 图4.10 相对寻址方式

55 8. 基址寻址 在基址寻址中, 指令中的形式地址A是一个地址位移量, 用补码表示, 其值可正可负。基址寻址的操作示意图如图4
  8. 基址寻址   在基址寻址中, 指令中的形式地址A是一个地址位移量, 用补码表示, 其值可正可负。基址寻址的操作示意图如图4.11所示。 操作数在主存中的有效地址等于基址寄存器的内容 加上地址位移量, 即操作数的有效地址E=(Rb)+A, 操作数S=(E)=((Rb)+A)。    基址寻址的优点在于可以扩大寻址的空间, 因为基址寄存器的位数远超过形式地址的位数。

56 图4.11 基址寻址方式

57 9. 变址寻址 在变址寻址中, 指令中的形式地址A是一个地址位移量, 用补码表示, 其值可正可负。 变址寻址的操作示意图如图4
  9. 变址寻址   在变址寻址中, 指令中的形式地址A是一个地址位移量, 用补码表示, 其值可正可负。   变址寻址的操作示意图如图4.12所示。 操作数在主存中的有效地址等于变址寄存器的内容加上地址位移量, 即操作数的有效地址E=(Rx)+A, 操作数S=(E)=((Rx)+A)。

58 图4.12 变址寻址方式

59   变址寻址的优点在于可以对一个连续存储区域中的数据, 如数组或表格类的数据进行相同的操作或运算, 也可实现程序块有规律的变化, 因为形式地址提供了数据在存储区域的起始地址, 而变址寄存器的内容相当于相对于起始地址的位移量, 在不改变指令本身的前提下,若使变址寄存器的内容有规律的变化(如自增或自减一个常数), 就可实现对数据有规律的访问。

60   在基址或变址寻址中, 若基址或变址寄存器的个数超过1个, 则需在指令格式中对基址或变址寄存器进行编码。 例如, 假设系统中有4个变址寄存器, 则变址寄存器的编码占用2位, 对应的一地址指令格式可设计如下:

61   10. 自动增量/减量寻址   这是寄存器间接寻址的一种变型, 某些机器设计有能够自动增加/减少其内容的寄存器,每执行该指令一次, 寄存器的内容就可以自动增量/减量。   在自动增量寻址方式中, 操作数在主存中的有效地址等于寄存器的内容或寄存器的内容与位移量之和, 同时每执行该指令一次, 寄存器的内容就自动增量(根据操作数是字节、 字、 双字或四倍字分别增加1、 2、 4、8)。 常用助记符为(R)+, 加号在括号之后, 形象地表示先操作后修改寄存器的内容。

62   在自动减量寻址方式中, 寄存器内容先减去数据类型长度, 然后再用寄存器的内容或寄存器的内容与位移量之和形成操作数在主存中的有效地址。 常用助记符为-(R), 减号在括号之前, 形象地表示先修改寄存器的内容后操作。 其具体操作过程如图4.13所示。

63 操作数的有效地址: E=(R) S=(E)=((R)) 操作的后效: (R)=(R)+1,2,4,8 操作数的有效地址: E=(R)+A S=(E)=((R)+A) 操作的后效: (R)=(R)+1,2,4,8 图4.13 自动增量/减量寻址方式

64   在自动增量/减量寻址中, 操作数在主存中的有效地址都为E=(R)或E=(R)+A, 操作数S=(E)=((R))或S=(E)=((R)+A), 只是修改R内容与寻址的先后次序不一样而已。   在相对寻址、 基址寻址、 变址寻址、 自动增量/减量寻址等寻址方式中, 为保证加法运算结果的正确性, 在进行加法运算前, 需将位移量的符号位向前扩展直到与程序计数器PC、 基址寄存器Rb、 变址寄存器Rx、 通用寄存器R的位数相同。

65   11. 堆栈寻址   堆栈有寄存器堆栈和存储器堆栈两种形式, 现代计算机大都采用存储器堆栈。 存储器堆栈是由程序员在主存空间开辟的一个以后进先出(LIFO)方式来访问的存储区域。 使用存储器堆栈的优点是堆栈的容量大, 并且访问方便, 缺点是进栈和出栈的速度慢。 操作数存放在堆栈的寻址方式, 称为堆栈寻址。 采用堆栈寻址的典型指令包括堆栈操作指令、 中断调用与返回指令、 子程序调用与返回指令等。

66   堆栈的栈顶由堆栈指针SP指示, 通常堆栈的操作都在栈顶进行。 堆栈操作指令一般只有两条: 1、进栈指令Push:用来将CPU内寄存器的内容或某一存储单元的内容压入堆栈栈顶, 同时修改堆栈指针SP的值 2、出栈指令Pop:从栈顶取出数据送入CPU内的通用寄存器或某一存储单元, 同时修改堆栈指针SP的值。 数据的进栈和出栈操作与堆栈指针的修改是有次序的, 对于不同的计算机, 其操作次序不一定相同。 例如, 对于8086 CPU而言,进栈和出栈操作均以字(两个字节)为单位,内存按字节编址, 进栈时SP向地址减小的方向变化, 其进栈操作过程为:

67 (1)先将(SP)-2→SP, (2)数据进栈, 即将数据送入以(SP)和(SP)+1为地址的两个字 节单元中。 出栈操作过程正好相反: (1) 先将数据出栈, 即将以(SP)和(SP)+1为地址的两个字节单元中的数据弹出, (2) 将(SP)+2→SP。 但对于MCS-51系列单片机而言, 进栈和出栈操作均以字节为单位, 进栈时SP向地址增大的方向变化。   若主存按字编址, 进栈和出栈均以字为单位, 假设一个机器字为两个字节, 进栈时SP向地址减小的方向变化, 则进栈、 出栈操作过程如图4.14所示。

68 push R pop R 图4.14 堆栈操作示意图 (a) 进栈操作; (b) 出栈操作

69 我们用Hoare逻辑来表示指令push R的语义:
{pre} push R {post} {(sp)是合法的栈顶地址/\ (R)是合法的操作数} push R { (sp)’= = (sp)-2 /\ ((sp)’)= = Low(R) /\ ((sp)’+1)= =High(R) /\ (R)’= =(R) }

70 4.3.3 指令格式的分析与设计 [例4.3] 设某类指令格式如下所示, 其中OP为操作码字段, 试分析指令格式的特点。
  解: 指令格式的特点如下:   单字长二地址指令;   操作码字段OP为6位,最多可以设计64条不同功能的指令; 源操作数和目的操作数均来自于通用寄存器(可分别指定16个通用寄存器), 所以该类指令为RR型。 由于该类指令的操作数均来自于CPU内的寄存器, 因此操作速度快, 这类指令结构常用于使用频度较高的算术逻辑运算类指令。

71 [例4.4] 设某类指令格式如下所示, 其中OP为操作码字段, 试分析指令格式的特点。
解:指令格式的特点如下: 1、双字长二地址指令; 2、 操作码字段OP为6位, 最多可以设计64条不同功能的指令; 3、一个源操作数来自于通用寄存器(可分别指定16个通用寄存器) 4、另一个源操作数来自于存储器且采用变址寻址, 操作数在存储单元的有效地址等于变址寄存器(可分别指定16个变址寄存器)的内容加上位移量, 所以该类指令为RS型。

72 分析指令主要从这几方面入手:   ① 几字长几地址指令;    ② 操作码字段为多少位, 最多可以设计多少条不同功能的指令;    ③ 源操作数和目的操作数分别来自于通用寄存器还是存储器, 分别说明其寻址方式, 可分别指定多少个通用寄存器或特殊寄存器, 该类指令为什么类型;    ④ 该类指令的适用场合。

73   [例4.5] 一种RS型指令的结构如下所示: 其中, OP为操作码字段, R为通用寄存器字段, MOD为寻址方式字段, Rb为基址寄存器字段, Rx为变址寄存器字段, 通过MOD、 R、 Rb、 Rx、 A的组合, 可构成如表4.3所示的寻址方式。 请写出6种寻址方式的名称

74

75   解: ① 直接寻址; ② 相对寻址; ③ 基址寻址; ④ 变址寻址;⑤ 间接寻址; ⑥ 寄存器间接寻址。    值得注意的是, 此题的RS型指令格式中设计了MOD、 R、 Rb和Rx字段, 表示该类指令的存储器操作数最多可采用8种不同的寻址方式, 可访问的通用寄存器最多为4个, 基址寄存 器最多为2个, 变址寄存器最多为4个。 若在使用基址寻址时所访问的基址寄存器是系统默认的某一个特定的寄存器, 则指令格式设计时不必设计Rb字段。 Rx的设计与Rb的设计类似。

76 [例4.6] 设有一台计算机, 其指令长度为16位, 有一类RS型指令的格式如下:
其中, OP为操作码, 占6位; R为寄存器编号, 占2位, 可访问4个不同的通用寄存器; MOD为寻址方式, 占2位, 与形式地址A一起决定源操作数, 规定如下: MOD=00, 为立即寻址, A为立即数; MOD=01, 为相对寻址, A为位移量; MOD=10, 为变址寻址, A为位移量。 R采用寄存器直接寻址

77   如图4.15所示, 假定要执行的指令为加法指令, 存放在1000H单元中, 形式地址A的编码为01H, 其中H表示十六进制数。 该指令执行前存储器和寄存器的存储情况如图4.15 所示, 假定此加法指令的两个源操作数中一个来自于形式地址A或者主存, 另一个来自于目的寄存器R0, 并且加法的结果一定存放在目的寄存器R0中。

78 图4.15 存储器和寄存器中的数据

79   在以下几种情况下, 该指令执行后, R0和PC的内容为多少?   (1) 若MOD=00, (R0)=____;   (2) 若MOD=01, (R0)=____;   (3) 若MOD=10, (R0)=____; (PC)=____。   解:(1) 若MOD=00, 为立即寻址, 则指令格式中的形式地址部分即为立即数, 因此一个源操作数为01H, 另一个源操作数为R0的内容0015H, 加法指令执行的结果为(R0)=0016H。 注意:要执行的指令在地址 1000H中,当把该指令读入CPU 开始执行之前,(PC)’=(PC)+1

80   (2) 若MOD=01, 为相对寻址, 则一个源操作数的有效地址E=(PC)+A,在执行加法指令时,PC的值为下一条指令的地址, 即(PC)=1001H, 由此可以算出这个源操作数的有效地址为E=1001H+01H=1002H, 这个操作数为(E)=1150H, 另一个源操作数为R0的内容0015H, 加法指令执行的结果为(R0)=1165H。   (3) 若MOD=10, 为变址寻址, 则一个源操作数的有效地址E=(Rx)+A, 由此可以算出这个源操作数的有效地址为E=1002H+01H=1003H, 这个操作数为(E)=1250H, 另一个源操作数为R0的内容0015H, 加法指令执行的结果为(R0)=1265H; 在执行加法指令时, PC的值为下一条指令的地址, 即(PC)=1001H。

81 [例4.7] 已知某计算机系统中有一类RS型指令, 其指令格式如下:
该指令长度为16位, 已知CPU中有8个16位长的通用寄存器, 这些寄存器也可作为基址寄存器使用, 若要构造16条RS型指令, 问: (1) 该类指令各段占用多少位? (2) 能寻址的最大主存地址为多少?

82    (3) 若将RS型指令中的操作码段扩展到寄存器寻址段而构成S型指令, 那么此时RS型指令最多为多少条?在此基础上S型指令最多可以设计多少条? 基址寻址的有效地址E=(Rj)+A (Rj)的范围:0x0000~0xFFFF(0~216-1) A用补码来表示,其范围是100000b~011111b(-25~25-1) 位移量A用补码表示, 最大值为25-1, 基址寄存器的最大值为216-1,因此该类指令能寻址的最大主存地址为216+25-2。   

83   (2) 由于该类指令只有基址寻址访问主存, 因此寻址的最大主存地址只由基址寻址决定。   基址寻址的有效地址E=(Rj)+A, 位移量A用补码表示, 最大值为25-1, 基址寄存器的最大值为216-1,因此该类指令能寻址的最大主存地址为216+25-2。   (3) RS型指令的操作码段占4位, 最多有16种编码, 但至少要留一种编码作为S型指令操作码的扩展标志, 因此RS型指令最多为15条; 在S型指令操作码只使用一种扩展标志的基础上, S型指令最多可以设计8条。

84   此例中要求计算能寻址的最大主存地址, 除此之外, 还要区分诸如寻址的范围、 寻址的地址空间大小、 寻址的最大存储空间大小等概念。 寻址的范围是指在所有访存的寻址方式中,从0到某一最大访存地址, 如此例中的寻址范围为0~216+25-2; 寻址的地址空间大小是指在所有访存的寻址方式中, 能访问的地址的个数, 如此例中能寻址的地址空间大小为216+25-1; 寻址的最大存储空间大小带有存储单位, 如B、 KB、 MB等, 它等于能寻址的地址空间的大小乘以一个地址所存储的字节数, 如此例中能寻址的存储器空间的大小为 (216+25-1)×2 B。

85      4.4 典 型 指 令 4.4.1 指令的分类   不同计算机的指令系统包含的指令条数各不相同, 有的只有几十条指令, 如RISC-Ⅰ只有31条指令, SUN SPARC只有75条指令, 有的则有几百条, 如VAX 11/780有303条指令, Pentium有191条指令, Pentium 4有385条指令。 指令的类型在不同的计算机中也具有很大的差别, 但有些常用的指令类型是所有计算机共有的。

86    按指令功能的不同, 一个较完善的指令系统应包括数据传送指令、 算术运算指令、 逻辑运算指令、 移位指令、 程序控制指令、 输入/输出指令、 字符串处理指令、 特权指令、 处理器控制指令等。   1. 数据传送指令   数据传送指令的功能是实现立即数到寄存器或主存单元以及数据在寄存器与寄存器之间、寄存器与主存单元之间、 主存单元与主存单元之间的传送。 数据传送指令一般包括取数指令、 存数指令、 传送指令、 成组传送指令、 数据交换指令、 清累加器指令、 堆栈操作指令等。

87   2. 算术运算指令   算术运算指令的功能是实现定点数或浮点数的加减乘除运算。 算术运算指令一般包括二进制定点加减乘除指令、 二进制浮点加减乘除指令、 十进制定点加减乘除指令、 十进制 浮点加减乘除指令等。 不同的机器, 包含的指令条数各不相同, 如有的只具有定点数算术运算指令, 有的则具有浮点运算与十进制运算指令。   3. 逻辑运算指令   逻辑运算指令的功能是完成逻辑运算。 逻辑运算指令一般包括逻辑非指令、 逻辑加指令、逻辑乘指令、 按位加指令等。 这类指令不只在数据运算中有用, 在无符号数的位操作、 代码转换和条件判断等方面更加有用。

88   4. 移位指令   移位指令包括算术移位指令、 逻辑移位指令、 带进位的循环移位指令、 不带进位的循环移指令等, 移位的方向又分为左移和右移两种。   5. 程序控制指令   程序控制指令一般包括转移指令、 转子程序指令、 返回主程序指令、 中断指令等。 而转移指令又可分为条件转移指令和无条件转移指令两类。

89   6. 输入/输出指令   输入/输出指令用来实现CPU与输入/输出设备之间的信息交换。 对于计算机系统来说, 输入/输出指令都是相对于CPU而言的。 1、若指令完成的功能是将外设端口的数据或状态送入CPU内的通用寄存器, 则称之为输入指令; 2、 若指令完成的功能是将CPU内通用寄存器的内容送至外设端口, 则称之为输出指令。 这里“端口”是指外设接口电路中的控制寄存器、 状态寄存器和数据缓冲器的地址。

90   7. 字符串处理指令   字符串处理是现代计算机的非数值处理功能, 一般包括字符串传送指令、 字符串比较指令、 字符串搜索指令、 字符 串转换指令、 取子串指令、 字符串替换指令等。   8. 特权指令   某些指令的使用可能会破坏系统或其他用户信息, 因此为了安全起见, 这类指令只能用于操作系统或其他系统软件, 而不提供给用户使用, 故称为特权指令。

91   一般来说, 在单用户、 单任务的计算机中不一定需要特权指令, 而在多用户、 多任务的计算机系统中, 特权指令却是必不可少的。 它主要用于系统资源的分配和管理, 包括改变系统的工作方式、 检测用户的访问权限、 修改虚拟存储器管理的段表、 页表和完成任务的创建和切换等。   在某些多用户的计算机系统中, 为了统一管理所有的外部设备, 输入/输出指令也作为特权指令, 不允许用户直接使用。 需输入/输出时, 可通过系统调用, 由操作系统来完成。

92 3 1 return addr int accum=0; int main{ return sum(1,3); }
int sum(int x, int y){ int t=x+y; accum+=t; return t; sum: push BP mov SP, BP mov 12(BP), AX add 8(BP), AX add AX, 0xa018 pop BP ret BP 3 1 return addr SP

93 3 1 (BP) return addr int accum=0; int main{ return sum(1,3); }
int sum(int x, int y){ int t=x+y; accum+=t; return t; sum: push BP mov SP, BP mov 12(BP), AX add 8(BP), AX add AX, 0xa018 pop BP ret BP 3 1 return addr (BP) SP

94 3 1 (BP) return addr int accum=0; int main{ return sum(1,3); }
int sum(int x, int y){ int t=x+y; accum+=t; return t; sum: push BP mov SP, BP mov 12(BP), AX add 8(BP), AX add AX, 0xa018 pop BP ret 3 1 return addr (BP) BP SP

95 3 1 (BP) return addr (AX)=3 int accum=0; int main{ return sum(1,3); }
int sum(int x, int y){ int t=x+y; accum+=t; return t; sum: push BP mov SP, BP mov 12(BP), AX add 8(BP), AX add AX, 0xa018 pop BP ret 3 BP+12 1 return addr (BP) BP SP

96 3 1 (BP) return addr (AX)=4 int accum=0; int main{ return sum(1,3); }
int sum(int x, int y){ int t=x+y; accum+=t; return t; sum: push BP mov SP, BP mov 12(BP), AX add 8(BP), AX add AX, 0xa018 pop BP ret 3 1 BP+8 return addr (BP) BP SP

97 3 1 (BP) return addr int accum=0; int main{ return sum(1,3); }
int sum(int x, int y){ int t=x+y; accum+=t; return t; sum: push BP mov SP, BP mov 12(BP), AX add 8(BP), AX add AX, accum pop BP ret 3 1 BP+8 return addr (BP) BP SP (AX)=4 accum=4

98 3 1 (BP) return addr int accum=0; int main{ return sum(1,3); }
int sum(int x, int y){ int t=x+y; accum+=t; return t; sum: push BP mov SP, BP mov 12(BP), AX add 8(BP), AX add AX, accum pop BP ret BP 3 1 return addr SP (BP) (AX)=4 accum=4

99 3 1 (BP) return addr int accum=0; int main{ return sum(1,3); }
int sum(int x, int y){ int t=x+y; accum+=t; return t; sum: push BP mov SP, BP mov 12(BP), AX add 8(BP), AX add AX, accum pop BP ret BP 3 1 SP return addr (BP) (AX)=4 accum=4 (PC)=return addr

100 习题 P 、4、6


Download ppt "第4章 指 令 系 统 4.1 指令系统的发展与性能要求 4.2 指令格式 4.3 指令和数据的寻址方式 4.4 典型指令"

Similar presentations


Ads by Google