首页 Z5指令系统

Z5指令系统

举报
开通vip

Z5指令系统 1 第 5 章 指令系统 第一章中已经指出,计算机中有一股控制信息,它使得计算机按人们预先编好的程序去 工作。这些控制信息就是控制计算机执行某种操作(如加、减、传送、转移等操作)的命令, 称为指令。一台计算机中所有指令的集合称为该计算机的指令系统。指令通常应该提供的信 息包括指令所做的操作、操作数据的来源、操作结果的存放地等信息。本章的主要内容就是 围绕上述信息展开的。具体来说,本章将介绍计算机中机器级指令的格式、指令和操作数的 寻址方式并对典型指令系统进行简要的分析。 5.1 指令系...

Z5指令系统
1 第 5 章 指令系统 第一章中已经指出,计算机中有一股控制信息,它使得计算机按人们预先编好的程序去 工作。这些控制信息就是控制计算机执行某种操作(如加、减、传送、转移等操作)的命令, 称为指令。一台计算机中所有指令的集合称为该计算机的指令系统。指令通常应该提供的信 息包括指令所做的操作、操作数据的来源、操作结果的存放地等信息。本章的主要 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 就是 围绕上述信息展开的。具体来说,本章将介绍计算机中机器级指令的格式、指令和操作数的 寻址方式并对典型指令系统进行简要的分析。 5.1 指令系统概述 计算机的工作基本上体现在执行指令上,指令是用户使用计算机与计算机本身运行的基 本功能单位。由第一章计算机系统层次结构的概念可知,计算机系统不同层次的用户使用不 同的程序设计工具,如微程序设计级用户使用微指令、一般机器级用户使用机器指令、汇编 语言级用户使用汇编语言指令、高级语言级用户则使用高级语言指令。 应用级用户可以分别用高级语言级指令、汇编语言级指令和机器语言级指令编写应用程 序。其中,高级语言指令和汇编语言指令属于软件层次,而机器语言指令和微指令则属于硬 件层次。软件层次的指令需要经过“翻译”成机器语言指令后才能被计算机硬件识别并执行, 虽然微指令也能被硬件直接识别并运行,但微指令是用于实现机器指令功能的,并不提供应 用级程序员使用。由此可见,机器语言指令是计算机硬件与软件的界面,也是用户操作和使 用计算机硬件的接口。本章定位在机器指令级来研究指令系统,第六章将定位在微指令级来 研究控制器的设计。图 5.1 进一步说明了机器级指令与其它级指令之间的关系。 图 5.1 计算机系统层次结构中不同级别指令之间的关系 从图 5.1 可以看出: 1)一条高级语言指令被“翻译”(编译或解释)成多条机器语言指令; 2)一条汇编语言级指令(不包含宏指令)往往被“翻译”(汇编)成一条机器指令;因此, 在学习机器指令的寻址方式和指令类别等相关内容时,读者可借鉴汇编语言中已经学过的知 识来理解。 3)一条机器指令功能的实现依赖于多条微指令的执行。 指令系统是计算机系统性能的集中体现,是计算机软/硬件系统的设计基础,一方面,硬 件设计者要根据指令系统进行硬件的逻辑设计;另一方面,软件设计者也要根据指令系统来建 立计算机的系统软件。如何表示指令,怎样组成一台计算机的指令系统,直接影响计算机系 统的硬件和软件功能。一个完善的指令系统应该满足下面 4 方面的要求: 1)完备性 高级语言指令 汇编语言指令 机器指令 微指令 硬件 软件 n:1 1: m 1: 1 2 指令系统的完备性是指编程时,指令系统直接提供的指令足够使用,而不必用软件实现。 即要求所设计的指令系统种类齐全、使用方便。由于不同程序设计者编程的喜好及面对的硬 件环境不同,即便完成相同功能的任务,所使用的指令也可能不完全相同。因此,指令系统 的完备性应建立在广泛调查的基础上。一般来说应将程序中常用的一些基本指令,如数据传 送类和加法指令等作为指令系统中的必备指令。还有一些指令根据所使用计算机的硬件配置 灵活取舍,如乘法、浮点运算等指令,当机器中有专门硬件支持时,可在指令系统中增加这 类指令,具体实现时由硬件完成;如果没有专门硬件支持,也可以利用指令系统中其它指令 编程实现,此时,在指令系统中就不支持这类指令。 2)有效性 有效性是指利用指令编写的程序能高效率地运行,程序占用的存储资源少。 3)规整性 指令系统的规整性包括对称性、均齐性以及指令格式与数据格式的一致性等内容。 (1)指令系统的对称性衡量的是指令对各种寻址方式的支持,即指令能同等对待寄存器和 存储单元,指令能使用各种寻址方式。对称性对简化机器语言和汇编语言程序设计、提高程序 的可读性非常有意义。 (2)指令系统的均齐性衡量的是指令对各种数据类型的支持。如算术运算指令能支持字 节、字和双字整数运算,也支持十进制数和单、双精度浮点数运算等。指令的这种性质可以 使机器语言、汇编语言和高级语言程序设计无需考虑数据类型,方便程序设计。 (3)指令与数据格式的一致性是指指令长度与数据长度的关系,通常指令长度与数据长度 都应该是字节的整数倍。这样可以降低指令存取的代价,也有利于简化硬件的设计。 4)兼容性 软件兼容性是指某机器上运行的软件不需或少量修改就可以在另一台计算机上正确运 行。指令兼容可以使用户在开发软件时不用担心计算机硬件更新或换代后原来的软件能否继 续使用,这对保护用户的软件投资具有重要的意义。兼容性包括向前兼容性和向后兼容性, 一般用户更关注向后的兼容性。 5.2 指令格式 指令是计算机中传输控制信息的载体,每条指令代表某个基本的信息处理操作及操作的 对象,因此,指令中应该包含表示处理功能的操作码字段和与操作对象有关的地址码字段。 指令的一般格式如图 5.2 所示。 操作码 操作数地址码 图 5.2 指令的一般格式 5.2.1 操作码 指令用操作码来表示具体的操作性质,不同功能的指令其操作码编码不同,如可用 0001 表示加法操作,0010 表示减法操作。操作码的长度,即操作码字段所包含的二进制位数,有 固定长度和可变长度两种。 1)固定长度操作码 固定长度操作码不仅指操作码的长度固定,而且操作码在指令中的位置也固定在指令的 一个字段中。此时,操作码的位数取决于计算机指令系统的规模,指令系统中包含的指令数 越多,操作码的长度相应就愈长,反之就越短。通常情况下,长度为 n 位的操作码,最多可 表示 2n 条指令。 2)可变长操作码 3 可变长的操作码是指操作码的长度可变,而且操作码的位置也不固定。有几种不同的方 法实现可变长操作码。 (1)通过将操作码向不用的地址码字段扩展来实现; (2)采用 Huffman 编码。使用频度高的指令使用短的操作码,使用频度低的指令使用长编 码。 关于可变长操作码的详细内容将在 5.5 节专门介绍。 5.2.2 地址码 指令中的地址码字段的作用随指令类型和寻址方式的不同而不同,它可能作为一个操作 数、也可能是操作数的地址(包括操作数所在的主存地址、寄存器编号或外部设备端口地址)、 也可能是一个用于计算地址的偏移量。根据一条指令中所含操作数地址的数量,可将指令分 三地址指令,双地址指令,单地址指令和零地址指令等 4种。不同类型指令对地址的使用不 同。 1.三地址指令 具有两个操作对象的运算叫双目运算,有许多算术和逻辑运算都是双目运算指令,这类 指令有两个操作数和一个运算结果,如果一条指令中将这三者的地址都给出,那么这种指令 就是三地址指令。早期的计算机中采用这种指令,其格式为: OP Ad1 Ad2 Ad3 其中,OP 为操作码;Ad1 为第一操作数地址,Ad2 为第二操作数地址,Ad3 为操作结果 的地址。 三地址指令的操作表达式为: Ad3 ← (Ad1) OP (Ad2) 即将 Ad1 中的内容与 Ad2 中的内容进行 OP 所指定的操作,结果送 Ad3 所指地址存放。可 以看出,当地址码字段较长(所能表示的地址范围较大)时,三地址格式的指令将会很长。例 如,设操作码为 6 位,存储容量为 16KB,寻址 16K 地址范围需 14 位地址码,三地址指令长 度为 6+14+14+14=48 位。如果地址范围更大,指令就会更长。因此,3 个地址码很少都用存 储单元地址码,而往往有两个或三个都是给出寄存器号,再由寄存器中的内容指出存储地址。 2.双地址指令 双地址指令同样是为双目运算类而设的,只是为了压缩指令的长度,将操作的结果不另 指定地址,而是将它存放到第一操作数地址 Ad1 中,把原来存放的第一操作数覆盖掉,这样 就形成了双地址指令。格式如为: OP Ad1 Ad2 双地址指令的操作表达式为: Ad1 ← (Ad1) OP (Ad2) 式中,Ad1 通常称为目的地址,其中既要存放第一个操作数,也是运算结果的目的地, Ad2 称为源地址,是另一个操作数的来源。 对于双地址指令而言,根据其所指向的数据存储位置不同又可分为三种类型: (1)RR(寄存器-寄存器)型:源操作数和目的操作数均使用寄存器存放; (2)RS(寄存器-存储器)型:源操作数据和目的操作数一个存储在寄存器中,另一个 存储在主存 4 (3)SS(存储器-存储器)型:两个操作数均存放在主存中。 由于存储器的访问速度比寄存器慢很多,所以,从执行速度上看,RR 型最快,SS 型最慢。 目前,在微型计算机中,主要采用 RR 和 RS 型指令。 3.单地址指令 单地址指令中只有一个地址码字段,其格式为: OP Ad 两种情况下使用单地址指令有: (1)单目运算类指令,如逻辑运算中的求反操作,其运算对象只有一个,所以只需要一 个地址码,用它既表示该操作数的来源,也表示该操作数的目的地。此时,单地址指令的操 作表达式为: Ad ← OP (Ad) (单目运算) (2)为了进一步缩短指令长度,将双目运算类指令中的一个操作数约定隐含于 CPU 中的某 个寄存器(通常是累加器 A)中,这样指令就可以只需指定另一个操作数的地址,操作后的 结果送回约定的寄存器中,此时,单地址指令的操作表达式为: A ← (A)OP(Ad) (双目运算) 式中,A 表示累加器,Ad 表示单目运算类指令中的操作数地址或双目运算中除累加器之外的 另一个操作数的地址。 如 80X86 系列 CPU 中的乘法 Mul BL 表示将 AL 中的数据与 BL 中的数据相乘,结果存放在 AX 寄存器令。 4.零地址指令 零地址指令中的指令格式中只有操作码而没有显式地给出地址码字段,其格式为: OP 零地址指令分三种情况: (1)指令本身不需要任何操作数,如只是为了占位和延时而设置的空操作指令 NOP(空操 作指令)、WAIT(等待指令)、HALT(停机指令)等; (2)指令需要一个操作数,但该操作数隐含于 CPU 的某个寄存器(通常是累加器 A)中, 比如 8086 中压缩 BCD 编码运算调整指令 DAA; (3)指令是双目运算类,虽然需要两个操作数,但这两个操作数均由堆栈提供,其操作结 果也存入堆栈。如图 5.2 所示,假设有一条两数相加的零地址指令 ADD,其操作过程是从堆 栈弹出第一和第二操作数 a、b 到加法器,两数相加后,结果(a+b)压人堆栈。 图 5.2 零地址加法指令运算示意图 ∑ a b a+b 5 从以上几种地址结构的变化来看,压缩指令长度的主要措施是简化地址结构,而简化地 址结构的基本方法是尽量使用隐含地址。目前,指令字长较短的小型和微型机中,广泛采用 双地址指令和单地址指令,而中、大型计算机因字长较长,部分采用三地址指令。 计算机中,操作数可能在主存,也可能在寄存器中。因此,寄存器号也是一种操作数的 地址码。另外,如果将操作数的地址码存放在某个寄存器中,由指令给出该寄存器的编号, 那么,指令的长度会有效地缩短。 5.2.3 关于指令长度的有关概念 指令长度是指一条指令中所包含的二进位数。根据指令字长与机器字长的关系,可将指 令分为半字长指令、单字长指令和多字长指令。 (1)半字长指令:指令字长等于半个机器字长的指令。此时,主存一个存储单元可以存放 2 条指令,CPU 访问主存时一次可读出 2 条指令,因此,采用半字长指令有利于加快取指令的 速度。 (2)单字长指令: 指令字长等于机器字长的指令。此时,主存一个存储单元存放 1条指 令,CPU 访问主存时一次可读出 1 条指令。 (3)多字长指令:指令字长等于多个机器字长的指令。如 2字长指令,主存需要 2 个存储 单元才能存放 1 条指令,同样 CPU 需要 2 次访问主存才能读出 1 条指令,因此,多字长指令的 取指令操作速度慢。 虽然使用多字长指令会影响指令的执行速度,但多字长指令能提供足够长的操作码字段 和足够多与足够长的地址码字段, 从而能设计更多的指令、支持更多的指令格式和扩大寻址 范围。 5.3 指令和操作数的寻址方式 根据存储程序的概念,计算机在运行程序之间必须把指令和数据(或称操作数)存放在主 存储器相应地址单元中。运行程序时,不断地从主存取指令和数据,由于主存是基于地址访 问的存储器,只有获得指令和操作数在主存中的地址(称为有效地址)后,CPU 才能访问所需 要的指令和数据。寻址方式就是寻找指令或操作数有效地址的方法。 寻址方式是指令系统设计的重要内容,对指令格式和指令功能设计均有很大的影响。一 套好的寻址方式能给用户提供丰富的程序设计手段,能提高程序的运行速度和存储空间的利 用率。 5.3.1 指令的寻址方式 指令的寻址方式有顺序方式和跳跃方式两种。 1.顺序寻址方式 程序中的指令序列在主存中往往顺序存放。大多数情况下,程序又是按照指令系列顺序 执行。因此,如果知道第一条指令的有效地址,通过增加一条指令所占用主存单元数量,就 很容易知道下一条指令的有效地址,这种计算指令有效地址的方法称为指令的顺序寻址方式。 CPU 用程序计数器 PC 保存指令地址,只要将程序首地址送 PC,然后每执行一条指令,通 过 PC 加“1”,便能算出下一条指令地址,直到程序结束。指令顺序寻址的过程如图 5.3 所示。 图 5.3 指令顺序寻址示意 PCPC 指令 1 指令 1 指令 2 1001 1001 指令 1 指令 2 指令 3 +1 +2 1001 1002 1003 1001 1002 1003 6 需要特别说明的是 PC+1 中的“1”,这里的“1”是指一条指令所占用的存储单元数(以字 节为单位),如指令字长 32 位,占用一个存储字,则采用顺序寻址时下一条指令的有效地址通 过 PC+“4”得到。同样的道理,对于 16 位机而言,通过 PC+“2”可得到下一条指令的有效 地址。 2)跳跃寻址方式 当程序中出现分支或转移时,就会改变程序的执行顺序。此时,对指令寻址就要采取跳 跃寻址方式。所谓跳跃,就是指下条指令的地址不一定通过程序计数器 PC 加 1 获得,最终的 地址由指令本身及指令需要测试的条件决定。指令系统中的无条件转移指令和各种条件转移 指令,就是为跳跃寻址方式而设置的。无条件转移指令的跳跃寻址过程如图 5.4 所示。 图 5.4 指令跳跃寻址过 图 5.4 中,执行 JMP 指令时,PC 的值经过了一系列的变化,先从 1002 变成 1003,然后又从 1003 变成 1006。前面的变化是基于顺序寻址完成的,由于 JMP 指令要求改变程序的指令流 程,JMP 指令的执行效果就是将其地址字段的值 1006 送入 PC,使得 JMP 1006 这条指令执行完 毕后,CPU 不去执行主存 1003 号单元的指令,而是转去执行 1006 号单元的指令。之后又顺序 执行从 1006 号单元的指令序列,直到再执行转移指令或程序结束。 5.3.2 操作数寻址方式 操作数寻址方式就是形成操作数有效地址的方法。由于操作数是程序运行过程中被程序 取出并进行加工处理的对象,其存放方式比较灵活,因程序设计技巧的需要,取出操作数方式 有多种形式,这就导致了操作数的寻址方式比指令的寻址方式要复杂和灵活得多。 操作数来源基本上有三种情况:⑴操作数直接来自指令地址字段;⑵ 操作数存放在寄存 器中,即寄存器操作数;⑶ 操作数存放在存储器中,即存储器操作数。操作数寻址方式就是 如何从上述三种来源中为指令提供操作数。 目前,常用的寻址方式有:立即寻址、直接寻址、间接寻址、相对寻址、寄存器寻址、 寄存器间接寻址、变址寻址和堆栈寻址等。 由于不同指令可能采用不同的寻址方式获得操作数,因此,指令的格式需要进一步细分出 寻址方式字段。图 5.5 所示的为包含寻址方式字段的单地址指令结构。 图 5.5 包含寻址方式的单地址指令结构 其中,OP 为操作码,I 为寻址方式特征码,I 的位数与需要支持的寻址方式有关。D 为形 式地址,或称偏移量。寻址过程就是把 I 和 D的不同组合变换成有效地址的过程。 1.立即数寻址 此时,I 字段编码指示为立即数寻址,指令的地址码字段 D 指出的不是操作数的地址, 而是操作数本身。虽然该数存放在主存单元,但它是作为指令的一部分与指令一起存放,且 程序 … +1 PCPC 程序 JMP 1006 … 1002 1001 1002 1003 1006 1004 1005 1006 OP I D 7 在取指令时随指令一起被送到 CPU 内的指令寄存器中。 由于在指令的执行阶段,该数已经存在于 CPU 内,因此,当指令对该数据进行操作时, 可直接从 CPU 内的指令寄存器中获得该数,而不需要再次访问存储单元。 立即数寻址具有指令执行速度快的优点。但由于指令中分配给形式地址字段 D 的二进制 位数有限,因此,能表示的立即数的范围也受此限制。 立即数寻址一般用于给变量赋初值。如 Intel 8086 中可采用指令 MOV AX,2008H 为寄存 器 AX 的赋初值 2008H。 2.直接寻址 指令的地址码字段直接作为操作数地址的寻址方式称为直接寻址。此时,特征位 I 指出 是直接寻址方式,形式地址 D 给出操作数的地址。直接寻址的寻址过程如图 5.6 所示。 图 5.6 直接寻址 若用 EA 代表有效地址,则 EA=D,操作数= (EA)=(D)。这里括号()表示访问主存单元 或寄存器内容。 直接寻址的特点是地址直观,不需要通过计算可直接从指令中获得操作数的有效地址, CPU 根据该有效地址访问主存即可获得操作数。 使用直接寻址方式存在下列不足: (1)寻址范围受限于指令中直接地址的二进制位数; (2)数据的地址存在于指令中,程序和数据在内存中的存放位置受到限制,灵活性不够; (3)当数据的地址改变时,需要修改指令中的形式地址字段 D 的值,编程不方便。 Intel 8086 中采用直接寻址的指令如: MOV AX,[2008H] 该指令的功能是将有效地址为 2008H 单元的内存单元的内容送入寄存器 AX 中。 3.间接寻址 间接寻址是相对直接寻址而言的,特征位 I 指出间接寻址方式时,地址码字段中的形式 地址给出的不是操作数的有效地址,而是操作数地址的地址(也称操作数地址指示器)。也就 是说,D 所指示单元中的内容才是操作数的有效地址,因而 D 只是一个间接地址。间接寻址 过程如图 5.7 所示。 图 5.7 间接寻址 操作数的地址 EA 操作数 OP I D 内存 . . . . . . . . . 内存 … 操作数 … OP I D 8 此时 EA = (D) 例 5.1 某计算机的间接寻址指令为 MOV AX,@2008H ; @为间接寻址标志 设计算机字长为32位,主存2008H单元的内容为F000H,而主存4000H单元的内容为5000H, 则最后送入到 AX 寄存器中的值为 5000H; 该指令若采用直接寻址寻址范围为 64K 的主存空间,因为指令中形式地址的位数为 16 位(F000H 对应 16 位二进制)。而采用间接寻址后,该指令的寻址范围为 4G 的主存空间,因 为操作数的地址为 32 位。 间接寻址具有下列优点: (1)解决直接寻址方式下寻址范围受限的不足,可以用较短的地址码访问较大的主存空 间; (2)相对于直接寻址而言编程灵活。当操作数地址改变时不再需要改变指令中的形式地址 字段,只需要修改地址指示字所指主存单元的内容即可。 间接寻址的最大不足是取操作数需两次访问内存,降低了指令的执行速度,因此,在现 今广泛使用的个人计算机的指令系统中已不采用这种寻址方式。 4. 寄存器寻址 寄存器寻址是指操作数在 CPU 内的某个通用寄存器中。在这种方式下,取操作数不需要 访问主存。因此,形式地址字段不表示主存地址,而表示通用寄存器号,此时,I 特征码编码 为寄存器寻址,寄存器的内容即所要的操作数。 寄存器寻址过程如图 5.8 所示。寄存器寻址方式下,获得操作数不需要访问主存,操作数 直接从寄存器中读取。 此时,操作数= (Ri) 图 5.8 寄存器寻址过程 寄存器寻址具有下列优点: (1)获得操作数不需要访问主存,指令执行速度快; (2)所需要的地址码短,有利于缩短指令字的长度,节省存储空间; 鉴于寄存器寻址的上述优点,目前这种寻址方式在计算机中得到了非常广泛的应用。当 然,寄存器寻址也存在不足,由于 CPU 中寄存器数量有限,因此这种寻址方式不能为操作数 提供大量的存储空间。 Intel 8086 中采用寄存器寻址的指令如: MOV AX,CX 该指令的功能是将寄存器 CX 中的内容送入寄存器 AX 中。 5. 寄存器间接寻址 OP I D 寄存器 . . 操作数 R0 R1 R2 Ri 9 寄存器间接寻址能解决间接寻址需要访问主存两次才能获得操作数的不足,该寻址方式 下,操作数的地址存放在寄存器中,指令的形式地址字段 D 给出的是存放操作数地址的寄存 器号,I 特征码编码为寄存器间接寻址方式,以寄存器的内容为地址访问主存单元,即可得到 所需的操作数。寄存器间接寻址过程如图 5.9 所示 图 5.9 寄存器寻址过程 由于操作数存放在寄存器中,指令访问操作数时,只需要访问一次内存,比间接寻址少访 问一次。 寄存器简接寻址方式下 EA=(RD) 寄存器间接寻址具有下列优点:既能扩展寻址范围,又不增加访问主存的次数。 例 5.2 设 BX=2010H,主存 2010H 单元的内容为 60H,则 Intel 8086 中采用寄存器间接 寻址的指令 MOV AL,[BX]执行后寄存器 AL 的内容为 60H。 6. 相对寻址 相对寻址是把程序计数器 PC 中的内容加上指令中的形式地址 D,形成操作数的有效地 址。此时,特征码 X 指示为相对寻址方式。相对寻址过程如图 5.10 所示。 图 5.10 相对寻址 此时,EA =(PC)+D 因为取指过程中 PC 的值会修改,而计算机操作数的有效地址的计算机在指令分析或执 行阶段完成,因此,上式中 PC 的内容应为 PC 的当前值,也就是下一条将要执行指令的地址值。 相对寻址的优点是编程只要确定程序内部操作数与指令之间的相对距离,而无需确定操 作数在主存中的绝对地址,便于实现程序浮动。 除用于访问内存外,相对寻址也可以用于转移类指令,实现相对转移,有利于程序在主 存中的灵活定位。 例 5.3 某计算机指令字长 16 位,内存按字节寻址,指令中的数据采用补码表示,且 PC 的 值在取指阶段完成修改。完成下列相对寻址的问题: 1)若某采用相对寻址指令的当前地址为 2003H,且要求数据有效地址为 200AH,则该相对 寻址指令的形式地址字段的值为多少? 2)若某采用相对寻址转移指令的当前地址为 2008H,且要求转移后的目标地址为 2001H, 内存 PC 操作数 OP I D OP I D 内存 . . . . . . 操作数地址 R0 R1 R2 Ri 操作数 寄存器 10 则该相对寻址指令的形式地址字段的值为多少? 解:根据相对寻址有效地址的计算 公式 小学单位换算公式大全免费下载公式下载行测公式大全下载excel公式下载逻辑回归公式下载 EA=(PC)+ D 可知 D = EA - (PC) 对于相对寻址而言,关键是要求出计算有效地址时 PC 的当前值。 1)根据题意,采用相对寻址指令的地址为 2003H,PC 在取指令完成后修改, 则取指令完成后 PC= 2003H +2 = 2005H (因为指令字长 16 位占用 2 个主存单元) 所以: D = 200AH – 2005H = 5H 2)基于与 1)相同的原因,可计算出 D = 2001H – (2008H +2) = F7H 7. 变址寻址 变址寻址方式下,指定一个寄存器用来存放变化的地址,这个寄存器称为变址寄存器, 为便于后面的讨论,假定变址寄存器为 X。同时用指令的形式地址字段存放一个基地址值。变 址寄存器的内容与指令中形式地址 D 之和即为操作数据的有效地址。变址寻址的过程如图 5.11 所示。 图 5.11 变址寻址 变址寻址方式下 EA=(X)+ D 习惯上变址寻址中变址寄存器提供修改量而指令提供基准量。因此,上式中其中 X 的内 容可变,而 D 的值一经设定,在指令执行过程中保持不变。 一般情况下,CPU 内部有一个专门的变址寄存器(如 8086 中 SI 和 DI,其中 SI 表示源操 作数,DI 表示目的操作数),因此变址寻址方式下,变址寄存器采用隐含寻址的方法,不需 要在指令中显式地指出。指令中的形式地址字段给出的是参与变址寻址的偏移值。如果采用 通用寄存器作为变址寄存器,则需要在指令中明确地指出该作为址寄存器的编号。 变址寻址主要应用于对线性表之类的数组元素进行重复的访问,此时,只需要将线性表 的起始地址作为基值赋给指令中的形式地址,使变址寄存器的值按顺序变化,即可对线性表 中的成块数据进行相同的操作,且不需要修改程序,极大地方便了程序设计。 8. 基址寻址 基址寻址指定一个寄存器用来存放基地址,这个寄存器称为基址寄存器,为便于后面的讨 论,假定变址寄存器为 B。同时用指令的形式地址字段存放一个变化的地址值。基址寄存器的 内容与指令中形式地址 D 之和即为操作数据的有效地址。基址寻址的过程如图 5.12 所示。 图 5.12 基址寻址 内存 基址寄存器 B OP I D 操作数 内存 变址寄存器 X OP I D 操作数 11 基址寻址方式下 EA=(B)+ D。 习惯上基址寻址中基值寄存器提供基准量而指令提供位移量,因此上式其中 D 的内容可 变,而 B 的值一经设定,在指令执行过程中不再改变,这一点正好与变址寻址相反。 一般情况下,CPU 内部有一个专门的基址寄存器(如 Intel 8086 中的 BX 和 BP。若基址 是 BX,则操作数在数据段;若基址是 BP,则操作数在堆栈段),因此基址寻址方式下,基 址寄存器采用隐含寻址的方法,不需要在指令中显式地指出。指令中的形式地址字段给出参 与基址寻址的偏移值。如果采用通用寄存器作为基址寄存器,则需要在指令中明确地指出作 为基址寄存器的编号。 比较图 5.11 和图 5.12 不难发现,基址寻址和变址寻址有效地址的形成过程非常相似,但 两者的应用确有很大的差别。 基址寻址面向系统,主要用于程序的重定位。如多道程序设计环境下,需要由系统的管 理程序将多道程序装入主存。由于用户编程使用的是逻辑地址,当用户程序装入主存时,为 了实现用户程序的再定位,系统程序给每个用户程序分配一个基地址。程序运行时,该基地 址装入基地址寄存器,通过基址寻址实现逻辑地址到特定用户物理地址的变换。用户通过改 变指令中的形式地址 D来实现指令或操作数的寻址。基址寄存器的内容是操作系统或管理程 序通过特权指令设置的,对用户透明。对每一个用户程序而言,在程序执行过程中基址寄存 器的值保持不变。 除解决程序的重定位问题外,基址寻址方式还能扩展寻址空间,这一功能可通过增加基 址寄存器的字长来实现。如将基址寄存器的位数从 32 位增加到 34 位后,采用基址寻址的寻 址范围将从 4G 扩展到 16G。 变址寻址是面向用户的,主要解决程序循环问题,变址寄存器的内容由用户设置,程序 执行过程中,用户通过改变变址寄存器的内容实现指令或操作数的寻址。 相对寻址、变址寻址和基址三种寻址方式计算有效地址的方式非常类似,都由某寄存器 的内容与指令中形式地址字段之和作为有效地址。通常将这三中寻址方式统称为偏移寻址。 9.堆栈寻址 堆栈以先进后出的方式存储数据。寻找存放在堆栈中操作数地址的方法称堆栈寻址。堆 栈有存储器堆栈和寄存器堆栈,前者在内存空间开辟堆栈区,后者利用寄存器作为堆栈区。 无论哪种类型的堆栈,数据的存取都通过栈顶进行。堆栈操作有进栈和出栈两种,进栈是将 指定数据传送到堆栈中;出栈是将栈顶的数据传送给指定的寄存器。 1)存储器堆栈 为满足用户对堆栈容量的要求,目前计算机普遍采用存储器堆栈。由于内存基于地址访 问,因此,需要设置一个堆栈指示器(SP)指向栈顶单元。若主存按字编址,以字节为单位进 出栈,进栈时 SP 向地址减小方向变化,则存储器堆栈进出栈的操作过程如图 5.13 所示。 12 图 5.13 存储器堆栈操作示意图 进一步可用下列表达式描述图 5.13 中存储器堆栈操作: 入栈操作:SP ← (SP)-1 , M[SP]← (R); 出栈操作:R ←(M[SP]),SP ← (SP)-1 ; 不同的机型对 SP 的移动方法不同,有的计算机(如 8086 CPU),进出栈以字为单位,而 内存按字节编址,进堆时 SP 向地址减小方向变化,每进栈一个操作数,SP 都要先减 2,然后 将数据送入(SP)和(SP)-1 为地址的两个字节单元中。对另外的计算机(如 MCS-51 单片机), 进出栈以字节为单位,进栈时 SP 向地址增大方向变化,所以每进栈一个操作数,则 SP 先加 1,然后,将数据送入 SP 所指的存储单元。出栈的操作与进栈相反。 2)寄存器堆栈 为满足用户对堆栈速度的要求,一些计算机采用寄存器堆栈。由于寄存器不基于地址访 问,因此,与内存堆栈不同,寄存器堆栈中不需要设置一个堆栈指示器。寄存器堆栈的操作过 程与内存堆栈的操作过程及特征均不同。寄存器堆栈进出栈的操作过程如图 5.14 所示。 图 5.14 寄存器堆栈操作示意图 比较图 5.13 和图 5.14 不难发现寄存器堆栈与存储器堆栈操作存在下列不同: (1)寄存器堆栈栈顶固定不动,而存储器堆栈栈顶随着堆栈操作而移动; (2)堆栈操作时,寄存器堆栈中的数据移动,而存储器堆栈中的数据不动。 寄存器 R 栈顶 寄存器 R 栈顶 寄存器 R 栈顶 寄存器 R 栈顶 寄存器 R 栈顶 空栈 入栈 A A A 入栈 A B B A B C C 入栈 出栈 C A B R SP 1007 3500 1005 1006 1007 进栈前 R SP 3500 1006 3500 1005 1006 1007 R 进栈后 R SP 2460 3500 1005 ---- 1005 1006 1007 出栈前 R SP 2460 3500 1006 2460 1005 1006 1007 出栈到 R 后 内存 内存 13 10.其它寻址 1)复合寻址 复合寻址是几种寻址方式的组合,主要应用于复杂指令集结构计算机中。下面将简要介 绍几类常见的复合寻址方式。 (1) 变址+间接寻址方式 种寻址方式下,先进行变址寻址再进行间接寻址,即把变址寄存器 X中的内容与指令中 的形式地址相加,作为操作数地址的指示器。该寻址方式下 EA= ((X)+ D) (2) 间接寻址+变址方式 种寻址方式下,先进行间接寻址再进行变址寻址,即根据指令中的形式地址 D 的内容访 问存储器得到偏移量,然后将其与变址寄存器 X 中的内容相加作为操作数地址的指示器。 该寻址方式下 EA= (X)+(D) (3)相对+间接寻址 在这种寻址方式下,先进行相对寻址再进行间接寻址,即把程序计数器 PC 中的内容与指 令中的形式地址 D 相加,再进行间接寻址。 该方式下:EA=((PC)+D) 2)段寻址方式 段寻址方式是一种为了扩大寻址范围而采用的技术。 如在 Intel 8086/8088 中央处理 器中,运算器和通用寄存器均为 16 位,若直接用寄存器间接寻址,则其寻址范围最大是 64KB。 可是中央处理器的地址线却有 20 根,即其对主存的寻址范围是 220=1MB,为了访问 1MB 范围 的存储空间,采用了段寻址方式。具体方法是将 1MB 的存储空间以 64KB 为单位分为若干段, 在形成操作数的有效地址时,由一个段基地址加上某寄存器提供的 16 位偏移量以形成 20 位 物理地址。这个基地址由 CPU 中的段寄存器提供。形成 20 位物理地址时,段寄存器中的内容 自动左移 4位,然后与偏移量相加,即形成所需的 20 位地址。段寻址过程如图 5.15 所示。 图 5.15 段寻址过程 3)分页寻址方式 对直接寻址方式而言,由于其访问的内存地址空间受指令中地址码字段长度的制约,若 内存空间较大,则可采用分页寻址方式来解决。将指令中操作数地址码可以访问到的内存地 址空间称为一页,则整个内存空间可以按页的大小分为多个页面。 设内存容量为 64K,而指令中地址码长度为 9 位,则每一页有 512 个单元,可将内存空 间划分为 64K/512=128 页。为访问 128 页,需要 7位代码来表示页号。若预先将页号送入页 号寄存器,把页号寄存器的内容与指令寄存器中形式地址拼接起来,就能获得一个可以访问 15 0 15 0 逻 辑 地 址 主 存 储 器 物 理 地 址 段 寄 存 器 0000 019 ∑ 14 整个内存空间的有效地址。 以上介绍了十多种操作数寻址方式,在具体机器的指令系统中,可能只用了上述方式的 一部分或某些基本方式再加上几种变形的寻址方式。另外,前面介绍操作数寻址方式时,都 是用单地址指令为例。对多地址指令而言,由于不同的地址所起的作用不同,因此每个地址 字段都应该有各自的寻址方式特征位字段。 5.3.3 寻址方式举例 不同类型的计算机由于其结构不同、指令系统的设计目标不同以及其它原因,它们所支 持的寻址方式也不尽相同。8086 的寻址方式在《汇编语言程序设计》课程中已经详细学习过, 这里不再复述。本节将简单介绍 Pentium 机和 PowerPC 机的寻址方式。 1.Pentium 的寻址方式 Pentium 机的外部地址总线宽度为 36 位,同时也支持 32 位物理地址空间。在实模式下, 逻辑地址形式为段寻址方式:将16位段寄存器内容左移4位,得到20位段基址,再与段内偏移 地址相加得到物理地址。在保护模式下,32 位段基址加段内偏移地址得到 32 位线性地址 LA, 再由存储管理部件转换成 32 位物理地址,转换过程对程序员透明。 无论是实地址模式还是保护模式,段基地址的获取方式都是固定的,但有效地址的获取 方式随寻址方式的不同而不同。Pentium 机常见的几种寻址方式及对应的有效地址的计算方 法如表 5.1 所示。 表 5.1 Pentium 机寻址方式 寻址方式名称 有效地址 EA 计算方法 说明 立即数寻址 不需要计算机 EA 操作数在指令寄存器中,取指过程中读入 CPU 寄存器寻址 不需要计算有效地址 操作数在寄存器中 偏移量寻址 EA =D D 为指令中的形式地址字段,可位 8位、16 位、32 位 基址寻址 EA=(SR)+(B) 设 B为基址寄存器,SR 为段寄存器 基址+偏移量 EA= (SR)+(B)+D 比例变址+偏移量 EA=(SR)+(X)× S +D 设 X 为变址寄存器,S为比例因子,可取 1、2、4、8等 基址+变址+偏移量 EA=(SR)+(B)+(I)+D 基址+比例变址+偏移量 EA=(SR)+(B)+(I)× S +D 相对寻址 EA=(PC)+D 2.PowerPC 的寻址方式 PowerPC 是精减指令系统机器,它的寻址方式很简单。表 5.2 给出了基于指令分类的 PowerPC 寻址方式。 表 5.2 PowerPC 寻址方式 指令类型 寻址方式 EA 计算方法 说明 取数/存数 间接寻址 EA=(B)+D B 为基址寄存器 间接寻址+变址寻址 EA=(B)+(D) 转移 绝对寻址 EA=D 相对寻址 EA=(PC)+D 间接寻址 EA=(L/CR) 链接或记数寄存器 定点计算 寄存器寻址 不需要计算 EA 数据在寄存器中 立即数寻址 不需要计算 EA 数据在指令寄存器中 15 浮点计算 寄存器寻址 不需要计算 EA 数据在浮点寄存器中 5.4 指令系统类型 指令系统决定了计算机的基本功能,指令系统中不同指令的功能不仅影响到计算机的硬 件结构,而且对操作系统和编译程序的编写也有直接影响。不同类型的计算机,由于其性能、 结构、适用范围的不同,指令系统之间的差异很大,风格各异。有的机器指令类型多,功能 丰富,包含几百条指令;有的机器指令类型少,功能简单,只包含几十条指令。 在指令系统设计过程中决定指令系统类型时,除满足完备性、有效性、规整性等基本要 求外,还需要考虑为提高程序速度和便于程序员编写程序而设置一些指令类型。不同的计算 机所具有的指令系统也不同,但不管指令系统的繁简如何,所包含的指令的基本类型和功能 是相似的。一般说来,一个完善的指令系统应包括的基本指令有:数据传送、算术逻辑运算 指令、移位操作指令、堆栈操作指令、字符串处理指令、程序控制指令、输入输出指令等。 复杂指令的功能往往是一些基本指令功能的组合。 1.数据传送指令 数据传送指令是计算机中最基本、最常用的指令,主要用于两个部件之间的数据传送操 作,如寄存器与寄存器、寄存器与存储器单元之间的数据传送。执行数据传送指令时,数据 从源地址传送到目的地址,源地址中的数据不变。有的机器设置了通用的 MOV 指令,并支 持寄存器之间以及寄存器与存储器之间的数据传输;有的机器专门用 LOAD、STORE 指令访 存,其中 LOAD 为存储器读数指令,STORE 为存储器写数指令;还有些机器设置了交换指 令,可以完成源操作数与目的操作数互换,实现双向数据传送。 数据传送指令可以以字节、字、双字为单位进行数据传送。有的计算机还支持成组数据 传送,如在 Intel8086 的指令系统中,有串传送指令 MOVS,在加上重复前缀 REP 后,可以 控制一次将最多 64KB 的数据块从存储器的一个区域传送到另一个区域。另外,在 IBM370 机中也有支持成组传输的指令。 除基本的传送类指令外,堆栈指令、寄存器/存储单元清 0 指令也属于数据传送指令。 2.算术逻辑运算指令 该类指令的主要功能是进行各类数据信息处理,包括各种算术运算及逻辑运算指令。这 类指令是 CPU 最基本功能的体现。算术运算指令主要包括二进制的定点、浮点数加、减、乘、 除运算指令;求反、求补、加 1、减 1、比较指令;十进制加、减运算指令等。不同计算机对 算术运算类指令的支持有很大差别。对于低档机而言,由于硬件结构相对简单,一般仅支持 二进制定点加、减、比较、求补等最简单、最基本的指令。而在一些高档机中,为了提高机 器性能,除了最基本的算术运算指令之外,还设置了乘、除运算指令、浮点运算指令、十进 制运算指令,甚至乘方、开方指令和多项式计算指令。在一些大、巨型机中,不仅支持标量 运算,还设置了向量运算指令,可以直接对整个向量或矩阵进行求和、求积运算。 逻辑运算指令主要包括与、或、非、异或、测试等指令。逻辑运算类指令多用于对数据 字中某些位(一位或多位)进行操作,如按位测、按位清、按位置、按位取反等,也可以用 于进行数据的相符判断和数据修改。 3.移位操作指令 移位操作指令分为算术移位、逻辑移位和循环移位三种,可以实现对操作数左移或右移 一位或几位。 算术移位和逻辑移位指令分别控制实现带符号数和无符号数的移位。循环移位按是否与 16 进位位 C 一起循环分为带进位循环(大循环)和不带进位循环(小循环)。循环移位一般用 于实现循环式控制、高低字节的互换以及多倍字长数据的算术移位或逻辑移位。 算术移位常用于对操作数乘以 2 或除以 2 的运算。因为移位指令的执行时间远比乘除操 作的执行时间短,所以采用移位指令实现简单的乘除运算可获得较高速度。在无乘除运算指 令的计算机中,移位指令的这个性质对快速实现乘除运算来说显得特别重要。 4.堆栈操作指令 如前所述,堆栈操作指令是一种特殊的数据传送指令。堆栈操作有两种:压入(进栈) 或弹出(出栈)。压入指令是把指定的操作数送入栈顶,而弹出指令是从栈顶弹出数据,送到 指令指定的目的地址中。 堆栈操作指令主要用于保存和恢复中断、子程序调用时的现场数据和断点指令地址,以 及在子程序调用时实现参数传递。为了支持这些功能的快速实现,有些机器还设有多数据的 压入指令和弹出指令,可以用一条堆栈操作指令依次把多个数据压入或弹出堆栈。 5.字符串处理指令 字符串处理指令属于非数值处理指令,该类指令便于直接用硬件支持非数值处理。字符 串处理指令一般包括字符传送、字符串比较、字符串查找、字符串抽取、字符串转换等指令。 其中字符串传送指令用于将数据块从主存的某一区域传送到另一区域;字符串比较指令用于 把一个字符与另一个字符串逐个字符进行比较;字符串查找指令用于在一个字符串中查找指 定的子串或字符;字符串抽取用于字符串从中提取某一子串;字符串转换用于将字符串从一 种编码转换为另一种编码。字符串处理指令在需要对大量字符进行各种处理的文字编辑和排 版方面非常应用。 6. 程序控制指令 程序控制指令用于控制程序运行的顺序和选择程序的运行方向。该类指令能增加程序设 计的灵活性,可使程序具有测试、分析与判断能力,程序控制类指令主要包括转移指令、循 环控制指令及子程序调用与返回指令等。 1)转移指令 转移指令用于根据功能的需要,改变指令的顺执行流程,转移指令按其转移是否需要测 试相应条件可分为无条件转移指令和条件转移指令两类。 无条件转移指令在执行时不受任何条件的约束,直接把控制转移到指令指定的转向地 址。如 Intel8086 指令系统中的 JMP X 指令,其功能就是无条件地将程序移到指令中给出的 转移目标地址 X 处继续执行。 与无条件转移指令不同,条件转移指令的转移受到一定条件的约束,只有在条件满足的 情况下,才会执行转移操作,把控制转移到指令指定的转向地址;若条件不满足,则不执行 转移操作,程序仍按原顺序继续执行。如 Intel8086 指令系统中的 JNC Y 表示没有进位时 转移到目标地址处执行,目标地址的计算与寻址方式及 Y 的取值有关。 条件转移指令的转移条件来自于状态标志寄存器(或条件码寄存器)的相关位,这些位 一般由前面指令根据执行结果而设置。状态标志寄存器的标志主要包括:进位标志(C)、结 果溢出标志(O)、结果为零标志(Z)、结果为负标志(N)、结果奇偶标志(P)等。这些标 志的组合可以产生十几种转移条件,相应地就有了诸如结果为零转、非零转、为负转、为正 转、溢出转、非溢出转等条件转移指令。 转移指令的转移地址一般采用相对寻址或直接寻址。若采用相对寻址,转移地址为当前 PC 内容与指令中给出的位移量之和;若采用直接寻址,转移地址由指令中地址码直接给出。 17 2)循环控制指令 循环控制指令实际上是一种增强型的条件转移指令,其指令功能一般包括对循环控制变 量的修改、测试判断以及地址转移等功能,从而支持循环程序的执行。 如 Intel 8086 指令系统中的循环控制指令 LOOP L1。该指令每执行一次,将循环计 数器 CX 中的循环次数减 1,然后进行判断 CX 是否为 0,若为不为 0 则程序转到 L1 处继续 执行;否则结束循环,执行 LOOP 指令的下一条指令。 3)子程序调用与返回指令 在编写程序时,为了避免程序的重复编写,将具有特定功能的程序段设定为独立且可以 公用的子程序。在主程序执行过程中,当需要执行子程序时,在主程序中发出调用子程序的 指令并给出子程序的入口地址,控制程序的执行序列从主程序转入子程序;而当子程序执行 完毕后,可以利用返回主程序的指令,使程序重新回主程序中发出子程序调用命令的地方, 继续顺序执行。 称调用子程序并实现程序控制从主程序转向子程序的指令称为转子指令(也称子程序调 用指令或过程调用指令)。为正确调用子程序,必须在转子指令中给出子程序的入口地址。主 程序中转子指令的下一条指令的地址称为断点,断点是子程序返回主程序时的返回地址。从 子程序返回主程序的指令称为返回指令。为了在执行返回指令时能够正确地返回主程序,转 子指令应具有保护断点的功能。有多种保护断点的方法,其中将断点压入堆栈是保护断点的 最好、最常用的方法,它便于实现多重转子和递归调用,因而被很多指令系统所采用。例如 Intel 8086 就是采用堆栈保存返回地址。Intel 8086 的指令系统中设置了子程序调用指令 CALL 和返回指令 RET。CALL 指令的功能是把下一条指令的地址(断点)压入堆栈,再将程序的 执行转移到指令中给出的子程序入口。RET 指令的功能是从堆栈中取出断点地址并返回断点 处继续执行。 虽然转子指令与转移指令的执行结果都是实现程序的转移,但两者存在下列区别: (1)转移的位置不同 转移指令一般在同一程序内转移;而转子指令实现不同程序之间的转移; (2)转移指令不需要返回原处,因此,不需要保护断点地址;而转
本文档为【Z5指令系统】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_104057
暂无简介~
格式:pdf
大小:463KB
软件:PDF阅读器
页数:36
分类:其他高等教育
上传时间:2011-12-15
浏览量:31