指令系统第三节

指令的功能和类型

1.计算机的指令系统中应该设置哪些指令体现了该计算机硬件所能实现的基本功能,也是编写程序的基本单位(包括由源程序转换得到的目标代码)。因此指令系统体现了一台计算机的硬件、软件界面,也是不同机种CPU之间的主要差别所在。

2.复杂指令集合的计算机被称为CISC。这种复杂性主要体现在以下两方面:

(1)早期的指令系统只考虑对单个数据的运算操作,需要编制一个程序段或子程序才能处理某种数据结构。现在的一种发展趋势是:由指令直接提供对各种常用数据结构的硬件支持,如对数组、表、队列、堆栈等的操作指令,从而向高级语言靠拢。有些计算机设置了专门的向量运算部件,指令中有相应的向量运算指令,可将某些向量化计算予以向量化并行处理。

(2)早期的指令系统主要面向用户的编程需要。现在又一种发挥趋势是:在指令设置方面增强对系统管理功能的硬件支持,如中断管理、操作系统的进程管理等。

3.不同机种,对指令的分类方法可能不同,归纳起来大致有以下3类。

(1)按指令格式分类。比如双操作数指令、单操作数指令、程序转移指令等。

(2)按操作数寻址方式分类。比如RR(寄存器-寄存器型)、RX(寄存器-变址存储器型)、RS(寄存器-存储器型)、SI(存储器-立即数型)和SS(存储器-存储器型)。

(3)按指令功能分类。现在大部分微处理器将指令分为:传送指令、访存指令、I/O指令、算术运算指令、逻辑运算指令、程序控制指令、处理机控制类指令等。

4.传输类指令

传输类指令是计算机中最基本的指令,用于实现数据传输操作。

许多计算机将传输类指令划分为三大类:

(1)传输指令:实现CPU中各寄存器之间的数据传输,如R0->R1。这类指令可以高速执行。

(2)访存指令:实现对寄存器的读出或写入,如将数据从主存储器调至CPU的寄存器之中,以后就可以在CPU中进行运算处理。

(3)I/O指令:将有关I/O接口中寄存器的内容输入到主机中或将数据从主机输出到I/O接口中。

有的计算机将这三种合并为一个大类,可称为通用型数据传输指令。

<1>根据寻址方式区分它是在CPU内传输还是访存。

<2>根据地址范围,可判断它是访存指令还是I/O指令。

在具体设置传输指令时,一般应当对三方面做出约定或说明:

(1)传输范围,即指令允许数据在什么范围内传输。如前所述,操作数的来源与目的地可能是CPU寄存器、主存储器或者I/O寄存器。

(2)传输单位,一般来说数据可以按字节、字、双字或数组为单位进行传输,因此传输指令中应表明数据传输的单位。MOVB表示按字节传输,MOVW表示按字传输(即多字节组成一个字)。

将寄存器分为每个寄存器8位(1字节),几个寄存器组成一个字,用"MOV AL,BL"实现字节传输(L低8位),用"MOV AX,BX"表示按字传输(X表示组成一个字的一组寄存器),用"MOV EAX,EBX"表示双字传输。

(3)设置寻址方式。在指令中设置专门的寻址方式编码子段/根据操作码隐含约定是何种寻址方式。

5.访存指令

(1)加载指令(读存储器)。从主存储器某个单元将数据读出,送入CPU的某个寄存器,常被称之为加载(LOAD)。加载指令又可分为按字节、按字等几条指令。

(2)存储指令(写入存储器)。将数据写入某个主存储器单元,成为存储,它也可以分为按字节、按字等。

(3)弹出(POP)。从堆栈栈顶弹出数据,可视为读存储器的一个特例。

(4)压栈(PUSH)。将数据压入堆栈栈顶,可视为存储指令的一个特例。

6.输入\输出(I/O)指令

为了将CPU、主存、外围设备连接成一个系统,建立起系统级整机,要特别关注I/O指令的设置和应用方式。

I/O指令实现主机和各外围设备之间的信息传输,输入和输出都以主机为参考点。将信息送入主机,成为输入;将信息送至外围设备,称为输出。主机对外围设备的访问具体就是对有关接口寄存器的访问。

I/O指令所传输的信息大致可分为:数据、命令和状态信息。

CPU通过输出指令经数据总线向I/O接口的有关寄存器发送代码,并约定代码各位的含义,如最低位是启动位,为1时启动设备。这样的代码字称之为命令字,接口中的相应寄存器称为命令字寄存器或控制寄存器。

(1)I/O设备的编址方法

<1>外围设备单独编址

早期的做法是为每台外围设备分配一个唯一的设备编码,该设备的接口中设置有限的几个寄存器。在I/O指令中给出设备码,并指明是哪个寄存器。在这种方式下,I/O指令的结果很复杂,且对新增设备的兼容性很差。

现在普遍采用的方法是:为各I/O接口中的有关寄存器分配一种I/O端口地址,即编址到寄存器一级。各设备都有自己的接口,一个接口可以占有若干I/O端口地址,各接口所占有的端口地址数目可以不同。

<2>外围设备与主存储器统一编址

有的计算机采取统一编址方式,即将I/O接口中的有关寄存器与主存储器的各单元统一编址,为它们分配统一的总线地址。也就是将寻址空间划分为两部分,大部分为主存,一小部分留给I/O接口寄存器(I/O端口)。

(2)I/O指令的设备方法

<1>设置专用的I/O指令。

大多数计算机的指令系统中都设置了专门的I/O指令,以支持对外围设备(I/O接口寄存器)单独编址。这类指令是显式I/O指令。相应地,I/O指令的操作码明确规定某种I/O操作,在地址部分分别给出CPU寄存器号及I/O端口地址。

例如,输入指令"IN R0, n"的操作含义是:将端口地址为n的I/O接口寄存器内容送到CPU内部的R0寄存器中。

采用专用I/O指令启动外围设备的方法有两种:一种是由操作码给出启动命令,另一种是输出指令,从CPU寄存器向I/O接口的控制寄存器送出命令字,其中包含启动位和其他命令。

可以分为两个级别:

CPU管理IOP(专门用于管理I/O操作的协处理器)的I/O指令,负责启动或者停止IOP;

IOP执行的指令,负责控制外围设备具体的I/O操作。

<2>采用通用的数据传输指令实现I/O操作

有些计算机采用通用的数据传输指令实现I/O操作,相应地把外围设备(I/O接口寄存器)与主存单元统一编址。如果传输指令的源地址是CPU寄存器,而目的地是接口寄存器,那这条指令就是一条输出指令。

这类指令的I/O等价功能是借用内存传输指令实现的,所以被称为隐式I/O指令。

7.算术逻辑运算指令

计算机的基本任务是对数据进行运算处理,计算机的运算分为算术运算、逻辑运算两大类,其中包括了算术移位和逻辑移位。

(1)算术运算命令

几乎所有计算机都设置有这些最基本的算术运算命令:定点加(ADD)、减(SUB)、加(INC)、减1(DEC)、求补(NEG)、比较大小等。现在的主流微型计算机还设置了:定点乘、除,十进制运算,浮点加、减、乘、除等运算指令。巨型机(超算)中则可能还有向量运算指令,可以对整个向量或矩阵进行求和、求积等运算。

每次运算的单位可以是字节、字、双字等,如果要执行超过硬件支持的超高精度、多位字长的算术逻辑运算,通常只能通过软件子程序来实现。

早期的计算机为了降低成本,曾经采用过两种手段:一种是"硬件软化",即简化硬件,让CPU只设置一些基本的运算指令,复杂一些的运算功能(如浮点运算)通过子程序实现;另一种办法办法是把计算机按用户的应用需求分成若干档次,不同档级硬件配置不同,最基本的CPU只执行最基本的运算指令以满足低端运算,高档的CPU则配备一些"扩展运算器",并可通过专用指令调用扩展运算器,或将扩展运算器抽象成"外围设备",并通过I/O指令去调用。

现代计算器CPU采用了超大规模集成电路(VLSI)技术,硬件成本大大下降。与此相应,采取"软件硬化"策略使指令系统包括更丰富的运算指令,但对一些更加复杂的运算仍然沿用扩展运算器的方法,现在称之为"协处理器"。目前的趋势是:协处理器逐渐也被纳入CPU硬件范畴之中。

(2)逻辑运算指令

AND与 | OR或 | COM非 | EOR异或

(3)移位指令

<1>算术移位

数值大小发生变化,左移加倍,右移缩小一倍。如果是带符号数,在移位过程中数符保持不变。

<2>逻辑移位

参加移位的代码序列只是被视为纯逻辑意义上的代码组合。比如把32位数据通过移位以串行形式输出。

(4)串操作指令

为了实现对数组元素的操作,许多计算机设置了串操作指令,加上重复前缀REP,能对数组进行传输、比较、扫描、装入、存储、输入、输出等串操作。组成数据串的元素称之为串元素,它可以是字节、字、双字等。

在8086/8088中隐含约定:用寄存器SI作为源数据串的地址指针,寄存器DI作为目的地指针,串的长度存放在寄存器CX中。每执行一次串操作指令,SI和DI的值便自动修改,指向下一个串元素单元。当在串操作指令之前加上重复前缀时,使用CX保存串长度,每执行一次串操作指令,CX的串长度自动减1,并且重复执行该串操作指令,直至CX内容为0。这样"REP MOVS"就实现了整个数组的移动。

(5)专门的数据处理指令

<1>转换指令:实现数制转换或者数据类型转换。

<2>检索指令:已给定的参考量作为依据,对一组信息进行检索。

<3>编辑指令:将一种格式的字符或数据编排为另一种格式的字符或者数据,或者执行插入、删除、添加等编辑修改操作。

8、程序控制类指令

(1)转移指令

在程序的执行过程中,通常采用转移指令来改变程序的执行顺序,分为无条件转移和条件转移两类。

无条件转移:指令中给出转移命令(操作码)和转移地址,转移地址可以用多种寻址方式给出。即将转移地址送入程序计数器PC,再往下执行。

条件转移:主要用于程序分支。在条件转移指令中给出转移条件和转移地址;如果满足转移条件,则转向指令给出的转移地址;如果不满足转移条件,程序继续按原来的顺序执行。

转移条件主要来源于CPU内部的一组特征触发器,又称为标志位,它们是CPU程序状态字PSW的基本组成部分,常见的有:进位(为0表示没有进位或借位,为1表示有)、溢出、结果为0、结果为正或负等触发器。在执行运算命令时,将运算结果的有关特征记入上述特征触发器,它们构成了一组可能用到的转移条件。相应地,常见的条件转移指令有:有进位转移JC、无进位转移JNC、有溢出转移JO、无溢出转移JNO、为零转移JZ、不为零转移JNZ、为正转移JNS、为负转移JS等。

循环指令:

修改计数值、测试计数值、根据测试的结果控制循环或者退出循环。

(2)转子程序指令与返回指令

转子程序指令:从指令格式看,转子程序指令与无条件转移指令非常相似,指令中给出操作码和转移地址,后者是子程序的入口地址。但从执行方式看,子程序执行完之后要返回主程序。因此在转入子程序时应该先把返回地址保存起来,一般用堆栈保存。

返回指令:子程序的最后一条指令是返回指令,它只有操作码,因为返回地址是隐含获得的。

(3)软中断(程序自中断)指令

引起中断的原因有多种,其中一种是由于程序执行一条软中断指令,所以又称为程序自中断。例如:软中断指令"INT n",除操作码INT外,指令还给出一个中断号n,根据它可以找到中断处理程序入口地址。(中断这个去执行别的再从堆栈取回继续执行原来的)

(4)控制处理机某些功能的指令

例如:对CPU状态字某些标志位的清除、设置、修改;空操作指令NOP;实现CPU与外部事件的同步功能,如暂停HLT、等待WAIT、总线锁定LOCK等指令。

(5)面向操作系统的一些指令

计算机中的程序可分为系统程序与用户程序,前者如操作系统,是系统程序员编写的,不能被用户程序所破坏。相应地,有些特权指令只能在操作系统中使用。

<1>访问系统寄存器的指令。

<2>检查保护属性的指令。

<3>用于存储管理的指令。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值