考研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位】这个选项

这是因为我们忘记了前面学的:【指令字长】必须是【编址(字长)的整数倍】

相关推荐
菜菜子爱学习12 分钟前
Nginx学习笔记(八)—— Nginx缓存集成
笔记·学习·nginx·缓存·运维开发
岑梓铭2 小时前
考研408《计算机组成原理》复习笔记,第四章(3)——指令集、汇编语言
笔记·考研·408·计算机组成原理·计组
yuxb733 小时前
Ansible 基础到实操笔记
linux·笔记·ansible
Qlittleboy4 小时前
tp5集成elasticsearch笔记
大数据·笔记·elasticsearch
rannn_1116 小时前
【Linux学习|黑马笔记|Day4】IP地址、主机名、网络请求、下载、端口、进程管理、主机状态监控、环境变量、文件的上传和下载、压缩和解压
linux·笔记·后端·学习
麻雀无能为力7 小时前
python自学笔记8 二维和三维可视化
开发语言·笔记·python
Moonnnn.7 小时前
【51单片机学习】定时器、串口、LED点阵屏、DS1302实时时钟、蜂鸣器
笔记·单片机·学习·51单片机
菜菜子爱学习10 小时前
Nginx学习笔记(九)—— Nginx Rewrite深度解析
linux·运维·笔记·学习·nginx
Always_away12 小时前
数学分析| 极限论| 1.数列极限常用方法总结
笔记·学习·考研·数学