一、机器指令特征
- 机器指令要素
- 机器指令的标识
- 指令系统的设计
机器指令要素
- 操作码:用来指定要完成的操作类型(如ADD , I/O)
- 源操作数的引用 : 计算机完成的每个操作都会涉及一个或多个源操作数,因此,在一条指令中需要指明从哪里得来这些源操作数 (????)
- 结果操作数的引用 : 它用来指明操作结果被存放在何处。
- 下一条指令引用:告诉cpu,这一条操作结束后去哪里取下一条指令
操作数可以存放的位置
- 主存或虚存 :在指令中提供主存或虚存地址
- CPU寄存器 : 在指令中提供寄存器编号
- I/O设备 : 在指令中提供外设地址
指令的表示
- 在计算机内部,用一个二进制位串来表示机器指令,这个串又被划分成几个字段,分别对应指令的各个要素。
- 但这种形式不易记忆和阅读
- 符号表示法 (普遍使用)
ADD
加 // ADD R1 R2SUB
减MUL
乘
指令系统的设计
作用
- 设计指令系统就是要选择计算机系统中一些基本操作应该由
硬件实现
还是由软件实现
- 选择复杂操作是由
一条
还是一串
指令来实现
设计指令系统需要考虑的因素
操作清单
:即指令系统中应提供多少种操作和什么样的操作,以及操作的复杂复杂程度。数据类型
: 指令可以对哪几种数据类型完成操作指令格式
: 确定指令的长度,包含字段,字段含义等寄存器
: CPU的那些寄存器能够被指令访问,他们的功能是什么寻址方式
: 如何完成操作数的有效地址
指令系统的两个发展方向
- 复杂指令系统 :增强原有的指令功能,设置更为复杂的新指令实现软件功能的硬化。 //复杂指令系统计算机CISC
- 庞大的指令集合,多大几百条
- 复杂
- 硬件利用率低
- 精简指令系统 : 减少指令种类 和简化指令功能,提高指令的执行速度 //精简指令系统计算机RISC
- 单周期指令 //除去访存指令外,其他指令的操作均在单周期内完成
- 简单指令格式、简单的寻址方式
- 尽量使用寄存器-寄存器操作指令
- 最终达到加快机器处理速度的目的
二、操作数的类型和操作的类型
- 操作数的类型
- 操作的类型
操作数的类型
- 操作数是指令处理的对象
- 常见的操作数类型 : 地址、数字、字符和逻辑数据
地址
: 可以看做是一种数据,很多情况下要计算操作数的地址时候,可将它当做一个无符号的整数数字
: 数值型数据,计算机中普遍使用的三种数据类型- 二进制整数 :二进制补码表示
- 二进制浮点数 : IEEE754标准浮点数格式
- 十进制数: 压缩/非压缩的BCD码表示
字符
:普遍采用ASCII码来处理逻辑数据
:例如 0001 被当做假假假真
操作的类型
数据传送
:寄存器、存储单元之间的数据传送数据处理
: 实现数据的算术运算、逻辑运算和比较运算程序控制
: 主要用于控制程序的执行顺序、使程序具有测试、分析、判断的能力。 通常有以下几种:- 转移指令
- 子程序调用指令
- 返回指令
输入输出
:CPU寄存器与外设寄存器之间数据的输入输出
三、指令的格式
指令的格式
:操作码字段(OP)地址码字段(A)操作码字段
: 指明CPU完成什么操作地址码
: 指出操作数从哪里来,结果送往那里去,下一条指令从哪里取
指令格式的设计:
- 涉及的
三个问题
- 操作码结构
- 地址码结构
- 指令字长度
操作码结构的设计:
定长操作码
基本思想
:操作码的长度固定、位置固定、且几种放在指令的一个字段中机器允许的最大指令数量
: 例如某操作码占8位,则最多可以有2^8条指令- 然而,一般实际指令数是不会到达最大的,因为有一部分指令是冗余信息,也称
非法指令
- 然而,一般实际指令数是不会到达最大的,因为有一部分指令是冗余信息,也称
优点
: 简化硬件设计,减少指令译码时间,在字长较长的大中型计算机一家超级小型计算机上广泛采用。
扩展操作码
基本思想
: 操作码长度可变,对于不同类型的指令,其操作码的长度是不同的。并且,操作码还分散的存放在指令的不同位置上。在指令中用一个固定长度的字段表示基本操作码,而对于一部分不需要某个地址的指令,可将操作码扩充到地址码字段。优点
: 缩短了指令字长度,但大大增加了译码的复杂度,增加了控制器的设计难度。 在字长较短的小 微型计算机上广泛使用
- 在本例关于设计15条三地址指令中,1111不用,它用来当做扩展标志。表明三地址指令的操作码向后面扩展了一个地址码的长度(4位)。当计算机看到1111就把这条指令当做二地址指令。 采用这种扩展操作码技术可以设计出61条指令,但如果采用定长操作码则只能设计出2^4条存储指令。
- 一般情况下是把1111当做标志的,但也可以让1110,1101……当做标志,比如三地址向二地址转换设立1101、1110、1111三个标志位。
注意,这是三地址到二地址的标志,并不是二地址向一地址的标志(二-->一的标志是 1111 1111
)。 ???- 1101为标志时,有0000 -->1111共16个地址。 (新扩展的四位可以取1101和1111)
- 1110为标志时,共有0000–>1111共16个地址
- 1111为标志时,共有0000–>1110共15个地址
- 说明:实际上扩展操作码有多种扩展方式,在设计变长操作码的指令系统时,应尽量让使用
频度高
的指令占用短
的操作码,对使用频度低
的指令可占用较长
的操作码,这样可以缩短经常使用的指令的译码时间
相关概念
机器字长
:计算机一次处理二进制数的位数
指令字长
: 一条指令所对应二进制的位数,指令的长度取决于操作码的长度
、操作码地址的长度
和操作地址的个数
。理论上希望指令字长尽可能的短,这样可以节省存储空间 减少访存次数,提高指令执行速度,但这样一来指令的数量就非常有限。
存储字长
: 存储器中一个存储单元地址所对应的**存储单元(空间)**里面一次能存储或取出的二进制数的位数
三者关系
: 最开始要求三者相同,但后来随着硬件与软件的发展,它们三者的长度可以不一样了,但它们三个的字长必须是字节的整数倍
CPU访问的单位
:CPU访问的单位是字节。
地址码
- 用来指明操作数、结果、下一条指令的地址。在地址码字段减少的过程中,
指令总长度不变,操作码字段长度不变! 现在假设指令长度是32位,操作码长度是8位
一、 四地址指令
根据地址码字段的个数的不同可分为:四地址指令、三地址指令、二地址指令、一地址指令和零地址指令。下面我们来看一下四地址指令的结构:
op | A1 | A2 | A3 | A4 |
---|
A1
:指明第一个操作数的地址
A2
: 指明第二个操作数的地址
A3
: 指明结果的地址
A4
: 指明下一条指令的地址
完成功能:(A1) OP (A2)->A3,四地址指令直观易懂,但指令字长较长,且每个地址码字段的寻址范围较小(地址码各占6位,寻址范围2^6^=256
)。(4次访问内存)
二、 三地址指令
因为程序是按顺序执行的,因此CPU会自动形成下一条指令的地址,这样就可以省去第四个地址字段A4形成三地址指令,结构如下:
op | A1 | A2 | A3 |
---|
A3: 指明结果的地址
完成功能:(A1) OP (A2)->A3
在指令字长不变的情况下,三地址指令提高了剩余三个地址码字段的寻址范围,但译码难度相对增大(地址码各占7位,寻址范围2^8^
)。(4次访问内存)
三、 二地址指令
在三地址指令的基础上,我们将A3用A1或A2来代替,运算结果不保存在A3中,而是保存在参与运算的A1或A2中,这样就形成了二地址指令,其结构如下:
op | A1 | A2 |
---|
A1 :指明第一个操作数的地址
A2: 指明第二个操作数的地址
A1(或A2 ):又作为运算结果的存放地址
完成功能:(A1) OP (A2) -> A1(A2), 同城存放结果的地址码字段称为目的操作数
,另一个称为源操作数
,在指令字长不变的情况下,地址码字段的寻址范围继续扩大(地址码各占12位,寻址范围2^12^)
。需要注意的是,目的操作数原来存放的内容已经被破坏了。二地址指令还可以分为三类。(4次访问内存)
四、 一地址指令
如果我们把某个操作数以隐含的方式或指定的方式存放在累加器ACC中,那么就可以用ACC代替A1或A2。就形成了一地址指令。其结构如下:
op | A1 |
---|
A1:指明一个操作数的地址
另一个操作数采用隐含的方式之处,一般在累加器ACC中。
完成功能 : (A1)OP (ACC) -> ACC, 地址码的寻码指令大大提高,但译码难度相对增大。使用累加器,因此访存次数是2次。
五、 零地址指令
没有地址码 , 只有操作码的指令地址称为零地址指令,其结构如下:
op |
---|
通常,用来表示不需要地址码或者有一个或两个隐含地址的指令。如停机指令、栈堆类指令等