提示:待到秋来九月八,我花开后百花杀
文章目录
- 前言
- 4.1.1 指令格式
- 4.1.2 扩展操作码指令格式
- 4.2.1 指令寻址
- 4.2.2 数据寻址
- 4.2.3 偏移寻址
- 4.2.4 堆栈寻址
- 汇总
前言
通过第二章我们学习了运算器是如何进行加减乘除,移位运算操作的,通过第三章学习了数据是如何存放于各种各样的存储器当中的,CPU又是如何从存储器中取走数据的,之前我们说过控制器是控制各种各样的部件,协调部件进行工作的,这一章主要是说控制器需要的指令如何设计
提示:以下是本篇文章正文内容,下面案例可供参考
4.1.1 指令格式
指令
是指示计算机执行某种操作的命令,是计算机运行的最小功能单位,一台计算机的所有指令的集合构成该计算机的指令系统,也称为指令集,一个计算机只能执行自己的指令系统中的指令,不能执行其他系统的指令
一条指令通常要包括操作码字段和地址码字段两个部分,并且一个指令中可能包含多个地址码,根据地址码的数目不同,可以将指令分为零地址指令,一地址指令,二地址指令
零地址指令
1,不需要操作数,如空操作,停机,关中断等指令
2,堆栈计算机,两个操作数隐含存放在栈顶和次栈顶,计算结果压会栈顶,(后缀表达式)
一地址指令
1,只需要单操作数,如加一,减一,取反,求补等
指令含义:OP(A1)->A1 完成一条指令需要三次访存,取指->读A1->写A1
2,需要两个操作数,但是其中一个操作数隐含在某个寄存器,如隐含在ACC中
指令含义:(ACC)OP(A1)->ACC 完成一个指令需要两次访存,取值->读A1 ,这里因为不需要再放回数据,而是放回到ACC 所以少了一次访存
二,三地址指令
四地址指令
指令字长
一条指令的总长度(可能会变)
我们所说的半字长指令,单字长指令,双字长指令是说是机器字长的多少倍,指令字长会影响取指令所需要时间,如机器字长=存储字长=16bit,则取一条双字长指令需要两次访问内存
定长指令字结构:指令系统中所有指令的长度都相同
变长指令字结构:指令系统中各种指令的长度不等
按操作码长度进行分类
按操作类型分类
转移操作本质上来说就是实现的程序执行流的变化,如if else 这个时候就不是顺序的 有可能会发生跳转,其实也就死改变PC的值
本节回顾
4.1.2 扩展操作码指令格式
我们讲的扩展操作码指令格式是定长指令字结构,可变长操作码
CPU读入是直接读入16位的但是根据前n位1的个数来确定式几位地址指令,如下图前四位全1 则是二地址指令,前六位是1 则是一地址指令,前11位全1 则一定是零地址指令
二地址12条中大于1011的数还剩下1100,1101,1110 ,1111,你会发现这四个数都是11 开头的,所以加下来如果前六个都是全一的也就超过来二地址指令的范围,后面四bit又是一个地址,所以就留下了中间的六位用来表示操作指令,同样的若是比111101 大的也就是111110 此时前11位就是全1的,后面留有五位就是可以表示32种操作,
指令操作码
4.2.1 指令寻址
顺序寻址
这一节主要探讨指令是如何确定下一条指令的存放地址(始终由程序计数器PC给出),指令寻址可分为顺序寻址和跳跃寻址,因为有的是采用变长指令字结构的话,此时PC简单的加1 肯定是不行了,若是主存按照字节编址主存按字节编址,也就以为着每一个指令占据两个地址,则此时的PC应该是加2,若是采用变长指令字结构,读入一个字,根据前面的操作码,来确定是几地址指令,由此来判断此条指令的总字节数n 修改PC的值,此时也就是(PC)+n->PC,所以这个n 是根据指令字长和系统是按照字编址还是按照字节编址来确定的
跳跃寻址
由转移指令指出,如这里的JMP,类似C语言中的goto语句
本节回顾
4.2.2 数据寻址
观察上图你会发现上面是从0地址开始的,但是若是不从0开始 此时若是依然JMP 跳转到7这样不是很明显是错的吗,所以也就有了数据寻址:确定本条指令的地址码指明的真实地址,接下来我们会学习十种数据寻址的方式,然后知道用那种方式来解释这种地址码的含义,通常我们可以在地址码的前面加上这样的几个bit位,这里有十种,也就需要四个bit位便足够了,如这里我们中间加上几个寻址特征来确定寻址方式,若是有多个地址 自然每一个地址的方式也可能不同,这也就有可能有多种寻址特征、
实际应用中,往往是多种寻址方式复合使用
直接寻址
间接寻址
其实也就是相当于指针的形式,(A)依然是一个地址,若是真实的地址则是一次间址,若是(A)需要在看((A))则是二次间址
寄存器寻址
这个地址码指向的不是某一个内存单元而是指向了某一个寄存器,CPU会有许多的寄存器,每一个寄存器都有一个编号,直接去指向的这个寄存器找就可以了
寄存器间接寻址
比起之前我们提到的基于主存的间接寻址来说,这一次间接找地址的过程是不需要访存的,因此更快
隐含寻址
有的指令显式的给出一个地址,另外一个地址被隐藏的银隐含于ACC
中
立即寻址
直接寻址放的式操作数的地址,而立即寻址则存放的是操作数,寻址特征中我们写了一个# 号也就意味着后面跟的形式地址就是一个立即数,
4.2.3 偏移寻址
以某个地址作为起点 形式地址视为偏移量,这节我们主要学习三种,相对寻址(以程序计数器PC所指地址作为起点),基址寻址(以程序的起始存放地址作为起点),变址寻址(程序员自己决定从哪里作为起点)
基址寻址
优点是便于程序“浮动”方便实现多通道程序并发运行,所谓浮动就是指可以从内存中任何一个地址作为一个起始地址,每一个程序运行之前CPU的基址寄存器的值通常都是存放于程序控制块PCD中的,基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定,在程序执行过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量),普通程序员可以使用汇编语言来直接操纵某一个通用寄存器中的值,读或者写都行,但是当某一个寄存器被指定作为一个基址寄存器后,那么这个寄存器中的值也是不能修改的,其内容会由操作系统进行管理,同时由于基地址的位比较长,也可扩大寻址范围
变址寻址
这种变址寻址在循环中有很大作用,在数组的处理过程中,可设定A为数组的首地址,不断改变变址寄存器ix的内容,便可很容易的形成数组种任一数据的地址,特别适合编制循环程序
相对寻址
是相对于下一个指令地址的偏移量,这个偏移量可正可负,用补码表示,因为当cpu取出一条指令之后,pc一定是自动加n的,自动指向下一条指令,优点:操作数的地址不是固定的,它随着PC的值变化而变化,并且与指令地址之间总是相差一个固定值,因此便于程序浮动,(一段代码再程序内部浮动,直接寻址的浮动是整段程序的浮动,而这里是一段代码的浮动)但是这里也就有了一个问题,若是修改程序段,数组始址不再是存放于7这个位置,这里一种解决方法就是将数据段,程序段分开
本节回顾
注意这里的偏移量是相对于下一个指令的偏移量,这里两个数进行比较是通过相减,相减的结果结果信息会记录再程序状态字寄存器中PSW,根据PSW的某几个标志位进行条件判断,来决定是否转移
4.2.4 堆栈寻址
堆栈指针存放于一个寄存器中,也就意味着我们不需要一个显式的操作地址,它的操作地址是隐藏于SP这个寄存器中的
软堆栈:从主存中划分一部分区域作为,也就意味着弹出一个元素 或压入一个元素都是需访问主存,所以没有直接放在寄存器的快
出栈时之间EA(有效地址)便可,但是入栈的时候需要先加一或者减一才能入栈
汇总
取值的时候是需要访存的,但是这里指的是指令执行期间