计算机组成原理学习笔记(四)指令系统(学习王道)

终于暑假了!本来几天前我就准备写了,但是一看前面的内容都记不清了,所以花了几天时间复习里一下才来看接下来的视频,然后准备更新这个文章系列。

目录

指令格式

地址码

 操作码

指令寻址

 数据寻址

常见的寻址方式

立即寻址

直接寻址

 间接寻址

 寄存器寻址

寄存器间接寻址

隐含寻址

偏移寻址

基址寻址

变址寻址

相对寻址

堆栈寻址

CISC&RISC


总的而言,本章分为3个部分:指令格式、指令寻址方式、CISC&RISC;

指令的定义也十分明了:

指示计算机执行某种操作的命令,是计算机运行的最小单位

最直接的表述就是指令是一串0、1组成的代码,计算机可以直接识别。

指令集:一台计算机所有指令的集合(也称该计算机的指令系统)

很显然的一点,世界上的指令可太多了,但是如果让一台计算机懂所有的话,光计算机的硬盘都未必存的下来,所以一台计算机只能 读懂自己的指令集!

指令格式

首先放一张比较抽象的概念图:

从上图我们可以得到一些相当基本的信息:操作的实现必须有对谁操作?做什么?这两个基本方面。

那条指令含义我用语言描述一下:对地址A1和A2的对象取出内容,然后进行OP操作(OP不是那个OP,大家乐呵乐呵就行了),结果存入A3,之后到地址为A4的对象中取下一条指令。

地址码

首先,我们讲一讲地址码

当然了,关于四地址指令实际上也是有一些值得注意的点的:

也就是说,很多都是假设,帮助我们理解含义的,与实际可能有出入!

现在细心的同学其实发现转到下一个指令的过程完全可以自动化一些:指令和数据分开放置!

话说都提示到这样的地步了,相信也有不少同学联想到了之前我们学过的一个电子元件了:PC !也就是程序计数器!

上面这个看着多么顺眼啊!但是还不是最顺眼的,因为实际的运用中,二地址最为常见,但是一地址也是有的:

关于那个一地址的理解,我有一个个人猜想哈:i++比i=i+1效率更高可能就是这原因。而且一地址有两种可能性:一种就是最常见的因为少取一个对象而只需要3次,另一种则是因为结果不需要存回,而是放在ACC里面就行了!

最后大家也看出来了,在减少地址的过程中,字长是没有变的,所以这个就是定长指令字结构

 既然有定长那肯定就有变长指令字结构,这个零地址指令字就是了。

 操作码

操作码就是在之前那个图的基础上再讲讲的,所以操作码也分为定长操作码(n位->{\color{Red} 2^{n}}扩展操作码。两种,我们接下来要说说第二种:

核心是套娃!

其实就和子网划分有点类似,不过都确实是很聪明的策略!

比如那个4位操作码的时候,就留下了一个全1的作为扩展位,这个到下面的8位操作码的时候就能看出来了:全1的前缀表示后面的4位(8位是4+4位)是操作码 的后四位不是什么数据的地址了。

有人或许会问,那要是留2位呢?答案是可以但是没有必要!

举个例子方便大家理解:

不得不说,操作具体还是有很多类型的,这里给说个大概吧: 

指令寻址

首先了解一些基本的概念:

上图中一行就是一个字,一个小方格就是一个字节

数据的存放有按字节编址和按字编址:,如果是按照字编址的,那么它最小的可以取出的单位是字,无法实现字节,如果实在需要的话,可以通过一些软件来实现。寻址也是,按字节是一次取出一个字节,按字是一次取出一个字!

机器字长的大小也是寄存器的位数,这个结合定义就很好理解了。

上面三者不是要求强制相等的,看制造商怎么弄,但是相等有一定好处。

 上图的边界对其是很有必要的,不然本来都在一行的内容完全可以一次访存就可以全部取出,这下不对齐的要两次,就十分浪费时间。 

而且对齐有一个特征:起始地址是字节长度的整数倍!比如说这里的起始地址是0、4的时候,正好是字节长度(4)的整数倍。

寻址方式分为指令寻址和数据寻址,数据寻址先放一下,那么指令寻址本身的含义就是找下一条欲执行指令的执行地址,这是始终由程序计数器PC来给出的。

之前的小标题下也提到过PC,在那个里面所提及的是很简单的顺序寻址,对于一些更加复杂的指令要求,这个是不合适的,所以有了跳跃寻址:

思路是设计转移指令指出下一条指令的地址,但是核心还是由转移指令修改PC。这样CPU去PC中寻址的时候会自动定义到下一条位置。

下面举一个例子来给大家看一下:

如果执行指令地址位0、1、2的指令,大家可以看出来,就是基本的取数、加数、减数操作,不复杂,所以PC只需要+1来顺序进行,但是遇到指令地址为3的时候,操作就变复杂了,所以采取的措施是无条件转移,覆盖+1的PC操作,直接强制修改为7。之后计算机就定位到了指令地址为7的指令。

 数据寻址

因为寻址特征的不同,所以有不同的寻址: 

常见的寻址方式

立即寻址

 此类型的指令的地址字段指出的不是操作数的地址,而是操作数本身,故又称立即数。而且这个数据是采用补码形式存放。上图的#就是表示立即寻址特征,不过实际的计算机中不是这个符号,是01字符,这里只是一种表示,方便大家理解。A就是操作数本身。

优点:指令执行阶段不访问主存,指令执行时间最短

缺点:A的数位限制了立即数的范围

直接寻址

 

 指令字中的形式地址A实际上是操作数的真实地址EA。而且因为取指令访存一次和执行指令访存一次,所以要访问两次主存。

优点:简单,指令在执行阶段仅访问主存一次,不需要专门计算操作数的地址

缺点:A的位数有限制,而且操作数的地址不易修改

 间接寻址

优点:扩大了寻址范围

缺点:增加了访存次数因而减少了速度 (速度是命门,所以这个不常用)

 寄存器寻址

看下图会发现这个和直接寻址是一样的,就是把主存换成了寄存器,这样区别的原因也很简单,寄存器贵啊!

 看访存次数的话,取指令是要访问一次,但是之后的执行指令就不需要了,因为此时访问的是寄存器,所以总共是1次(所有的这些我们都假设不考虑存回去的情况)

而且因为寄存器容量小,所以A的位数就不需要大就可以囊括所以寄存器的位置了。

优点:指令字短且执行速度快,支持向量/矩阵运算

缺点:寄存器贵且每个计算机能装的寄存器数量有限

寄存器间接寻址

隐含寻址

这个之前我们讲过,但是没有提隐含寻址的概念。了解就行,没必要死记硬背。

偏移寻址

基址寻址、变址寻址、相对寻址运行原理是一样的,只不过用的寄存器不一样。

基址寻址

 像通用寄存器则需要用一个R0来决定哪个作为基址寄存器。并且BR是面向系统的,也就是定死的,而R0则是用户自定义的(用户的自定义是有限的,只能决定谁来完成任务,没有决定内容的权限,那仍然是系统决定的)。

优点:扩大了寻址范围,用户不必考虑自己设计的程序放在主存的哪个位置,有利于多道程序的设计,可用于编制浮动程序;

来个有图图(没有牛爷爷)实例:

 所以嘛,这样就省事多了,D只需要相对位置,和前缀BR(起始位置)加起来就行。否则D的位置每改一次都要有很麻烦的访问并记忆的过程。

变址寻址

 实际上通用寄存器也是可以来弄变址寄存器的,不过和基址寄存器一样,还是要加R0来指定

 下面来看一下例子:

下面来解释一下那段汇编语言的意义(我不会汇编,真的哭死,看王道视频的时候还是蛮累的) 

最基础的是这里X就是循环里面的i,D就是循环里面的a[i],ACC就是sum;

·第一句LD就是数据传送(LOAD加载)的意思,A表示ACC,#就是之前讲解过的立即寻址的符号,0是操作数本身,所以第一句的意思就是把0传送到ACC里面;

·第二句和第一句是一样的意思就是把ACC换成了变址寄存器;

·第三句的意思是D与X的位置相加后的数据后与ACC自相加并存于ACC中。因为D只是一个一个基础的前缀,X才是后面的相加(基址寻址的话D则是后缀);

·第四句的意思则是X自加1;

·第五句的意思是判断,因为一开始X是从0开始的所以不等的时候就是小于的情况!此处的Z就相当于一个flag,专门用于判断的。

·第六句的意思是对判断结果进行处理,如果小于10,那么把已经累加起来的M的步骤再返回去,如果已经到10了,那么就要跳到下一个步骤了,程序计数器PC+1

一般基址寻址和变址寻址会混合使用,这样会方便一点。另外看到一些大佬的弹幕,虽然我不是很懂,但是可以做一个笔记:

操作系统给进程分配到内存,程序的首地址放在基址寄存器,这边的地址是虚拟地址,MMU转化为物理地址后,才真正取址,然后pc + 1,不断的取址执行。这里变址寄存器保存了指令相对基址的偏移量。

虽然直接考汇编是不可能的,顶多考对这种底层的理解,寻址的特点,所以读者不会汇编也没什么,重点还是对这个知识点的理解。

相对寻址

直接上图,内容相对还可以理解:

看道例题来测试一下:

堆栈寻址

看一下进一步的结果: 

堆栈的实现如果是靠寄存器来做就叫硬堆栈,如果是主存划分一个范围来做的话就叫软堆栈。 

CISC&RISC

先解释一下标题的两个英文是什么意思,前一个是复杂(Complex)指令集的设计方法,后一个是精简(Reduced)指令集的设计方法。

那么接下来解释一下渊源:一开始,专家设计思路的是一条指令可以完成复杂的基本工作,这又被称之为X86架构,这主要应用于台式机和笔记本。后来专家发现,典型程序当中的80%语句只需要用到处理机当中20%的指令即可。这就是著名的80-20规律,我们也习惯叫它二八定律,这个东西在其他地方也十分好用,比如说五折交叉验证、还有资本家(20%的人口占据80%的资源总量)。这个是CISC的原理。

所以基于上述,有见识的人就提出了这样的观点:一条指令完成一个基本的动作,多条指令组合完成复杂的动作。这个就是RISC的原理。前面说过属于CISC的架构,那么RISC有一个自己的架构也很正常,那就是ARM架构。这不用于那两种机型的话,想必大家也一定可以排除得到它适用的机型:手机和平板。

王道举的一个例子我觉得很生动:

存储程序不是在主存里面的是CPU里面设计的一个微程序,这个在第五章详细说。而RISC所谓的“并行”就是说当一个程序用ABC的时候另一个用DEF则和它彼此不干扰 。

虽然这个例子很形象,但是弹幕的解说我觉得更绝:

雕版印刷与活字印刷

下面是一个很全面的对比图,大家稍微理解就行,主要我觉得要背一下的:

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值