本章总览
指令格式
我们设计一个比较粗糙的指令来举个例子:
它的意思是:把A1所指向的操作对象和A2所指向的那个操作对象通过OP这样的操作,操作的结果放到A3,而下一条指令由A4来指出。
用语言来描述非常的冗长,所以我们定义了一些符号来帮助解释:
上图直接写出A1、A2、A3表示地址,加上括号则是取该地址当中的内容。
那么这段指令在计算机中如何执行呢?
上图右侧主存内的蓝色部分释义为指令的操作码,黑子的是数据,很明显,A1与A2相加的数据放到了A4所指向的000011中。
上图分析可知,我们总共需要访存四次,能不能优化呢?
我们可以考虑让下一条指令的事情变得自动一点,就是改变现有的指令和数据的排列方式,我们让其指令统一放在一块区域、数据也统一放在一块区域。
这样的话只要程序没有特别要求,我们则只要自动的到下一个地址去取新指令即可。
所以专门设计一个控制单元用来控制指令地址的修改。
这样的话我们就不需要四地址指令了,因为下一条指令的地址我们不需要再放在地址码里了,即变成了三地址指令,而三地址指令的操作和四地址指令差不多,还有二地址指令等等,分析方法都一样:
指令寻址方式
回顾:数据是如何存放在存储体当中的
主存:
字节存储单元:
字存储单元:
按字编址和按字节编址:
那么现在我们就可以存放数据了,1个字节8个位,4个字节就是32位,所以可以每个字存储单元可以存放32位的数据,以下面的数据为例:
能明显看到的是,字存储单元和数据都有自己的高低地址。对于存储单元很明显左边是低地址,而右边是高地址:
以4号字存储单元为例,从左往右依次是4567,所以左高又低。
而对于数据则相反,左边是高地址,右边是低地址,这就导致在存放数据时有两种方法。大端方式,数据的高地址放在存储单元的低地址,而数据的低地址放在存储单元的高地址:
反过来的就是小端模式:
我们还需要理解几个字长的概念:
边界对齐存储的概念
指令寻址
如何到存储器中去寻找指令和数据呢?
两种方式:
对于指令寻址又有如下两种方式:
举个简单的例子:
本节回顾:
数据寻址
数据就是要操作的数据,即操作数,操作数的类型如下:
因为地址码的存在是为了定位到操作码想要操作的那些对象的地址,又因为对象的类型很丰富所以导致寻找到这些对象的方式也很丰富:
那么每次取到一条指令这个怎么知道要按照哪种方法去取数据呢?
很简单,就是给这些方法编号,即寻址方式位:
而寻址方式位这个号码是要反应在地址当中的,所以我们在指令当中专门给其留一个位置,即寻址特征:
相应的地址码这段我们就叫形式地址,这是因为这个地址并不是直接对应到存储器当中的一个真实的地址的,而是有了这个地址之后要根据寻址特征的要求把它转化成存储器当中的实际地址:
而数据寻址这块的内容主要就是来解决如何根据某种寻址方式的要求把形式地址转化为实际地址。
立即寻址
举例如下,如果我们有一条指令,而它要操作3这个数据对象,那么最简单的一种形式就是直接把3放进指令当中:
那么这种方式就叫立即寻址。
直接寻址
如果我们把操作数给放到存储器中,而形式地址给的是操作数的地址的话,这种方式就叫做直接寻址:
而图中深蓝色的部分为寻址特征位,因为不同题目有不同方式,所以就用深色表示某一种方式,而右侧那一串01的含义则是表示主存当中的操作数所在的地址。
即操作数就是我们的数据对象3就在这个位置:
LDA指令就是把主存当中的这个操作数3给提到ACC这个累加寄存器中。
因为这里的形式地址直接存的就是主存里面的真实的操作数3的地址,所以叫直接寻址。
间接寻址
而如果形式地址处写的不是真实的主存里面的真实的操作数3的地址的话,就叫间接寻址。
寄存器寻址
可以存放东西的部件除了主存,还有CPU当中的寄存器,即寄存器寻址,它的寻址方式跟直接寻址是一样的。
寄存器间接寻址
和之前主存系列的间接寻址是差不多的。
隐含寻址
小结一下
数据寻址2-偏移寻址
基址寻址
偏移地址的特点在于有效地址的产生需要进行一个加法的运算:
变址寻址
相对寻址
例题示例:
第二问的答案如下:
形式地址很多地方也叫偏移量,是用补码来表示的。
小结:
堆栈寻址
堆栈寻址不是很重要,当科普了解一下叭。
CISC和RISC
RISC和CISC就是设计指令系统的两种思路(或者说方向)。
CISC:复杂指令集的设计方法:
RISC:精简指令集的设计方法: