系列文章目录
第七章到第十章是讲解CPU的控制器相关内容
第七章 指令系统
前言
今天是八月一号,继续预习第七章CPU的内容吧,进度有点慢了,最近有些摸鱼。视频还有将近40P,希望这个星期能够学完。
机器指令——计算机的CPU可以直接识别并执行的操作命令
指令集——一个处理器可以识别的并执行的所有机器指令的总和,就是指令集
指令系统是软件和硬件的交界,软件通过指令系统告诉硬件做什么,硬件通过指令系统反应硬件当前状态
一、机器指令
1.1 指令的一般格式
操作码:不仅反应机器做什么操作,很多机器中还要指出对什么样的数据做操作
对浮点数还是定点数的加法,可能是不同的操作码
对于一些指令集,操作码还指出了操作数的寻址方式
长度固定的操作码的对应硬件实践更加简单
如今x86系列的处理器就是使用的长度可变的操作码
而且在很多机器中,操作码不像示意图中所示放在一端,是分布在整个指令中的
1.2 操作码——扩展操作码技术
下面展示,保留操作码的某一个码点,来进行操作码的扩展
因为如果只是规定操作码的位数,比如四位,那么指令集只能有16条指令,这是不够的
用保留码点的方式,让计算机识别出现在的操作码位数到底是多少
四个一作为扩展的标志
因此要注意设计的时候短操作码一定不能是长操作码的前缀,否则机器很难识别出来这操作码是长的还是短的,但下面的是可以的
在一组操作码中,可以保留不止一种来在下一级进行扩展,这里容易出计算题
如何让八位的操作码有31个?
四位操作码保留两个作为扩展,八位操作码保留一个作为扩展
1.3 地址码
在一次操作中,取下一次操作的地址,两次取操作数,一次存结果(
A
4
A_4
A4取下一条指令的访存算作下一次操作中)
若把下一条指令不是存在
A
4
A_4
A4而是PC中,就可以从四地址变三地址
四地址到三地址,地址位数变大,寻址空间变大了
这里注意,ACC寄存器的使用不占用访存的次数,因此在一地址的机器指令中,只需要进行两次访存,一次取指令地址,一次访问
A
1
A_1
A1
还要注意零地址的指令:对ACC寄存器进行操作(清零、取反、对某一位进行操作等等,ACC可以实现隐含寻址的方式,在指令的操作码中就可以直接做出规定);堆栈类的指令(堆栈类的计算机,如果进行一些基本操作,只需要操作码就可以了,例如,ADD表示把栈顶的两个操作数进行相加后保存在栈顶)
零地址的指令可能不需要地址,比如停机指令
1.4 指令字长
指令集中的指令字长可以是固定的也可以是变化的
如果指令字长是固定的,也就是指令集中所有的指令是一样长的,那么它的长度可以是存储字长,一般是存储字长的整数倍,以便于取指
1.5 小结
在上面的推算可以得到,在用寄存器等硬件资源来减少地址码个数的时候,可以扩大指令的寻址范围,可以缩短指令的字长(若不是固定指令长度,地址码个数变少,缩短指令字长),可以减少访存的次数。
如果地址字段用寄存器的编号来填写的话,不仅不需要访存,而且因为寄存器较少,不需要过多的位数编码,所以可以缩短指令字长
二、操作数类型和操作类型
2.1 操作数类型
地址:如果是绝对地址 ,那么他是无符号整数;相对地址 ,那么是有符号数
不同的操作数可能有不同的长度
2.2 数据在存储器中的存放方式
在第四章介绍过的大端和小端存放方式
字地址就是这个字的最低地址字节的地址
字地址为高字节地址,大端存储
字地址为低字节地址,小端存储
一种存储方式是从任意位置开始存储,但是访存取字的时候是一个字一个字取的,除了访问一个字节以外,其他都可能存在跨字的现象,需要两次访存以读取整个存储。增加了访存的时间
注意区分存储字长和机器字长,存储字长是存取的时候的一个单位,但是机器字长是寄存器长度。出题时候出过一个指令周期是多少个机器周期,我们认为基本上一个机器周期等同于一个存取周期,这就要看指令长度是几个存储字长。
2.3 操作类型
RAM的算数逻辑操作的特点,正反减法都是有相对应的指令,减少了减数和被减数的调整
这里举例中的“D”是完成触发器
D=0,执行跳转
D=1,执行下面的程序,完成输入或者输出操作
返回的时候,返回的是执行的下一条指令的地址
陷阱指令,操作码非法,操作数访问越界,除法操作中除数为0,这时候CPU直接执行陷阱
并不是指令集中的指令,由硬件直接来做的被称为隐指令
并不是所有的指令集都有输入输出指令
这里是否有输入输出的指令,取决于是否将I/O端口作为内存编址的一部分
若将I/O端口作为内存编址的一部分,那么不需要输入输出指令,可以直接用访存指令
** I/O端口有独立地址空间或者单独编址,那么需要单独的输入输出指令 **
输入指令:将端口n的内容传输到AX寄存器
输出指令:将AX寄存器内容由端口n输出
三、寻址方式
一种情况是由指令寻址下一条指令,指令的寻址
一种是寻址自己的操作数地址
3.1 指令的寻址
指令寻址就是顺序寻址和跳跃寻址两种方式
顺序寻址:
如果是字节编址,每一条指令四个字节,那么PC就是加4;每条指令八个字节,那么PC就是加8
指令长度可变的话,PC加什么则视情况而定
第三条虽然是转移指令,但是执行到这里还没有执行,因此继续顺序寻址
就算JMP转移到4,那也是转移指令,而不是顺序寻址
3.2 数据的寻址
3.2.1 立即寻址
形式地址不是真实地址,有效地址才是
在立即寻址的寻址方式中,进行取指令的过程中就取到了这个立即数,在指令执行阶段不需要再次进行访存
执行阶段不访存,但是取指令阶段还是要访存
3.2.2 直接寻址
直接寻址:有效地址就是形式地址
很难直接修改指令的地址码字段,因此循环不用直接寻址方式
3.2.3 隐含寻址
隐含寻址只是减少了其中的一个地址码字段,下图中的"A"仍然是进行的直接寻址。只不过第二个操作数被隐藏了
下面举例展示的是隐含寻址的直接寻址情况
3.2.4 间接寻址
一次间址,会进行两次访存,让A指向EA,然后EA存放着真正操作数的地址
这里可以看到,EA的位数一般比A的位数要大,可以扩大寻址的范围
而且在编写程序的时候,修改EA即可修改指向的操作数,而不用修改指令(不用修改A地址码字段)
多次间址
第一位规定为间接寻址是否结束的标志位
一个标志位让寻址空间减少一半
这里子程序末尾是进行的间接寻址 @这个符号就是表示间接寻址
在进行调用的时候需要进入子程序,而保存的断点就是81,又因为间址寻址,所以我们将81存储在A的地址中即(A)=81
这里的A开始保存的是81,后来改为202。
3.2.5 寄存器(直接)寻址
也可以说,这个叫寄存器直接寻址
缺点是地址范围有限
3.2.6 寄存器间接寻址
操作数存放在主存中,需要进行一次访存
这样的方式,只需要修改寄存器中的地址即可,很适合编写循环程序
3.2.7 基址寻址
可以扩大寻址范围:BR的位数一般来说较多,而且通过调整BR的位置就可以扩大寻址的范围
用户不能修改BR的内容,BR内容由操作系统或管理程序确定
BR内容不能改变,可以改变形式地址(意思是在不同指令中,A可以改变,而不是可以直接改A,其实与直接寻址一致!!)
主要用于多道程序的设计,来动态修改形式地址,以在内存中进行定位。每个调用的进程的BR寄存器不同,我们的程序在不同的调用情况下都可以运行,类似于动态链接库。
关于这一部分老师的讲解:(超级感谢HIT的老师们,他们真的好认真负责好温柔,我哭死)
这里注意,尽管用户可以选择使用哪一个通用寄存器作为基址寄存器,它的内容还是由操作系统决定
3.2.8 变址寻址
与基址寻址的情况不同,在程序执行过程中,A固定,IX变址寄存器可以进行修改
在处理数组问题时,将A作为数组起始地址,IX作为数组的下标,可以方便地完成循环操作
3.2.9 相对寻址
相对寻址,有利于程序浮动——程序浮动是指,程序在内存中的存储位置发生变化
通常用于短距离的跳转,A的位数有限,不能跳转很远
虽然我们写的汇编指令是*+8,但是编译器会自动将位移量进行修正,左图是编写的时候,右边是编译
但是在实际运行过程中,二字节指令,在运行指令2000H的时候,PC已经更新为2002H,
** 所以在实际存储过程中这个字节是06H而不是汇编里面的08H!!!!**
3.2.10 堆栈寻址
一般采用硬堆栈方式,用两个或者三个或更多的寄存器作为栈顶,其他栈底仍然在内存当中
一般来说,栈顶的地址低,栈底地址高,向下是地址增加的方向
减几看的是压栈和弹栈时候的元素占的是几个编址单位
按照字节还是按照字编址是不一样的,需要注意!!!-1往往是按字编址的情况
3.3 基本寻址方式及其优缺点总结
堆栈只能按顺序存取
四、指令格式举例
4.1 直接寻址与变址寻址例子
数组累加,变址寻址用的指令更少,节省空间
4.2 相对寻址例子
相对寻址的方式
若程序在内存中的存储位置发生了变化,相对位移就不需要像变址寻址改变物理地址
4.3 堆栈寻址例子
4.4 指令格式举例
兼容性一般值得是向上兼容,新一代CPU一定要实现老一代CPU的指令
4.4.1 IBM 360(老师PPT没有,不考)
IBM 360 指令地操作码位数都是8位
X:变址寄存器
B:基址寄存器
D:偏移地址
L:指出内存到内存的数据传送长度
4.4.2 Intel 8086
从指令字长来说,8086是典型的复杂指令集计算机
端间调用需要另外两个字节存储段号,段内则不需要段号,只需要三个字节
4.4.3 MIPS指令格式
4.4.4 32位ARM指令集和16位Thumb指令集
ARM指令集效率高但是相同功能编译后的编码空间大,代码密度低
对于无缝切换:只需要判断转移的目标是32倍数还是16的倍数,对应不同的指令集
4.4.5 三种举例格式的对比
4.5 指令系统习题
假设:
I为0的时候直接寻址
I为1的时候间接寻址
首先注意题目中的“主存可直接或间接寻址”,这表明指令格式中应该有标志位来支持选择直接还是间接寻址
这里把间接还是直接的标志位放在形式地址的前面,是因为它在判断主存寻址时是直接还是间接寻址,所以放在主存地址前
这里的指令寻址, 认为是以字为单位寻址 (这里我有些疑惑,留个坑,等开学学到这里时候问问老师,我感觉还是可以以字节位单位寻址的)
这里增加了寻址特征位B,当B等于1的时候,那么就是以目标寄存器
B
R
i
BR_i
BRi作为基址寄存器进行基址寻址
如果是普通的变址寻址则不需要
B
R
i
BR_i
BRi,但是注意题目是给的通用寄存器作基址寄存器,要加一个寄存器编号
这里在计算寻址的最大空间时,要注意
B
R
i
BR_i
BRi与A相加后,仍为32位
五、RISC与CISC技术
5.1 RISC技术
早期计算机采用的一般是CISC
指令集比较小,指令少,让CPU的控制器设计十分简单,指令格式种类少,译码简单
因为只有LOAD和STORE可以进行指令访存,其他的指令大多只用寄存器,因此为支持其他指令的执行,CPU中有多个通用寄存器
RISC技术的指令组合并不复杂,处理器使用流水线技术·
组合逻辑实现控制器,速度更快
主要特征还有可以通过优化编译的方式生成高效的目的代码
5.2 CISC技术
指令长度不固定、指令格式种类多。寻址方式多,这让译码电路更为复杂
访存指令不受限制,普通指令也可以访存
专用寄存器:8086的变址寄存器、基址寄存器
一般复杂指令是采用多个微指令按顺序完成,用微程序的方式完成,而微程序保存在控制存储器中。
需要微程序控制器,多次访问控制存储器,速度慢
多个时钟周期是在等待访存完成
主要特征还有难以用优化编译生成高效的目的代码
5.3 RISC与CISC的比较
因为CISC技术需要微程序控制器,占用CPU芯片面积大;相对于次,RISC的占用CPU芯片面积小
RISC不容易实现指令系统的兼容,指令格式紧凑,后续增加指令难
比较添加一点,有利于便于程序代码的优化
RISC换一个体系结构的机器一般需要重新编译
5.4 课堂小题
RISC 39种操作,这个意思是操作码字段是6位,五位不够用
因为支持四种寻址方式,所以寻址方式对应两位,
单地址格式说明只有一个地址,所以形式地址A的位数是8
可以得到指令格式
直接寻址是
2
8
2^{8}
28或者
0
2
8
−
1
0~2^{8}-1
0 28−1
一次间接是
2
16
2^{16}
216或者
0
2
16
−
1
0~2^{16}-1
0 216−1
多次间接是
2
15
2^{15}
215或者
0
2
15
−
1
0~2^{15}-1
0 215−1
立即数是
−
2
7
-2^{7}
−27到
2
7
−
1
2^{7}-1
27−1