指令系统
1.相关概念(了解)
-
指令:计算机进行某种操作(控制或运算)的命令,以二进制代码的形式存放
从计算机组成的层次来看,有不同的指令概念- 微指令:微程序级的命令,属于硬件
- 宏指令:若干条机器指令组成的命令,属于软件
- 机器指令:通常所说的指令,可以控制计算机执行某种操作
接下来看看指令系统的概念
-
指令系统:也叫指令集,是计算机能直接执行的全部指令的集合
- 影响计算机系统的重要性能因素
- 所包含的指令类型,数量,格式,功能,寻址方式等
- 直接影响计算机的基本硬件结构以及系统软件设计
- 可以看成是计算机硬件的语言系统,是不同CPU的主要差别所在
- 分类:CLSC和RISC
- 影响计算机系统的重要性能因素
2.指令格式
机器指令是用机器字表示的,表示一条指令的机器字称为指令字,简称指令
2.1操作码
- 设计计算机的时候,对指令系统的每一条指令都要规定一个操作码。
- 指令的操作码表示指令应该进行什么性质的操作,比如加法,减法等。
- 不同操作用不同编码表示
- 一般,一个包含n位的操作码最多能表示2^n条指令
2.2地址码
一条指令有几个操作数地址,就把这个指令称为几操作数指令或几地址指令
地址码用来描述该指令的操作对象及其所在位置
-
三地址指令
- 有三个操作数地址A1,A2,A3
- A1为被操作数地址,也称为源操作数地址(源操作数指的是内容不随指令的执行而发生变化)
- A2为操作数地址,也称为终点操作数地址
- A3为存放操作结果的地址
-
二地址指令
- 有两个地址码字段A1,A2
- 分别指明参与操作的两个数在内存中或运算器中通用寄存器的地址
- 地址A1兼作存放操作结果的地址
-
一地址指令
- 一地址指令只有一个地址码,它指定一个操作数,另一个操作数是隐含的
- 地址码字段A指明的是操作数的地址
-
零地址指令
- 零地址指令的指令字只有操作码,没有地址码
- 比如停机指令不需要地址码,因为停机操作不需要操作数
- 操作数是指令要执行的数据来源,操作码指明进行什么性质的操作,比如加减乘除等,加法操作需要操作数,毕竟没有数我们做什么加法操作,操作数就是具体执行操作的对象
2.3指令字长
- 指令字长指的是表示指令的二进制编码的位数
- 字长必须是字节的整数倍
- 根据指令字长和机器字长(机器字长指的是计算机直接处理的二进制数据的位数)的关系分成:
- 单字长指令:指令字长等于机器字长
- 半字长指令:指令字长等于半个机器字长
- 双字长指令:指令字长等于两个机器字长
2.4扩展操作码技术
操作码的位数随着地址数的减少而增加
2.5指令格式例题
3.寻址方式
- 存储器可以用来存数据,也可以用来存指令。当某一个操作数或指令存在某个存储单元的时候,它的存储单元编号就是这个操作数或指令在存储器中的地址
- 寻址方式是产生操作数有效地址(有效地址指的是操作数存放的那个直接的地址)的方式,用来确定种类所用数据及下一条要执行指令的存放地址
- 不是直接表示操作数存放地址的叫形式地址
- 寻址方式指确定本条指令的操作数地址或下一条要执行指令的指令地址
3.1指令寻址
指令的地址保存在PC中
指令寻址分成顺序寻址和跳跃寻址
- 顺序寻址:
- 程序计数器PC加当前指令字节数n,自动形成下一条指令的地址
- (PC)+1------>PC
- 跳跃寻址:
- 由当前指令(转移类指令)的地址码域给出下一条指令的地址
(PC)表示的是里面的内容
3.2数据寻址
确定本条指令的操作数地址
3.2.1立即寻址
3.2.2直接寻址
3.2.3间接寻址
3.2.4寄存器寻址
寄存器的数量有限,所以RI字段不需要特别长
3.2.5寄存器间接寻址
- 特点
- 比一般间接寻址速度更快,但指令的执行阶段需要访问主存,因为操作数在主存中
3.2.6隐含寻址
把A指向的操作数和存放在ACC的操作数进行加法操作并把结果存回ACC
3.2.7偏移类寻址方式
偏移类寻址方式是通过地址计算来获得操作数的有效地址,都是一个寄存器内容加上一个形式地址
常见的三种偏移寻址是相对寻址,变址寻址,基址寻址
-
变址寻址:形式地址A为基准地址,变址寄存器内容为偏移量
-
基址寻址:基址寄存器内容为基准地址,形式地址A为偏移量
-
-
把基址寄存器中的地址取出来,把指令字的形式地址A取出来,二者通过ALU相加,就得到了有效地址
-
程序执行过程中,基准地址不可以改动,形式地址可以变化
-
相对寻址
-
- PC作为基准地址去找数据
程序的局部性原理:
程序执行过程总是趋向于最近使用过的数据和指令,程序执行的时候使用的信息和访问的存储器地址分步不是随机的,而是相对集中
集中包括时间和空间两个方面
程序的时间局部性:
程序的某条指令或数据执行,在一段时间间隔还可能执行,比如for循环求和,sum就是这次执行,下一次还要执行
程序的空间局部性
程序一旦访问某个存储单元,相邻单元也可能被访问,比如说数组和链表