计算机组成原理自学笔记(六)
作者:互联网
坦率的讲B站上刘宏伟老师15年的哈工大计算机组成原理网络课程刷完有段时间了,尴尬的是到现在几乎也忘完了。期间看到一半的时候觉得有必要边学边写一下学习笔记,但是学习笔记落后观看进度太多,加上中间断断续续,因此这个学习笔记基本上是要烂尾的节奏了。后续也草草的刷了一遍操作系统的课程,这个就更尴尬了……鉴于此我不得不调整一下这些学习笔记的性质了,就当作复习的二刷笔记吧。虽然温故而知新,但是不能搁这儿死循环,权当是给当初的定的计划一个交代。
很显然,书接上文是有点不可能了。之所以想系统的刷这门课程,主要还是日常工作学习中慢慢了解到的一些关于指令的重排序、I/O的处理等等想系统的填补一下基础,在刷这门课程时个人主要的关注点也是在CPU的结构和工作原理以及I/O上。然而刷了之后发现这门课程涉及的东西还是有点多,其中关于无/有符号数、定/浮点运算等等几个章节都是以二倍速加上战术跳过结束的,此时再想按课程安排继续有点过于困难,因此打算以“糊弄学”的精神来完成后续的笔记……
既然都忘得差不多了,那就先回顾一下这门课程整个的一个结构:
贴一下视频中的课件
章节:
第一部分计算机组成原理之硬件,介绍了计算机的基本组成结构、计算机的程序和指令在模型机当中的执行过程、计算机的系统总线(系统总线把计算机的硬件的各个部分连接在一起,能够协调的进行工作)、计算机的存储器、计算机的I/O部分;一直采用自顶向下的方式介绍计算机硬件的组成。
第二部分计算机组成原理之数字,介绍了数据的表示方式、运算方法以及实现运算的逻辑电路;
第三部分介绍计算机硬件和软件之间的接口即计算机的指令系统;
指令系统
机器指令:
计算机系统的CPU能够直接识别并且执行的操作命令;
指令集:
一个处理器能够执行的所有的机器指令构成的集合;
指令集就是计算机系统软件和硬件的交界面,软件通过指令系统告诉计算机的硬件做什么操作,计算机的硬件通过指令系统把运算结果和硬件的状态返回给软件。
指令的格式:
操作码 地址码 寻址方式
指令的一般格式
操作码:指令做什么样的操作,反映了机器做什么操作;操作码不仅指出要做什么操作,有很多机器的指令集当中还要指出对什么样的数据进行操作;个别机器指令集当中操作码部分还指出了操作数的寻址方式;
1.长度固定 用于指令长较长的情况,RISC
长度可以是固定的(比如长度固定为8位或6位),在精简指令集计算机当中,指令长度比较长,操作码是固定的;固定操作码是为了译码过程的方便,译码电路的方便;
2.长度可变 操作码分散在指令字的不同字段中
为了支持操作码的长度可变,我们要采用扩展操作码技术。扩展操作码技术扩展的方法有两种,要么保留一个编码的码点作为扩展的标志,要么利用操作码中的某一位作为扩展的标志。
3.扩展操作码技术
操作码的位数虽地址数的减少而增加:把操作码的位数增加如果指令的长度是不变的,那么实际上要减少地址码的位数
eg:
假设操作码和每个地址码都为4位
若果不扩展则只能包含16条指令,因而指令的个数必须进行扩展
4位操作码 从全0到全1,一共可以编出16个点,有15个点由0000到1110作为操作码长度为4位的指令操作码的编码,剩下的1111作为扩展标志:
如果前四位编码是1111,表明这条指令操作码部分的长度至少为8位,则1111为标志,减少一个地址码字段,把这个地址码字段作为操作码字段,同样编码依旧是从0000到1110一共15个点,保留1111 1111作为扩展的标志继续进行扩展:
继续减少地址码扩展操作码,如果指令前8位都为1,则在此种编码方式当中,指令的造作码至少为12位:
将所有地址码部分都编为操作码部分,则为16位的操作码:
此方式为保留码点的方式,让计算机能够识别出现在读取的这条指令它的操作码到底是多少位;为了使计算机识别操作的位数,在操作码的扩展过程中必须遵守短操作码一定不能是长操作码的前缀。
地址码:对谁进行操作
1.四地址
A1:第一操作数地址
A2:第二操作数地址
A3:结果的地址
A4:下一条指令地址
(A1)OP(A2)–> A3
访存次数:
取指令、取操作数A1、取操作数A2、假如A1、A2给出来的都是内存地址(A1、A2所表示的操作数都是在内存当中),结果也要保存在内存当中,这条指令至少需要4次访存;
假设指令字长为32位,操作码固定为8位,则寻址范围:
26 = 64
2.三地址
PC继承存器代替A4
(A1)OP(A2) --> A3
访存次数:依旧为4次
寻址范围:28 = 256
3.二地址
A3用A1或A2代替
(A1)OP(A2)–> A1
OR
(A1)OP(A2)–> A2
访存次数:依旧为4次
寻址范围:212 = 4K
操作结果存放在ACC寄存器,访存次数也就变为3次;
4.一地址
如果某个操作数以隐含或者是指定的方式保存在ACC当中,另外一个数在内存当中,ACC的内容和操作数进行操作,结果保存在ACC里面,即可再次减少地址码个数,该单地址码只要指明参加运算的除了ACC之外的另外一个操作数的地址即可。
(ACC)OP(A1)–> ACC
访存次数:2次
寻址范围:224 = 16M
5.零地址
对ACC里的数据进行操作,ACC进行隐含寻址;
堆栈类型
指令的字长
固定字长:指令字长 = 存储字长可变字长: 按字节的倍数变化
当用一些硬件资源代替指令字中的地址码字段后:
-可以扩大指令的寻址范围(固定字长指令)
-可缩短指令字长(减少地址码个数)
-可减少访存次数
#####操作数类型
操作数即为指令要进行处理的数据
- 地址
- 在跳转指令当中,操作数部分为地址或者相对地址,若果是绝对地址,这个地址则为无符号数,如果是相对寻址则为有符号数
- 数字
- 定点数、浮点数、十进制数
- 字符
- ASCII
- 逻辑数
- 逻辑数
操作数在存储器中的存放方式 **
大端: 字地址 为 高字节地址小端: 字地址 为 低字节地址
字节编址,数字在存储器中的存放方式
存储字长64位,机器字长32位
(CPU在访存的过程当中,一次访存最多可以拿到长度为64位的数据,64位的数据就是一个双字)
a.从任意位置开始存储
优点:内存利用率高
缺点:除了访问一个字节之外,访问其他任何一个长度(类型)的数据可能都需要花费两个存储周期的时间才能读/写,读写控制复杂(需判断该数据的长度是不是跨存储字进行存储)
2.从一个存储字的起始位置开始访问
优点:无论访问何种类型的数据,在一个存储周期内均可完成读写操作,且控制简单
缺点:浪费存储资源
3.边界对准方式(从地址的整数倍位置开始访问)
以双字为例,此例子中,双字字长8字节,即占用了8个编址单位; 8个字节进行存储时,起始地址就从地址编码是8的倍数的存储单元开始;如果是个半字,即2个字节,存储的时候放在地址是偶数的起始地址开始存储;如果是一个字,即4个字节,存储时寻找地址的地址编码是4的倍数的存储单元开始存储;
此方式是前两种方式的折中,既保证了在一个周期里可以完成存储访问,也减少了空间浪费
操作类型
1.数据传送
* 置 “1” 清 “0”
2.算术逻辑操作
加、减、乘、除、增1、减1、补位、浮点运算、十进制运算
与、或、非、异或
位操作、位测试、位清除、位求反
eg:8086
ADD,SUB,MUL,DIV,INC,DEC,CMP,NEG
AAA,AAS,AAM,AAD
AND,OR,NOT,XOR,TEST
3.移位操作
算术移位、逻辑移位
循环移位(带进位、不带进位)
4.转移
1) 无条件转移 JMP
2) 条件转移(分支指令)
结果为零转 (Z = 1) JZ
结果溢出转 (O = 0) JO
结果有进位转 (C = 1) JC
跳过一条指令 SKP
3)调用和返回
4)陷阱(Trap)与陷阱指令
意外事故的中断,一般不提供给用户直接使用;出现事故时,由CPU自动产生并执行(隐指令)。
设置供用户使用的陷阱指令(提供给用户使用的陷阱指令,完成系统调用)
eg:8086
INT TYPE 软中断
5.输入输出
并非每一种指令集当中都有输入输出型指令,如果I/O端口的编址空间被作为内存编址空间的一部分,该指令集就无需输入输出指令,直接用访问存储器(内存)的指令就可以对外部设备进行输入输出,如果外部设备或者端口有自己的独立地址空间或者单独编址,就需要单独的输入输出指令对外部设备进行访问。
入: 外部设备/端口中的内容 —> CPU寄存器
eg: IN AX, n
出: CPU的寄存器 ----> 外部设备/端口中的内容
eg: OUT n,AL
标签:操作数,计算机,地址码,笔记,A1,地址,操作码,指令,自学 来源: https://blog.csdn.net/weixin_42755361/article/details/111749084