组成原理(十):机器(上)

系列文章目录



前言

哈工大组成原理笔记,教材是《计算机组成原理》(唐朔飞)


(零)导论

机器指令:计算机系统的CPU能够直接识别,并且执行的操作命令,称为机器指令。一个处理器能够执行的所有机器指令构成的集合,称为指令集。指令集就是计算机系统软件和硬件的交界面,软件通过指令系统告诉计算机的硬件做什么操作,计算机的硬件通过指令系统把运算结果和硬件的状态返回给软件。

问题:一个CPU可能要支持哪些指令?
这些指令能够实现什么功能?
能够对哪些类型的数据进行操作?
可能会影响哪些硬件状态?
硬件对指令是如何识别的?
如何对相应的指令进行译码编码?
指令的格式是什么?

更多的要在体系结构这门课中找到答案。

(一)系统指令

1.机器指令

指令的格式:

  • 操作码:指令做的是什么操作
  • 地址码:对谁进行操作
  • 寻址方式:多种寻址方式

指令的字长:

  • 固定字长
  • 可变字长

1.1指令的一般格式

在这里插入图片描述

1.1.1.操作码字段

指出这条指令要做什么操作

实际上操作码的作用远远不止反映机器做什么操作,很多机器的指令集当中,操作码还要指出对什么样的数据进行操作,例如IBM360的指令系统当中,同样是加法操作,因为参与加法操作的数据的类型不一样,表示的基值不一样,一个加法指令实际上是八条指令,分别对应了对定点数加法、浮点数加法、在浮点数加法中尾数的基值是二进制还是十六进制等等。
另外在有些机器的指令集当中,操作码还指出了操作数的寻址方式。

  • 长度固定:用于指令字长较长的情况,如RISC。为了译码过程的方便,译码过程的简单。

在上图中,操作码字段是集中画在一起,这只是逻辑的表达方式,实际上操作码字段可以分开,在不同的存储位置表示。

  • 长度可变:典型的如现在使用的X86处理器,指令的操作码就是可变的。
1.1.2.扩展操作码技术

操作码的位数随着地址数的减少而增加。
在这里插入图片描述

将OP的1111码点作为拓展标志,拓展后表示这条指令的操作码字段长度至少是8位,减少了一个地址码字段,拓展了十五个二地址指令,同样的我们保留了11111111码点也作为拓展标志,表示这条指令的操作码字段长度至少12位,拓展了十五位一地址指令,可以继续保留111111111111码点作为拓展标志,再拓展十六个零地址指令。

注意,现在使用的是保留码点的方式,为了让计算机要能够识别出现在读取的指令的操作码是多少位,在操作码的扩展过程当中必须遵守一个原则:
短操作码一定不能是长操作码的前缀。
如果短操作码是长操作码的前缀的话,那么在指令译码的时候,计算机很难识别这两条指令。

在这里插入图片描述

问题:如果给定一个指令集,要求对指令当中的操作码进行编码,那么哪些指令的操作码用长操作码表示,哪些指令的操作码用短操作码表示?
一般来说,在指令执行的过程中,经常出现的高频指令,可以用短操作码表示,不经常出现的低频指令,可以用长操作码表示。
指令字长16位,每个地址码的长度是4位,如何进行编码,能使8位长的操作码的指令有31条?

1.1.3.地址码字段

在这里插入图片描述

寻址范围非常小,这么短的地址码,如果是寄存器还可以,如果是用于内存,这样的指令几乎是不可用的。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

将参加运算的某一个操作数以隐含的方式或者是指定的方式就放在ACC当中,另一个在内存当中,ACC的内容与内存的内容做操作,结果保存在ACC当中,则地址码的个数可以进一步减少。
在这里插入图片描述
例如对ACC进行清零,或者对ACC中的数据进行取反,或者是对ACC当中某一位数据进行某些操作,或者是判断ACC的数据为全0或全1等等,这些都可以用零地址指令,因为ACC采用隐含寻址的方式,在指令的操作码当中可以直接做出规。
另外,堆栈类的指令,例如在一个堆栈型的计算机当中做加法,只要有操作码就行,不需要地址码,就是将栈顶两个元素弹出相加然后又压回栈中作为栈顶元素。

1.2.指令字长

在这里插入图片描述

1.3.小结

2.操作数类型和操作类型

2.1.操作数类型

地址:如果是绝对寻址,就是无符号数,如果是相对寻址,就是有符号数。
数字:定点数、浮点数、十进制数
字符:ACSII
逻辑数:逻辑运算

2.2.数据在存储器中的存放方式

在访/存内存时,是从内存低址到内存高址进行顺序访/存,所以一个字的字地址就是这个字中首字节(低字节)的地址(类似数组的地址是首元素的地址),图中的字节编号大小是从左到右/从上到下依次变高。

大端模式(Big-endian):指将数据的低位(比如 12345678H 中的 5678 就是低位)放在内存的高地址上,而数据的高位(比如 12345678H 中的 1234 就是高位)放在内存的低地址上。所以计算机读取数据的方向,是从数据高位开始读取的。
小端模式(Little-endian)是指将数据的低位放在内存的低地址上,而数据的高位放在内存的高地址上。低地址存放数值较小的部分,计算机读取数据的方向,是从数据低位开始读取的。(这种存储模式将地址的高低和数据的大小结合起来,高地址存放数值较大的部分)

大端的优势在于第一个字节就是高位,很容易判断正负性。小端的优势在于第一个字节是低位,最后一个字节是高位,可以依次取出相应的字节进行运算,并且最终会把符号位刷新,这样运算起来更高效。

问题: 数据有多种类型的长度,一个字节、四个字节甚至八个字节,在内存当中如何进行存储?

字节编址,数据在存储器中的存放方式(存储字长64位(CPU在访存的过程当中一次访问内存最多可拿到64位数据),机器字长32位)

  • 从任意位置开始存储
    在这里插入图片描述

优点:对内存空间利用非常好,不浪费存储资源。
缺点:除了访问一个字节之外,访问其它类型的数据都可能花费两个存储周期的时间,读写控制比较复杂(要判断这个数据是不是跨存储字进行存储)。

  • 从一个存储字的起始位置开始访问
    每次访存数据,不管是什么类型的数据,都从一个存储字的起始位置开始读/写。
    在这里插入图片描述

优点:无论访问何种类型数据,在一个访存周期内均可完成,读写控制简单。 缺点:浪费了很多内存空间。

  • 边界对准方式:
    从地址的整数倍位置开始访问。
    在这里插入图片描述

一个字节进行存储,可以存放在内存的任何一个地址的内存单元中。 一个双字进行存储(在上例中为8个字节),从起始地址是8的倍数的存储单元开始。
一个半字进行存储,从起始地址是2的倍数(偶数)的存储单元开始。 一个字进行存储,从起始地址是4的倍数的存储单元开始。
优点:数据存放的起始地址是数据长度(按照编址单位进行计算)的整数倍,是前两种方案的折中,在一个周期可以完成存储访问,空间浪费也不算严重。

2.3.操作类型

  • 数据传送

在不同的存储介质之间进行数据传送。
在这里插入图片描述

  • 算术逻辑操作

加、减、乘、除、增1、减1、求补、浮点运算、十进制运算、与、或、非、异或、位操作、位测试、位清除、位求反
在这里插入图片描述

  • 移位操作

在这里插入图片描述

  • 转移

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 输入输出

并不是每一种指令集都有输入输出指令,如果IO端口的编址空间被作为内存编址空间的一部分,那么这个指令集就不需要输入输出指令,直接用访问内存的指令就可以对外部设备进行输入输出,如果外部设备/IO端口有自己的独立地址空间单独编址,就需要单独的输入输出指令对外设进行访问。

在这里插入图片描述

3.寻址方式

问题:为什么在指令当中要设置多种类型的寻址方式?
寻址方式:如何找到本条指令的操作数地址或者找到下一条要执行指令的指令地址
在这里插入图片描述

3.1.指令寻址

  • 顺序寻址
    取完一条指令后,顺序的取下一条指令。
    ( P C ) + 1 → P C (PC)+1\rightarrow PC (PC)+1PC

是不是在任何个指令集当中当中,都是PC+1?
不是,实际上这1是比较复杂的,内存单元的编址单位是字节,每一条指令的长度是32位(四个字节),顺序存储每次加的值就是4,如果指令的长度是64位,则PC+8。
如果指令是可变长度的话,这个1会更加复杂。

  • 跳跃寻址
    由转移指令给出下一条指令地址
    在这里插入图片描述

3.2.数据寻址

在这里插入图片描述

  • 形式地址A
  • 有效地址EA

形式地址并不是要找的数据在的存储单元/寄存器的真实地址,要找到真实地址,需要寻址方式和形式地址进行一定的转换,才能得到真正的有效地址(操作数的真实地址)。

3.2.1.立即数寻址

形式地址A就是操作数,这个数据直接参与操作码指定的运算。
在这里插入图片描述
如果采用立即数寻址的话,操作数在取指令的过程当中,实际上已经被取入到了CPU当中,所以在指令的执行过程中不需要再一次的访存。

3.2.2.直接寻址

E A = A EA = A EA=A,有效地址由形式地址直接给出。
在这里插入图片描述
操作数不易修改,编程不方便,例如对数组每个元素加1,如果采用直接寻址,则每个元素都需要修改操作数,就需要很多条指令一个一个修改,无法实现循环修改。

3.2.3.隐含寻址

将寻址方式隐藏在操作码当中,或者是参与运算的某一个数据所在的位置由操作码直接给出。
在这里插入图片描述

3.2.4.间接寻址

操作数的地址保存在某一个内存单元当中,指令当中的地址是这个内存单元的地址,有效地址在给定的的内存单元中进行保存。
E A = ( A ) EA = (A) EA=(A),有效地址由形式地址间接提供。
在这里插入图片描述

地址码字段一般比内存中的存储字长少很多,所表达的地址相对来说有限,这样做可以扩展寻址范围,也可以缩短地址码长度,OP就可以相对长一些。
便于编程,与直接寻址相比,如果要修改有效地址,不需要修改操作数,只需要直接修改指针里的值就行了。

间接寻址编程举例

80调用子程序,则81为程序断点,为了程序能够返回,断点必须被保存,81保存在(A)(A地址的存储单元当中)当中,在子程序执行完后,JMP@A通过间接寻址找到81,继续进行主程序。运行到201,又是调用子程序,则202是程序断点,依然将202保存在(A)中,子程序完成跳到202继续完成主程序

3.2.5.寄存器(直接)寻址

E A = R i EA = R_i EA=Ri,有效地址即为寄存器编号。
在这里插入图片描述
执行阶段不需要访存,只访问寄存器,执行速度非常快。
寄存器个数有限,可缩短指令字长。

3.2.6.寄存器间接寻址

E A = ( R i ) EA = (R_i) EA=Ri,有效地址保存在寄存器中。
在这里插入图片描述
有效地址在寄存器当中,操作数保存在存储器当中,执行阶段需要访问内存。
非常便于循环程序的编写。

3.2.7.基址寻址

  • 采用专用寄存器作为基址寄存器,有效地址是基址寄存器中的内容加上形式地址(形式地址实际上就是一个偏移量)。 E A = ( B R ) + A EA = (BR)+ A EA=BR+A,BR为基址寄存器。

在这里插入图片描述

程序的动态再定位:程序在实际主存空间中的位置可以动态移动的定位技术。一种作法是,在硬件上设置基址寄存器和地址加法器,即在程序装入主存时,只把程序装在主存中的起始地址(基址)装入基址寄存器,对指令各地址字段不作修改;在程序执行时,由逻辑地址根据需要,加上基址寄存器中的基址来形成访存有效地址。
另一种作法是,设置逻辑地址到主存物理有效地址的映象表硬件,即程序装入主存时,在映象表中建立起逻辑地址与主存物理地址的映象关系;程序执行时,由逻辑地址查映象表来获得访主存的物理有效地址。这样,只需修改基址寄存器中的基址或地址映象表的内容,就可使程序在主存中动态改变所存贮的位置。

  • 采用通用寄存器作基址寄存器

在这里插入图片描述
可以由用户指定通用寄存器作为基址寄存器
基址寄存器的内容由操作系统确定,用户不能修改。
在程序执行的过程中, R 0 R_0 R0内容不变,形式地址A可变。

3.2.8.变址寻址

指定一个变址寄存器IX,可以指定专用寄存器,也可以使用通用寄存器作为变址寄存器,IX内容加上形式地址得到有效地址。
E A = ( I X ) + A EA = (IX)+A EA=(IX)+A
在这里插入图片描述

可扩大寻址范围
IX的内容由用决定
在程序执行中,IX内容可变,形式地址A不可变
便于处理数组问题

在这里插入图片描述

3.2.9.相对寻址

相对当前的PC值进行寻址
E A = ( P C ) + A EA = (PC)+A EA=(PC)+A,A是相对当前指令的位移量(可正可负,补码表示)
在这里插入图片描述
在这里插入图片描述

3.2.10.堆栈寻址

在这里插入图片描述

在计算机的硬件实现的栈是高地址向低地址方向,即栈顶是低地址,栈底是高地址。

在这里插入图片描述
在这里插入图片描述

4.指令格式举例

4.1.设计指令时应考虑的各种因素

在这里插入图片描述

兼容性:“屎山”的继承

4.2.IBM360

在这里插入图片描述

二地址R-M格式:X是变址寄存器,B是基址寄存器,寻址方式是基址加变址寻址。
三地址R-M格式:应用于数据的成组传送,如在寄存器和内存当中进行成组的PUSH操作,从 R 1 R_1 R1开始,一直到 R 3 R_3 R3,中间寄存器的内容成组传输到内存。内存的起始地址采用基址寻址的方式。

4.3.Intel8086

在这里插入图片描述

5.RISC技术

5.1.RISC的产生和发展

在这里插入图片描述

由于在指令集设计时,加入了很多很复杂的指令,计算机系统的控制器设计起来很复杂,甚至只能用微程序的方式来进行设计,这导致了那20%的常用的简单指令在强功能指令的影响下,速度会被拖慢,就类似于向银行借一块钱。

5.2.RISC的主要特征

在这里插入图片描述

5.3.CISC的主要特征

在这里插入图片描述

5.4.RISC与CISC的比较

在这里插入图片描述

VLSI芯片:超大规模集成电路(Very Large Scale Integration Circuit)

思考:在现代处理器当中,什么样的计算机使用RISC,什么样的计算机使用RISC?
现在有一个新的趋势:RISC与CISC相结合,二者如何是结合的?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值