考研408《计算机组成原理》复习笔记,第四章(1)——指令系统概念(指令字长、N地址指令、定长和变长操作码)
一、指令系统概念
1、什么是指令?
说人话:
- 我们的写的程序代码——>变成一条条【机器指令】
- 这里【指令】就是指【机器指令】,存放在【主存 / Cache】里
2、什么是指令集(指令系统)?
- 一个计算机里所有的指令————就叫【指令集】或【指令系统】
- 不同的计算机的【指令集】不同
- 比如:Window X64 和 Mac 的指令集肯定不一样,电脑和手机的指令集也不一样,这就是为什么一款软件要对应这么多版本,因为不能直接搬到不同的设备上运行
3、指令集体系结构(ISA:Instruction Set Architecture)
不用知道具体是什么,你就知道下面这俩个点就够了
注意2个知识点:
- 1、【指令系统】是【指令集体系结构(ISA)】的【最核心部分】
- 2、ISA规定的内容的主要概括:(死记硬背吧......)
- 其中【指令格式】是因为对应不同的寻址方式,指令的格式是不一样的,我们刚开始通俗的理解的时候是【操作码 + 地址码】,但其实还有很多种
- 【操作类型】有哪些?简单了解(有个印象就行)
注意:【操作码】有【N位】,就说明有【2^N】种【操作类型】
- 【操作数类型】就是:int、double、float、char.......
- 别的没啥解释,直接背吧
当然我也问了豆包,通俗的解释是(方便你记忆前面的知识点):
4、还有,什么属于ISA?什么不属于?
不知道怎么专业解释,反正记一下吧
- 具体的一个指令就属于ISA
- 但是具体用什么硬件电路实现?运算步骤?都不属于ISA范畴
;
例子:
二、指令形式
1、【直接寻址】的基本格式
这一章我们只需要把【指令格式】记成【操作码 + 地址码】就行了,这对应的是【直接寻址】方式
(CPU控制器里的【IR指令寄存器】大小和【指令长度】一样,因为【IR】就是用来存指令的)
- 操作码(OP: Option):就是要【进行什么操作(加、减、乘、除、传送......)】
- 其中,【操作码的地址】会【隐式】包含在操作码
- 地址码(A: Adress):操作码要进行操作所涉及的【操作对象(操作数)】
- 【操作对象的地址】会【显式】包含在地址码
- 【操作对象(操作数)地址】包括:【指令地址】、【数据地址】
2、指令字长
指令字长就是:一条指令所包含的二进制代码的位数,由【操作码长度】+【地址码长度】+【地址码个数】决定(也不用管地址码个数是为啥,学到后面就会了)
回顾【3大字长】知识点:
- 【机器字长】:就是【字长】、【1个字】,就是CPU一次可以处理的数的最大长度
- 和【ALU】、【通用寄存器】位数一样
- 比如:“一个32位的计算机”、“Window x64计算机” 这些数都是【机器字长】
- 【存储字长】:一个【存储单元】的大小
- 和【MDR位数】、【数据总线位数】一样
- 【指令字长】:一个【指令】的长度
- 和【IR指令寄存器】位数一样
按【3种指令长度】分类
指令字长的长度和机器字长没有固定关系,可以等于机器字长、也可以大于、也可以小于
具体分为3种:
- 半指令字长:指令字长是机器字长的一半
- 单指令字长:指令字长等于是机器字长
- 多指令字长:指令字长是机器字长的多倍(双指令字长就是机器字长2倍)
;
注意!!!!
- 【指令】存储在【存储器】里,所以【指令字长】必须得是【编址的整数倍】
- 比如题目说:【按字节编址】,那么【指令字长】就必须是【字节(8b)的整数倍】!!!
- 然后这些基础都是建立在【存储字长 = 机器字长】才行
- 这样才【取一个机器字长大小耗时】=【取一个存储单元大小耗时】=【1个存储周期】
【定长指令】和【变长指令】
其实只用记住
- 【定长】就是:指令长度固定
- 【变长】就是:指令长度不固定
3、指令的一般格式
1)按【地址码数量】分类
【零地址指令】
知识点:
- 1、不需要【地址码】
- 2、【不需要操作数】的情况,他只干这么几件事:(反正就是不适合运算)
- 空指令NOP、等待指令WAIT、停机指令HALT(或HLT)、程序返回指令RET
- 3、如果你非要非要非要【运算】,也就是【需要操作数】情况
- 那么只能在【堆栈计算机】运行!!!!
- 也叫【堆栈运算指令】!!!
【一地址指令】
知识点:
- 1、有【地址码】了,但是只存【一个操作数地址】
- 比如:X+1,我们只存X的地址,1不用知道地址,1就是数字1啊,已经告诉你了
- 2、但是根据【对一个操作数操作】和【对二个操作数操作】依旧有2种形态:
- ① 只含有一个【源操作数】,也就是只有一个【未知变量】
- 那么对它的操作,【最后的结果】依旧存回【该源操作数地址】
- 比如:【X】+【1】,得到的结果【X+1】还是更新存回【X】的地址
- 写作OP(A1)—>A1
这里湖工大的视频把 “结果” 当成是 “目的操作数”
- ②你非要算二个【未知变量】,也就是【隐含 目的操作数地址】
- 怎么说 “隐含”? 因为【地址码】实际还是只含有【源操作数地址】
- 那么这个【目的操作数】不需要提供地址,只能由【ACC累加器】提供!!!你就往死里记——只能是【ACC累加器】提供!!!!
- 比如:【X】+【Y】,【Y】由【ACC累计暗器】提供,并把【X+Y】结果存回【ACC累加器】
- 写作:(ACC)OP(A1)—>ACC
这里我不知道湖工大的视频为甚要写成 “AL”、“AX”,别管他神经的
【提示】
一共要访存3次
可以对照① 只含有一个【源操作数】,也就是只有一个【未知变量】
- 1、先去主存取出指令:【OP(A1)】
- 2、然后取出地址码,再去主存找到A1的地址
- 3、最后【—>A1】,得到的结果存回A1,又要访问一次主存
【二地址指令】
知识点:
- 1、有【地址码】,且存【2个操作数地址】
- 2、这就好理解了嘛,A1是【目的操作数地址】、A2是【源操作数地址】
- 比如:【X】+【Y】,【X】和【Y】都可以存到地址码里了
- 3、记住,【结果】还是存回【A1 目的操作数地址】
- 比如:【X】+【Y】,【X + Y】的结果还是存回【X】
- 4、写作:(A1)OP(A2)—>A1
有的地方也会这么说:A1是【源操作数1地址】、A2是【源操作数2地址】,这个不用纠结,根据题目大概意思你也能猜出是什么意思,本质都是:谁在左边A1,结果就存左边A1
【提示】
- 注意,寻址范围【2^N】,这里的【N】是【单个操作数地址码位数】,而不是【整个2操作数地址码位数】!!!
- 然后访问主存4次
【三地址指令】
知识点:更简单了,我都懒得说
- 1、有【地址码】,且存【3个操作数地址】
- 2、这就好理解了嘛,A1是【源操作数1地址】、A2是【源操作数2地址】、A3是【目的操作数地址】
- 3、【结果】就可以存回【A3目的操作数地址】
- 比如:【X】+【Y】,【X + Y】的结果可以存到【A3】
- 4、写作:(A1)OP(A2)—>A3
【提示】
- 注意,寻址范围【2^N】,这里的【N】是【单个操作数地址码位数】,而不是【整个2操作数地址码位数】!!!
- 也是访问主存4次(你总要存结果的嘛)
【四指令地址】
只说4句话:
1、有【地址码】,且存【4个操作数地址】
2、【A4地址】存放【下一条即将执行的指令地址】
3、写作:(A1)OP(A2)—>A3,A4=下一条将要执行指令的地址
4、也是访问主存4次(你总要存结果的嘛,然后A4跟本次操作无关)
;
【提示】
- 注意,前面【零地址指令】【一地址指令】【二地址指令】没有存放【下一条要执行的指令地址】,他们怎么知道下一条指令是啥?————>隐含存在【PC】!!
2)按【操作码长度】分类
【定长操作码】
看图吧:
甭管你后面是几个地址的地址码,我们只看操作码,是【N位】就对应【2^N种指令】
【变长操作码(难点)】
这里变长操作码有点难理解,记住这几个重点:
- 1、变长操作码的目的:就是【增加更多操作指令】
- 2、核心做法:就是扩大【操作码】、“吞掉”【地址码】
- 所以,只能是【多地址指令】——扩展——>【少地址指令】(绝不可反过来)
- 3、【短操作码】扩展【长操作码】中,绝不允许【长操作码】出现【短操作码前缀】。什么意思?看图理解:
- 扩展完后,地址码的操作数必然是要减少的,也就是【N地址码指令】会变成【N-1地址码指令】。那同样都是 “一大串二进制数” ,怎么区分这些指令是是【? 地址指令】呢?
- 那就是:前者【多地址指令】借出【最后几条指令操作码】————>给后者【扩展指令】作为【其操作码前缀】
- 从而达到后者【扩展指令】的【操作码前缀】绝对不会出现前者的【操作码】
- 比如下面例子:
- 一个【3位操作码】扩展成【5位操作码】后,如果要求【要扩展的是 4条 指令】,那么【3位操作码】就绝对不可以使用最后一条指令【111】,只能借给【5位操作码】作为前缀:【111xx】;
- 一个【3位操作码】扩展成【5位操作码】后,如果要求【要扩展的是 8条 指令】,那么【3位操作码】就绝对不可以使用最后二条指令【111】和【110】,只能借给【5位操作码】作为前缀:【111xx】、【110xx】;
- 4、怎么算扩展后【原指令有几个指令?】和【可以多扩展几个指令?】
- 【原指令有几个指令?】
- 仔细看前面那个图就知道,一个 N位操作码 的【原指令】是借出了 最后K个指令 给【扩展指令】作为前缀
- 所以就是:【2^N - K 个指令】
这个图片,4位操作码【借走了一条指令:1111】,所以还剩【2^4 - 1=15】条指令
- 【可以多扩展几个指令?】
- 仔细看前面那个图就知道,一个 M位操作码 的【扩展指令】被借到了 K个指令 作为前缀,所以已知【前缀固定是 K个】,剩下的 M-K位 就可以随意组合0或1
- 所以就是:【K × 2^(M-N) 个指令】(注意,M减去的是原指令的操作码位数,而不是借出的K位)
这个图片,扩展后的操作码一共8位,前4位是借到的【1条指令前缀:1111】,后8-4=4位可以任意组合,所以可以有【1 × 2^4 = 16】条指令
例题1
例题2
注意,op操作码每次往后扩展,都是直接【吞掉】一块【地址码】
例题3
这题第一次做会有点想骂娘,其实题目说【?地址指令】有【M条指令】,并不是代表【最多可以有M条指令】,【M条指令】只是它设置了有这么多指令
但实际如果你愿意,【?地址指令】可以最多有【N种指令】,只要满足【N > M】就行!!!!!!!!!!!!
然而就在你以为正确了之后,你会发现没有:【5 + 6 + 6 + 6 = 23位】这个选项
这是因为我们忘记了前面学的:【指令字长】必须是【编址(字长)的整数倍】