考研408《计算机组成原理》复习笔记,第四章(2)——指令寻址和数据寻址
一、寻址概念
看图,重点就是:
【寻址】就是:【指令寻址】和【操作数寻址】
- 【指令寻址】包括:
- 【顺寻寻址】、【跳跃寻址】(后面细学)
- 【操作数寻址】包括:
- 【立即寻址】、【直接寻址】、【间接寻址】、【寄存器寻址】、【寄存器间接寻址】、【相对寻址】、【变址寻址】.......(后面细学)
二、指令寻址
1、顺序寻址
知识点:
- 读取指令依靠【PC】,它存的是【下一条预执行指令】
- 记住以后【PC】自增不再单纯是【PC = PC + 1】,要写成【PC = PC + “1”】,因为这个【+ “1”】其实是【下一条指令的起始位置】
- 比如:若一个计算机【按字节编址】
- 若【1条指令】刚好就是【1字节】,那么满足【PC = PC + 1】
- 若【1条指令】是【2字节】,那么则是【PC = PC + 2】
2、跳跃寻址
知识点:
- 【下一条预执行指令】不再依靠【PC】获得,而是依靠【上一条指令要求去哪】获得
- 比如:若一个计算机【按字节编址】
- 若【1条指令】刚好就是【1字节】,那么满足【PC = PC + 1】
- 然而【PC】执行在执行第一条指令时,【控制器的CU】译码后发现要执行【跳转到指令0x18】
- 所以命令【PC】马上跳去【0x18】,【PC】也没办法,只能跳过0x17、直接跳到0x18
三、操作数寻址
1、概念重点!!
前面我们刚学指令概念的时候,说指令的结构是【操作码OP + 地址码A】
现在学到了寻址,我们就要在原基础上再分出一个结构【寻址方式 M(method)】
那么对应不同的【寻址方式】,会有不同的【二进制代码】,比如:
- 其中我们通常把【指令中的 “形式地址”】标作【A】
- (有的教材也会把【指令中的 “形式地址”】标作【D】)
- 真实存放在【主存】或【CPU寄存器】的这种数据地址叫做【EA】
2、六种简单操作数寻址
1)立即寻址
重点是:
- 【指令的 “形式地址”】:存的就是【操作数本身】
- 存时: 【操作数】和【指令】都 一起 放在【主存】
- 取指令时:【操作数】和【指令】一起放在IR(只有“立即寻址”这样,别的都没有)
- 执行指令时:【直接从IR取出 指令+操作数 执行】
2)直接寻址
重点是:
- 【指令的 “形式地址”】:存的是【操作数的主存地址】
- 存时:【操作数】和【指令】都 分开 存放在【主存】
- 取指令时:只有【指令】放到【IR】
- 执行指令时:【IR取指令执行】、【主存取数据】
3)间接寻址
重点是:
- 【指令的 “形式地址”】:是【操作数的间接地址】
- (立即寻址是【操作数本身】)
- (直接寻址是【操作数的主存地址】)
- 存时:【操作数】和【指令】都 分开 存放在【主存】
- 取指令时:只有【指令】放到【IR】
- 执指令行时:【IR取指令执行】
- 而先去根据【形式地址】到【主存】取【操作数的有效地址】
- 再根据【操作数的有效地址】到【主存】取【操作数数据】
- 干嘛要这么麻烦?原因就是:
- 扩大了数据【寻址的范围】!!!!
- 对比【直接寻址】和【间接寻址】可以发现:
- 【直接寻址】里【数据的有效地址】直接就在【形式地址】给出了,但是【形式地址】大小有限,限制了【寻址范围】
- 【间接寻址】里【数据的有效地址】是在【主存】,先去【主存】找到【数据的有效地址】,再找到【数据】,那明显【主存的大小】会比【形式地址的大小】大
(就好比:你问你朋友要个电影来爽爽,但是如果你朋友直接发个 “网盘链接” 你,你能看的电影量就很少;那他要是给你一个 “资源分享网站”,那你在那还能看到别的网友分享更多的 “网盘链接”,网盘链接里又有很多很多电影)
4)寄存器寻址
重点是:
- 【指令的 “形式地址”】:是【操作数所在的寄存器编号】
- (立即寻址是【操作数本身】)
- (直接寻址是【操作数的主存地址】)
- (间接寻址是【操作数的间接地址】)
- 【存时】:完全分开 存放,【操作数】在【CPU寄存器】、【指令】在【主存】
- 【取指令时】:依旧只有【指令】放到【IR】
- 【执行指令时】:【IR取指令执行】、【CPU寄存器取数据】
5)寄存器间接寻址
重点是:
- 【指令的 “形式地址”】:是【操作数地址所在的寄存器编号】
- (立即寻址是【操作数本身】)
- (直接寻址是【操作数的主存地址】)
- (间接寻址是【操作数的间接地址】)
- (寄存器寻址是【操作数所在的寄存器编号】)
- 【存时】:【操作数】和【指令】都 分开 存放在【主存】
- 【取指令时】:依旧只有【指令】放到【IR】
- 【执行时】:【IR取指令执行】
- 先根据【形式地址】去找到含有【数据主存地址】的【CPU寄存器】
- 然后再根据【数据在主存地址】去【主存】取出执行
6)隐含寻址
重点是:
- 不管需要几个操作数,总有一个隐含放在【ACC累加寄存器】,无需【形式地址】提供
- 减少了【指令字长】,不过就得增加存这个隐含地址的寄存器
可以回顾【一地址指令】:
总结
3、其他重要复杂寻址方式
重要,我们需要知道它们的【寻址数据过程】和【怎么算操作数地址】就行
那么我还是把有用的重点写在最前面,你看完之后爱看配图看配图,不爱看你也大概知道什么意思了
1)偏移寻址
首先记住这三种寻址方式都叫【偏移寻址】
- 他们的【指令的 “形式地址”】存的都是【偏移量】
- 寻找操作数的方式都是——【某个寄存器的值】+【形式地址(偏移量)】
【相对寻址】
重点:
- 1、【指令的 “形式地址”】:是【相对于当前PC值】-【真实操作数主存地址】所差的【偏移量】
- 比如:当前PC=2,真实数据地址在 4,【形式地址】=【偏移量】= 4 - PC = 2
- 2、【存时】:【操作数】和【指令】都 分开 存放在【主存】
- 3、记住:【有效地址 = 当前PC + 形式地址 (偏移量)】
- 写作:【EA = (PC) + A】或【EA = (PC) + D】(A/D都是表示 “形式地址”)
- 注意:PC的值往往是执行完一条指令后【自增】后的结果
- 如果题目直接给出【PC=?】,那么直接【EA = (PC) + A】
- 如果题目没有给出PC的值,那么要在上一条指令执行完的结尾地址基础【+ “1”】
- 例子
【基址寻址】
重点是:
- 1、单独专门用一个【基址寄存器】来存储一个【基地址】
- 【基址寄存器】可以是【专用寄存器BR】
- 【基址寄存器】也可以是【通用寄存器R】
- 2、【指令的 “形式地址”】:是【当前基址寄存器 BR 值】-【操作数主存地址】所差的【偏移量】
- 3、【基址寄存器值】+【形式地址(偏移量)】才构成——>【操作数主存地址】
- 写作:【EA = (BR) + A】或【EA = (BR) + D】
- 4、【指令结构】会多一个【存储器编号】
- 5、【基址寄存器】是面向 操作系统OS 或 管理程序 的,不能由用户更改
- 所以【基址寄存器BR】的地址不可变!!
- 而【形式地址A(偏移量)】可以变
- 6、每一个程序都可以有一个自己的【基址寄存器】
- 从而用户只用关心当前程序存在主存什么位置
- 利用了【多道程序设计】,可用于【编制浮动程序】
【变址寻址】
重点是:
- 1、单独专门用一个【变址寄存器 I】来存储一个【基地址】
- 2、【指令的 “形式地址”】:是【当前变址寄存器 I值】-【操作数主存地址】所差的【偏移量】
- 3、【变址寄存器 I 值】+【形式地址(偏移量)】才构成——>【操作数主存地址】
- 写作:【EA = (I) + A】或【EA = (I) + D】
- 5、【变址寄存器 I 值】会自己【自增】
- 所以【变址寄存器 I 值】的地址可以变!!
- 而【形式地址A(偏移量)】不会变
- 和【基址寻址】刚好相反
- 6、适合用于【数组】的应用!!!!
【堆栈寻址】
重点,记住这几点就够了:
- 1、【零地址指令】爱用
- 2、有一个专门寄存器叫【SP】,也叫【堆栈指针】,用于记录 读/写单元地址
- 3、在【寄存器】的叫【硬堆栈】;在【主存】的叫【软堆栈】
- 还有它的大概流程: