计算机系统结构 寻址方式和指令系统
什么是寻址?为什么要寻址?--概念
文字拆解法:
什么是寻址?
计算机中的指令寻找地址
地址是什么?
1. 内存
2. 寄存器
3. 堆栈
所以指令寻找的是上面三种地址
总结:
计算机要执行指令来完成一个特定的功能或者任务,所以需要去主存,
寄存器和堆栈中这三种地址里面寻找该指令所需要的一个操作数和信息,这个过程就叫做寻址
寻址有哪些方式?--概念
对三种寻址的三种面向
内存:面向主存
寄存器:面向寄存器
堆栈:面向堆栈
那么一条指令是怎么知道去哪个地方寻址地址的呢?
一般情况下,指令由两个部分组成:操作码和地址码。
而描述需要从哪里取值,则会在这两个部分中任意一个部分里面写入标识,这个标识可能占用1~n位
主存是物理地址,是实际存在的,而程序根据语言中的操作符,
比如C语言的&符号进行地址的操作,此处的地址属于逻辑地址
由一堆逻辑地址组成的空间叫做逻辑地址空间,同理,由一堆物理地址组成的空间叫做物理地址空间
怎样寻址?--程序定位
程序定位的过程就是寻址的过程
逻辑地址空间转换为物理地址空间的过程就是程序定位
当一个程序开始运行之前,都会先被加载入逻辑地址中,
然后再由逻辑地址去寻址对应的物理地址,这个就是程序定位的过程。
因为机器语言只认识物理地址,并不认识逻辑地址。
程序定位技术共有三种方式实现:
1. 静态再定位
2. 动态再定位
3. 虚实地址映像表
这三个方式的说明:
1. 静态再定位:我们把程序装入程序储存的过程中,程序中的逻辑地址空间全部被替换为物理地址空间。
可以理解为,程序在这一个步骤中,所有的关于逻辑地址的都被改写为了物理地址,然后再存储。
2. 动态再定位:在程序执行的过程当中,再把对应的逻辑地址替换为物理地址。
要实现动态再定位,需要额外两个部件:基址寄存器和地址加法器。
物理地址=基址寄存器中存储的地址+加法器当前获取的逻辑地址。
而基址寄存器中保留的地址其实就是当前该程序的起始地址
3. 虚实地址映像表:代表Cache高速缓存存储器和虚拟存储器
信息是怎样存在主存中的?--信息的存储和分布
- 主存宽度
比如一个64位的电脑,每次读写最大为64位的数据量。
就比如,一个四车道的公路,一次最大允许同时驶过4辆小轿车这种情况
- 信息宽度
这个是指某数据的大小,比如一条数据占10位。这个就是信息宽度
- 存储周期
理想状态下,当信息宽度小于主存宽度的时候,一个存储周期即可拿到,
而信息宽度大于主存宽度,则信息宽度/主存宽度,然后相上取整。
比如13/4=3.25,相上取整等于4。但是这是理想状态下。
如果一条信息的初始地址和结束地址分别处于两个主存宽度中,
比如,有两个主存宽度,分别是0~63,64~127,而此数据初始地址为50,结束地址为72,
那么此数据信息宽度其实是22位,按照理想状态只需要取值一次即可,
但是实际是需要取值两次才行。
所以影响存储周期的有两个条件:
1. 信息存储的时候是按照此信息的起始位置计算
2. 主存是按照宽度进行编址的。
关于第二点解释:
比如一个64位的机器,主存从0开始编址,就是0~61,然后64~127这样每次都是占用64位进行区块划分,而这些区块也被称为最小块
解决方案:
按整数倍(整数边界)存储,这个又叫数据对齐
说白了就是不管这个数据是多大,这个数据的起始位置都按照当前主存宽度倍数进行存储,确点就是空间会浪费,但是优点是性能会更高。随着科技进步,所有存储器价格会下降,所以这个解决方案,性价比很高
指令系统的设计和原则
指令系统是软硬件的交互界面(界限)
从性价比的角度来思考
确定指令需要实现哪些功能,确定指令的格式
在功能上面分为:操作类型,操作内容,寻址方式
在格式方面分为:操作码,地址码
原则:
完整性、规则性、兼容性、正交性、可组合型、可扩充性
完整性:所设计的指令保证最基本的功能可以满足
规则性:划分好指令类别和规则类别,避免过多特例
兼容性:必须做到向上兼容和向后兼容
正交性:各个指令之间做到相互独立,最低耦合,不相互依赖
可组合型:指令之间可以相互组合
可扩充性:指令设计可以方便未来维护,功能拓展和优化
答题思路:
1. 成本:优化性价比,降低成本
2. 性能:在功能上对软件的运行速度考虑
3. 灵活性:在未来维护上,需要拥有足够的灵活性,方便后期维护
指令操作码优化。--哈夫曼算法、拓展操作码编码
定长码
哈夫曼编码
拓展码
关于其他拓展操作码
关于选择不同的编码的方式,使用频度作为参考条件,如果前面十五条频度较高,而后面的相对较低,且指令数量不算太多那种则选用15/15/15编码法,如果前面八条以内的指令频度较高,其他指令频度相对较低,且指令数据较多,则选用8/64/512编码法
- 15/15/15编码法
对于这种编码,通常都会在16这个数,也就是1111这里做下一个段的拓展符号,而1110则作为正常编码
第一段 第二段 第三段
0000 1111 0000 1111 1111 0000
0001 1111 0001 1111 1111 0001
...... ...... ......
1110 1111 1110 1111 1111 1110
如果第三段后面不再有拓展,则写为:1111 1111 1111
在一直可以拓展的情况下:
第一段可以容纳15条指令,第二段则可以容纳30条,第三段可以容纳45条指令。
如果在第二段后面不再进行拓展,则是30+1=31条指令
- 8/64/512编码法
对于这个编码,也是四位,只不过,会把第一位固定为某个值,比如8的时候,固定开头都是0,后面的固定开头都是1
第一段 第二段 第三段
0 000 1 000 1 000
0 001 1 001 1 001
...... ...... ......
0 111 1 111 1 111
实际指令组合后其实是:
第三段+第二段+第一段这种形式,上面展示只是为了更方便观察第一位标记符变化
第一段是2^3=8条指令
第二段是2^6=64条指令
第三段是2^9=512条指令
因为第一个数值为固定值,所以,前一段的任意一条均可以作为后一段的拓展符号,比如1001 0010,这个就是第二段的1001加上第一段的0010作为一个指令存储。三段齐全同理,1101 1011 0000,这种就是第三段1101+第二段1011+第一段0000
拓展操作码编码(多地址码)题目

指令系统的发展与改进。-- CISC和RISC
- CISC:复杂指令系统计算机
为了应对变更的需求,增加更多的指令
为了解决这个问题,会添加新的指令和修改原有指令
面向系统,面向目标程序,面向高级语言
这三个都遵循两个规则,统计和复合
比如按照统计角度来说:
对于操作系统来说,就是收集操作系统的指令,然后统计其频度,最后进行分析和改进
而对于目标程序,则是收集目标程序机器语言程序和执行情况,统计各个指令的执行频度,最后加以分析和改进
面向高级语言则是,收集统计源代码中各种高级语言语句的使用频度和执行情况,然后加以分析和改进
从复合的角度来看:
面向操作系统,增加新的指令,改进旧的指令或者把多条指令复合在一起,然后用来完成更复杂的功能
面向目标程序,增加新的指令,改进旧的指令或者把多条指令复合在一起,然后用来完成更复杂的功能
面向高级语言,增加编译器中的新的指令,改进之前旧的指令或者把多条指令复合在一起,使其优化代码编译
- RISC:精简指令系统计算机
频度方面:保留频度高的,去除频度过低的
寻址:从三种寻址方式缩减位一种或者两种
时钟周期:所有指令操作尽量在一个时钟周期内完成
扩大寄存器数量
大多数指令用硬连实现,小部分用微程序实现
优化编译程序

浙公网安备 33010602011771号