指令系统(计组课程笔记)

指令系统的发展和性能要求

  • 指令:计算机执行某种操作的命令
  • 程序:由一系列的指令组成的
  • 从组成的层次结构来说,指令可分为如下3类:
    微指令:保存在控制器中的,微程序级的命令,它属于硬件。
    机器指令(指令):介于微指令和宏指令之间,由若干条微指令组成的,每条指令可完成一个独立的算术运算或逻辑运算。
    宏指令:由若干条机器指令组成的软件指令,它属于软件。
  • 指令系统:一台计算机中所有机器指令的集合。
  • 指令系统是表征一台计算机性能的重要因素,它的结构与格式直接影响到机器的硬件结构;直接影响系统软件;直接影响机器的适用范围。
  • 指令系统的性能决定着计算机系统的基本功能。它的设计直接关系到计算机的硬件结构和用户的需要。

指令系统的四大性能指标

  • 完备性:用汇编语言编写各种程序时,指令系统丰富,功能齐全,编程方便。
  • 有效性:程序占据存储空间小,执行速度快。
  • 规整性:指令格式和数据格式一致;指令系统中所有的寄存器和存储单元都可同等对待,所有的指令都可使用各种寻址方式;指令可以支持各种数据类型。
  • 兼容性:60年代末出现的系列机各种机之间具有相同的基本结构和共同的基本指令集,即低档机上运行的软件可以在高档机上运行。

指令系统与硬件结构的关系

  • 高级语言:是“面向人类”的语言,如C等,与具体机器的指令系统无关。
  • 低级语言:是面向机器的语言,与具体机器的指令系统密切相关
    机器语言(二进制语言):指令代码编写程序。为了便于书写和记忆,指令助记符与机器指令一一对应,常用3或4个英文缩写字母来表示,则出现了汇编语言。汇编语言:(指令助记符)指令助记符编写程序。计算机能够识别并直接运行的是二进制语言,但人们用汇编语言和高级语言编写程序,为此,必须借助汇编语言所编写的程序把符号语言或高级语言转换成二进制语言。所以人们又将低级语言分为机器语言和汇编语言两种。

指令格式–操作码

指令:

  • 要求计算机执行什么操作–操作的类型–操作码
  • 指出参与操作的数据有关信息–操作数或操作数地址
  • 操作完成后所得到的结果应该存放在何处–存放结果地址
  • 现行操作完成后,如何指出下一步操作–后续指令地址
    在这里插入图片描述

指令中的地址码结构

在这里插入图片描述
常规双操作数操作:指令中有四个地址码
格式:

OPA1A2A3A4

功能:(A1)OP(A2)–> A3
操作数1存放在地址A1中,操作数2存放在地址A2中,操作数1和操作数2的运算结果存放在地址A3中,A4中存放后续要执行指令的地址。
如果这四个地址都以显地址的形式出现在指令中。这种指令就是四地址指令。但这种指令结构所需地址位数太多,而且直接给定后续地址的方式,反而使程序不能根据运算结果灵活变动。

  • 如果地址是以隐含的方式给定,而指令中并不给出该地址码,则这种隐含给定的地址就称为隐地址。
    例:事先约定操作数在某个寄存器中,为什么要采取隐含约定的方式呢?因为地址信息需占用指令的大部分位数,如果所有的地址信息都以显地址方式在指令中给出,势必会使指令变得很长,程序所需占用的存储空间增大,读取与执行指令所需时间增加。
  • 减少指令中显地址的数量,而简化地址结构的基本途径就是使用隐地址。
  • 如果在指令代码中明显地给出地址,如在指令中写明主存储器单元地址码或者寄存器号则这种地址称为显地址一条指令中给出几个显地址,就称为几地址指令
  • 按照地址结构,指令可分类为:
    三地址指令,二地址指令,一地址指令,零地址指令
    让四地址指令简化为三地址指令,关键是让后续指令地址采用隐地址方式,这样一条双操作数指令只需要给出三个显地址。
三地址指令(指令中有三个地址码)

格式:

OPA1A2A3

OP是操作码,表明这条指令做什么操作,A1是操作数1所在的地址,A2是操作数2所在的地址,A3是运行结果所在的地址。它们可能是寄存器号,也可能是主存储器地址码。
功能:(A1)OP(A2)–> A3,即A1对应的操作数与A2对应的操作数运算存放到地址A3【A1是地址码,而(A1)是指按地址码A1读取的内容,它是数据】
为了以隐含的方式给出后续指令地址,CPU设置了一个程序计数器PC
(PC )+n–> PC
PC是个兼有寄存器和计数器两种功能的部件,其中存放着读取指令地址。一个基本程序段往往依次存放在主存储器的一段连续区域中。
在这里插入图片描述
假定它的第一条指令共占有几个字节,第一个字节存放在1000H单元中,则执行这段程序时,先将程序的初始地址1000H送入PC,然后按PC存放的指令地址访问主存储器,从中读取指令,每读一个字节,PC的内容自动加1,当读完第1条指令后,PC内容一共加n,如果CPU在执行完第一条指令之后,顺序向下执行则PC现在的内容就是后续指令地址,如果第一条指令要求程序转移到2000H处,则将转移地址2000H送入PC,仍按PC新内容读取后续地址,所以程序计数器PC的作用就像一个指针,他指引CPU从何处去读取指令。
在这里插入图片描述
(PC)+n–>PC,即如果现行指令占n字节存储单元,则读完本指令后,PC内容一共加n,使PC指向后续指令地址。由于隐含约定为PC提供指令地址,所以指令代码中不需要给出后续指令地址,即后续地址是一种隐含地址,对PC内容的增量计数操作也是隐含约定的指令代码本身无需说明。

  • 从一个 寄存器或一个存储单元读取指令或数据之后,寄存器(或存储单元)中原来存放的内容并不丢失,除非将新的内容写入。即上述A1,A2中的数据并不丢失,所以可以多次执行。
二地址指令

指令中有两个地址码
格式:

OPA1A2

两个操作数运算后有一个不需要保存,比如两数相乘,部分积被逐渐替换,无需保留。则可将结果保存在不需要保留的操作数的所在地。

  • 由于地址A2提供的操作数在运行后仍保留在原处,称为源操作数,A2为源地址。由地址A1提供的操作数在运算后不再保留,该地址该用来存放运算结果,因为A1是最终存放运算结果的目的地址,所以一开始由A1提供的操作数,被称为目的操作数
  • 指令的基本功能:
    (A1)OP(A2)–> A1
    (PC)+n --> PC
一址址指令

指令中只有一个地址码
格式:

OPA
  1. 有些指令只需一个操作数,称为单操作数指令。例如对某操作数加1,减1,按地址A读取操作数进行操作OP,要求操作运算结果存放原地址A。这样的操作数被称为目的操作数。
    功能:
    OP(A)–>A ; (PC) + n–>PC
  2. 隐含约定目的双操作数指令,如果操作码含义是加,减,乘,除,与,或,异或一类,说明该指令是双操作数指令。按指令给出的源地址A可读取源操作数。在CPU中一般设置有一个被称为累加器AC的寄存器,指令可以隐含约定另一个操作数(即目的操作数)由AC提供,运算结果也将存放在AC之中。
    功能:
    (AC)OP(A)–>A ; (PC)+n–>PC
零地址指令

格式:

OP

有几种情况可以使用零地址指令:

  1. 不需要操作数的指令。例如,空操作指令,它本身没有实质运算操作,执行这种指令的目的就是消耗时间以达到延时的目的;又如,停机指令当然也不需要操作数。
  2. 该指令是一条但操作数指令,并隐含约定操作数在累加器AC中,即对AC中的内容进行OP指定的运算操作。功能:OP(AC)–>AC
  3. 对堆栈栈顶单元中的数据进行操作。

显地址多,则指令字长,导致所需存储空间大,读取时间长,但地址数多则使用较灵活,显地址数少,则指令字短,导致所需存储空间小,读取时间短,但使用隐地址的方式会对地址选择带来一定限制。就目前而言,设计者往往采用折中的方法,因此二地址指令与一地址指令使用频率较高。

指令中操作码结构

  • 操作码反映机器做什么操作
  • 其长度取决于指令系统中的指令条数,如某机器的操作码长度为n,则不同指令的条数最多为 2 n 2^n 2n。例如,操作码占用六位二进制码时,这台计算机最多允许有: 2 6 = 64 2^6=64 26=64条指令
  • 两种操作码编码方式:定长操作码和扩展操作码
固定格式–定长操作码

各指令操作码的位置,位数固定相同。操作码的长度是固定的,且集中放在指令字的一个字段中,指令的其余部分全部用于地址码。由于操作码的位数一定,且位数固定,读取和识别指令都比较方便。比如所读得的第一个字节指令代码是操作码,就知道该指令是单操作数指令还是双操作数指令以及相应的地址信息组织方法。译码电路也比较简单。

可变格式-- 扩展操作码

各指令操作码的位置,位数不固定,根据需要变化,操作码的位数随地址数的减少而增加。关键在设置扩展标志

  • 优点:为了提高指令的读取和执行速度,往往需要限定指令的字长,而要想在指令字长有限的前提下,仍能保持比较丰富的指令类型,我们可以采取扩展操作码。当指令中的地址部分较多时,让操作码的位数少一些;当指令中地址位数减少时,让操作码位数增多,以增加指令的种类。

  • 缺点:这样会增加识别操作码的难度。

  • 例:设某机器的指令长度为16位,包括一位4位基本操作码字段和三个4位地址字段。
    指令格式为:
    在这里插入图片描述
    (1)方法一:固定格式,则最多可以设计16条三地址指令。显然,4位基本操作码是不够的,必须向地址码字段扩展操作码的长度。
    (2)方法二:扩展操作码,该指令可以包含3,2,1或0各地址。若三地址指令仅需15条,二地址指令需15条,一地址指令需15条,零地址指令16条,共61条,应如何安排操作码呢?
    第一个图中第15-12位只取到1110,余下1111作为标志位
    第二个图中红色的第15-12位为标志位,11-8位被扩展为操作码
    第三个图中红色的8个1为标志位,地址码只有4位。

在这里插入图片描述

指令字长

  • 字节:在计算机中,一般用8位二进制代码表示一个字节。

  • 字:由字节组成。如,高档微机字长32位,由4个字节组成一个字。

  • 数据字:如果计算机的字表示一个数,就称为数据字。

  • 指令字:如果计算机的字表示一条指令,就称为指令字。

  • 机器字长:指计算机能直接处理二进制数据的位数

  • 指令字长:一个指令中包含的二进制代码的位数。

  • 指令字长度等于机器字长的指令,称为单字长指令
    指令字长等于半个机器字长的指令,称为半字长指令
    指令字长等于两个机器字长指令,称为双字长指令

  • 指令字长又分为等字长指令结构和变字长指令结构

等字长指令结构

在一个指令系统中,如果各种指令字长度是相等的,称为等字长指令结构,这种指令字结构简单,且指令字长度是不变的。
通常采用扩展操作码技术,使操作码的长度随地址数的减少而增加,不同地址数的指令可以具有不同长度的操作码。

变长指令字结构

如果各种指令字长度随指令功能而异,就称为变长指令字结构,这种指令字结构灵活,能充分利用指令长度,但指令的控制较复杂,主存储器一般是按字节编址,即以字节为基本单位,所以指令字长多为字节的整数倍,如单字节指令,双字节指令,三字节指令等。

CPU怎么知道这条指令有多少字呢?
指令系统的设计者通常将操作码放在第一个字节,当读出操作码后就可以马上判断这是单操作数指令还是多操作数指令或零操作数指令,从而知道后面还应读取几个字节。

指令和数据的寻址方式

编址和寻址的含义

编址设备:CPU中的通用寄存器,主存储器和输入输出设备。
编址单位:字编址,字节编址,位编址

  • 例:设有一个2MB容量的存储器,字长为32位,问:
    (1)按字节编址,地址寄存器,数据寄存器各为几位?编址范围为多大?
    2 M B = 2 21 × 8 2MB=2^{21}\times8 2MB=221×8
    地址寄存器21位,数据寄存器8位,编址范围00 0000H–>1F FFFFH
    (2)按字编址,地址寄存器,数据寄存器各为几位?编址范围为多大?
    按字编址,字长为32位,则 2 M B = 2 19 × 32 2MB=2^{19}\times32 2MB=219×32
    地址寄存器19位,数据寄存器32位,编址范围为0 0000H–>111 1111 1111 1111 1111B–>7 FFFFH
  • 寻址:存取数据时,必须先给出地址码,再由硬件电路译码找到数据所在地址
  • 寻址方式:处理器根据指令中给出的地址信息来寻找物理地址的方式,是确定本条指令的数据地址以及下一条要执行的指令地址的方法。
  • 地址指定方式,相联存储方式,堆栈存取方式,几乎所有计算机在内存中都采用地址指定方式
  • 采用地址指定方式,形成操作数或指令地址的方式称为寻址方法。

指令寻址方式

  • 寻址下一条要执行的指令地址。
  • 顺序寻址方式:
    在这里插入图片描述
  • 跳跃寻址方式
    在这里插入图片描述
    可以形成程序转移或构成循环程序,从而能缩短一定长度

操作数寻址方式

  • 寻找操作数的地址。
  • 操作数分四种类型:
    地址数据:指令中给出的形式地址,通过计算后得到有效地址。
    数值数据:定点数,浮点数,BCD码
    字符数据:ASCII码
    逻辑数据:进行布尔逻辑运算
  • 立即数寻址
  • 寄存器直接寻址
  • 寄存器间接寻址
  • 有的指令是通过操作数码的含义隐含约定给出寻址方式,有的指令则设置专门的寻址方式编码字段以说明采用何种寻址方式。
  • 如果是双操作数指令或数据传送指令,则指令涉及多个地址,各有自己的寻址方式,即一条指令中可以有多种寻址方式。
隐含寻址

这种类型的指令,不是明显地给出操作数的地址。而是在指令中隐含着操作数的地址。
例:DAA 将AL的内容调整为两位组合型的二进制数(BCD码)
在这里插入图片描述

立即数寻址

提供的操作数直接包含在指令中,这种操作数被称为立即数。立即数寻址方式常用来给寄存器赋初值。
特点:指令执行的时间很短,因为不需要访问内存取数
例:MOV,AL,05H

  • 立即数只能作为源操作数,不能作为目的操作数。
寄存器直接寻址

提供的操作数存放在CPU的内部通用寄存器中,可采用寄存器直接寻址方式。此时指令中给出的操作数地址不是内存的地址单元号,而是通用寄存器的编码,可以是8位,也可以是16位
例:MOV AL, BL
在这里插入图片描述

寄存器间接寻址

操作数的地址存放在寄存器中。
例:MOV AL,[SI]
与寄存器直接寻址方式的区别:指令格式中的寄存器内容不是操作数,而是操作数的地址,该地址指明操作数在内存中

在这里插入图片描述

存储器直接寻址
  • 提供的操作数存放在指令中指定的存储器单元中,简称直接寻址
  • 例:MOV AL,[2000H]
    在这里插入图片描述
    有效地址EA=操作数所在的内存地址A=2000H
存储器间接寻址

提供的操作数地址在指令中指定的存储单元中。
指令字段的形式地址不是操作数所在的
真正地址,而是操作数地址的指示器,或者说,此形式地址的地址单元才是操作数的有效地址。
在这里插入图片描述
有效地址EA=2000H

  • 缺点:两次访问内存,影响指令的执行速度,因此较少使用
相对寻址

提供的操作数存放在PC及相对位移量共同指定的存储器单元中。
相对寻址是把程序计数器PC的内容加上指令格式中的形式地址而形成的操作数的有效地址。
程序计数器的内容就是当前指令地址,相对寻址就是相对于当前的指令地址而言。

  • 好处:程序员无需用指令的绝对地址进行编码,因而所编的程序能够放在内存当中的任何地方。
    在这里插入图片描述
基址寻址

提供的操作数存放在BR及相对位移量共同指定的存储单元中。
将CPU中基址寄存器的内容加上指令格式中的形式地址而形成操作数的有效地址,这种方式称为基址寻址方式。

  • 特点:能够扩大寻址能力,因为与形式地址相比,基址寻址的位数可以设置很长,从而可以在较大的存储空间内寻址。
  • 主要用于程序定位,对程序员是透明的,BR的内容由操作系统或管理程序设定。
  • 例:MOV AL,DISP[BR]
  • EA=(BR)+A
变址寻址
  • 与基址寻址方式的计算有效地址的方法相似。它将CPU中变址寄存器的内容与偏移量相加来形成操作数的有效地址。
  • 例:MOV AL ,DISP[DI]
  • EA=(DI)+A
  • 用于实现程序串的规律性变化。变址寻址主要用于处理数值问题。可设定A是数组的首地址,不断改变变址寄存器IX的内容,便可形成数组中任一元素的地址,特别适合编制循环程序。
复合寻址
  • 基址加变址寻址:将CPU中基址寄存器的内容+变址寄存器的内容而形成操作数的有效地址
  • 相对基址加变址寻址:在基址加变址的基础上,再加入程序计数器PC的内容形成复合寻址方式。
小结
  • 立即寻址:无需寻址
  • 寄存器直接寻址: E A = R j EA=R_j EA=Rj,操作数本身直接存放在寄存器当中
  • 寄存器间接寻址: E A = ( R j ) EA=(R_j) EA=(Rj),操作数本身存放在主存储器中,指令格式中的寄存器的内容不是操作数,而是操作数的地址。
  • 存储器直接寻址(直接寻址):EA=A
  • 存储器间接寻址(间接寻址):EA=(A)
  • 相对寻址:EA=(PC)+A
  • 基址寻址:EA=(BR)+A
  • 变址寻址:EA=(DI)+A
    【 相对寻址,基址寻址,变址寻址都是偏移寻址。】
  • 基址加变址寻址:EA=(BR)+(DI)+A
  • 相对基址加变址寻址:EA=(BR)+(DI)+(PC)+A

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值