计算机组成原理-指令系统 (指令、操作码、地址码、指令寻址、数据寻址)

计算机组成原理 专栏收录该内容
12 篇文章 2 订阅


笔记📗

计算机组成原理-计算机硬件的基本组成
计算机组成原理-计算机的功能部件及层次结构
计算机组成原理-计算机性能指标
计算机组成原理-数制与编码(进制转换)
计算机组成原理-定点数的表示和运算
计算机组成原理-浮点数的表示与运算
计算机组成原理-算术逻辑单元ALU
计算机组成原理-存储系统
计算机组成原理-高速缓冲存储器

资源💾

计算机组成原理PPT
链接:https://pan.baidu.com/s/1Up__90vlGvS1Wl1IG3Z9SA
提取码:pb2g
配套书籍
链接:https://pan.baidu.com/s/10kHfZIWYmzq4wOQJwoYxcA
提取码:145e


指令格式

基本定义

指令(又称机器指令):是指计算机执行某种操作的命令,是计算机运行的最小功能单位。一台计算机所有的指令的集合构成该计算机的指令系统。指令是计算机的主要属性,位于硬件和软件的交界面上

注意⚠️:每一台计算机只能执行自己指令系统中的指令,不能执行其他系统的指令。

基本格式

机器指令就是机器语言的一条语句,是一组有意义的二进制代码。

一条机器指令通常分为两个部分:操作码地址码

操作码:指出该指令应该执行什么样的操作,代表了该指令的功能。

地址码:指出该指令操作的对象,给出被操作对象的地址。

而指令的长度是指一条指令中的所包含的二进制代码的位数。这取决于操作码的长度操作数地址码的长度操作数

地址的个数。指令字长和机器字长没有固定的关系:

  • 单字长指令:指令字长等于机器字长
  • 半字长指令:指令字长为机器字长的一般
  • 双字长指令:指令长度为机器字长的两倍

机器字长:指该计算机可以同时进行多少位的二进制数的并行运算,实际上指的就是计算机中的运算器有多少位。

详情参考:机器字长

在一个指令系统中,如果所有的指令长度都是相同的,则称为定长指令结构

如果指令的长度,随着指令的功能而异,则称为变长指令结构

由于主存一般是按照字节编址的方式,所以,指令的字长为字节的整数倍。

零地址指令

只给出了操作码,没有显示地址,一般用于:

  • 不需要地址码的指令,例如空操作、停机、关中断指令等;
  • 堆栈计算机中,仅仅依靠入栈和出栈操作进行运算,典型的就是Java虚拟机


假设指令字长及存储字长均为32位,操作码占8位。

一地址指令

  • O P ( A 1 ) − > A 1 OP(A_1) -> A_1 OP(A1)>A1,例如:加1、减1、取反、求补等
  • ( A C C ) O P ( A 1 ) − > A C C (ACC)OP(A_1) -> ACC (ACC)OP(A1)>ACC,隐含约定的目的地址为ACC

此时指令操作数的直接寻址范围为 2 24 = 16 M B 2^{24} = 16MB 224=16MB

二地址指令

  • ( A 1 ) O P ( A 2 ) − > A 1 (A_1)OP(A_2) -> A_1 (A1)OP(A2)>A1
    在二地址指令中,运算结果最终放在目的操作数所指的地址中

此时指令操作数的直接寻址范围为 2 12 = 4 K 2^{12} = 4K 212=4K

image-20201228145356007

三地址指令

  • ( A 1 ) O P ( A 2 ) − > A 3 (A_1)OP(A_2) -> A_3 (A1)OP(A2)>A3

此时指令操作数的直接寻址范围为 2 8 = 256 B 2^{8} = 256B 28=256B

四地址指令

( A 1 ) O P ( A 2 ) − > A 3 (A_1)OP(A_2) -> A_3 (A1)OP(A2)>A3 A 4 A_4 A4为下一条执行指令的地址

4个地址码字段各占6位,指令操作数直接寻址范围为 2 6 = 64 B 2^6 = 64B 26=64B

操作码分类

定长操作码

在指令字的最高部分分配固定的若干位(定长)表示操作码,一般n位操作码字段的指令系统最大能够表示 2 n 2^n 2n条指令。

优点:定长操作码可以简化硬件设计,提高指令的译码和识别速度

缺点:指令数量增加会扎混用更多的固定位,留给操作数地址码的位数受限

扩展操作码(不定长操作码)

全部指令的操作码字段的位数不固定,分散于指令字的不同位置。指令可以拥有不同长度的操作码,可以在满足条件的前提下,有效的缩短指令字长。

优点:在指令字长有限的前提下,可以保持丰富的指令种类

缺点:增加了指令译码和分析的难度,控制器的设计更加的复杂

在设计扩展操作码指令格式时,需要注意以下两点:

  • 不允许短码是长码的前缀,即短操作码不能喝长操作码的前半段相同
    • 否则系统将无法判断该指令是属于短码还是长码
  • 各指令的操作码不能相同

通常情况下,将使用频率频繁的指令分配较短的操作码使用频率较低的操作码分配较长的操作码,尽可能的减少指令译码和分析的时间

例如:对于一条指令字长为32位的三地址指令,操作码和地址码部分各为4位。如果是定长操作码,则只能表示16条三地址指令,但是如果

扩展操作码的方式,可以将其拆分成:

  • 15条三地址指令(4位操作码)
  • 15条二地址指令(8位操作码)
  • 15条一地址指令(12位操作码)
  • 16条零地址指令(16位操作码)

设指令字长固定为16位,设计一套指令系统满足:

  • 有15条三地址指令
  • 有12条二地址指令
  • 有62条一地址指令
  • 有32条零地址指令

设计时,从上往下依次分析即可,在每一层指令中,明确操作码的前几位是固定的,在变化的就是后面几个字位。

操作类型

数据传送

数据传送类:进行主存与CPU之间的数据传送

LOAD:将存储器(源地址)中的数据放到寄存器(目标地址)中

STORE:将寄存器(源地址)中的数据放到存储器(目标地址)中

算术逻辑操作

算术类

算术:加、减、乘、除、增1、减1、求补、浮点运算、十进制运算

逻辑:与、或、非、异或、位操作、位测试、位清除、位求反

移位操作

算术类

算术移位、逻辑移位、循环移位(带进位和不带进位)

转移操作

程序控制类:改变程序执行的顺序

  • 无条件转移 JMP

  • 条件转移 JZ:结果为0; JO:结果溢出; JC:结果又进位

  • 调用和返回 CALL和RERURN

  • 陷阱(Trap)与陷阱指令

输入输出操作

输入输出类(I/O):进行CPU和I/O设备之间的数据传送

CPU寄存器与IO端口之间的数据传送(端口即IO接口中的寄存器)

寻址方式

寻址方式是指寻找指令或者操作数有效地址的方式,即确定本条指令的数据地址及下一条待执行指令的地址的方法。寻址方式分为指令寻址数据寻址两大类。

指令中的地址码字段并不代表操作数的真实地址。该地址称为形式地址(A)。形式地址结合寻址方式可以得到操作数在存储器中的真实地址,这个地址称为有效地址(EA)。

(A)表示地址A的数值,A即可以指寄存器编号,也可以是内存地址。则(A)就可以代表寄存器中的数值,或者相应存储单元中的数值。如,EA = (A)即代表有效地址为地址A中的数值。

指令寻址

指令寻址分为,顺序寻址跳跃寻址

顺序寻址

通过程序计数器(PC)自动加1(1个指令字长),得到下一条指令的地址。

跳跃寻址

所谓跳跃就是,下一条指令的地址并不是程序计数器直接给出的,而是经过某一条指令跳转过去的。

数据寻址

数据寻址表示如何在这个指令中描述这个操作数的地址,以及通过这个地址找到真实的操作数地址。由于数据寻址的方式比较多,所以需要在指令字段中单独开辟一个字段,用来表示该数据寻址方式属于哪一类。

一地址指令:

image-20201228182941736

二地址指令:

假设指令字长 = 机器字长 = 存储字长,操作数为3

立即寻址

形式地址A就是操作数本身,又称为立即数,一般为补码形式。

一条指令的执行:

取指令访存1次

执行指令访存0次

如果不考虑结果的存储,则共计访存1次

优点:指令的执行阶段不需要访问存储器,指令执行时间短

缺点:A的位数限制了操作数的范围,如果A的位数为n,则对应的补码数据范围为 − 2 n − 1   2 n − 1 − 1 -2^{n - 1} ~ 2^{n - 1} - 1 2n1 2n11

直接寻址

直接寻址中的形式地址A就是操作数的真实地址EA,即EA=A。

一条指令的执行:

取指令访存1次

执行指令访存1次

如果不考虑结果的存储,则共计访存2次

优点:设计简单,形式地址就是操作数的真实地址,一次访存就可以得到操作数

缺点:A的位数限制了操作数的寻址范围,而且操作数的地址不容易修改

间接寻址

指令的形式地址给出的不是操作数的真实地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址,即EA = (A)。

一条指令的执行:

取指令访存1次

执行指令访存2次(第1次根据形式地址找到操作数真实的地址,第2次是根据这个真实的地址找到存储器中真实的操作数本身)

如果不考虑结果的存储,则共计访存3次

优点:可以扩大寻址范围(有效地址EA的位数大于形式地址A的位数),便于编制程序(利用间接寻址完成子程序的返回)。

缺点:指令在执行阶段要访存多次(一次间址需要两次访存,多次访存需要根据存储字的最高位确定几次访存)

寄存器寻址

在指令字中直接给出操作数所在的寄存器编号,即 E A = R i EA = R_i EA=Ri,其操作数在 R i R_i Ri所指的寄存器内。

一条指令的执行:

取指令访存1次

执行指令访存0次

如果不考虑结果的存储,则共计访存1次

优点:指令在执行阶段不访问主,指访问寄存器,指令字短且执行速度快,支持向量/矩阵运算

缺点:寄存器价格昂贵,且计算机中的寄存器个数有限

寄存器间接寻址

形式地址指向一个具体的寄存器 R i R_i Ri,但是 R i R_i Ri给出的不是具体的操作数,而是目标操作数的有效地址,即 E A = ( R i ) EA = (R_i) EA=(Ri)

一条指令的执行:

取指令访存1次

执行指令访存1次

如果不考虑结果的存储,则共计访存2次

优点:和一般的间接寻址相比速度更快,因为此时操作数的有效地址是从寄存器中找到的,而不是主存。

缺点:执行阶段需要访问主存。

寄存器隐含寻址

不是明显的给出操作数的地址,而是在指令中隐含着操作数的地址。

操作数隐含的由累加器给出。(即某指令由固定的操作数,不需要给出)

例子:8086汇编语言 CWD;把AX中的内容按符号位拓展成DX,AX双字

优点:有利于缩短指令字长

缺点:需要增加隐含存储操作数或者隐含地址的硬件

偏移寻址

基址寻址

基址寄存器 是用来存放操作数或中间结果,以减少对存储器的访问次数的数据寄存器。

通用寄存器和专用寄存间的区别和联系可以参考:通用寄存器和专用寄存器有什么区别和联系?

宽泛来说,专用寄存器室是有专门的用途的,比如程序计数器就是用来保存指令地址的。而通用寄存器并没有专门的功能,你可以用它干很多事情,比如存ASCII码、存数、都可以,只要自己明白给其赋值的意义。一般来说程序员或者用户可以直接修改的寄存器都属于通用寄存器。

将CPU中基址寄存器(BR)中的内容加上指令格式中的形式地址A,而形成操作数的有效地址,即 ( B R ) + A = E A (BR) + A = EA (BR)+A=EA


基址寄存器是面向操作系统的,其内容由操作系统或管理员程序确定

在程序执行过程中,基址寄存器中的内容不变(作为基地址),形式地址可变(作为偏移量)。

当采用通用寄存器作为基址寄存器时,可由用户决定哪个寄存器作为基址寄存器,但是其内容仍然由操作系统确定

优点:可扩大寻址范围(基址寄存器的位数大于形式地址A的位数);用户不必考虑自己的程序位于主存的哪一空间区域,所以有利于多道程序设计,以及编制浮动程序。

变址寻址

有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容相加之和,即 E A = ( I X ) + A EA = (IX) + A EA=(IX)+A,其中IX为变址寄存器(专用),同样也可以用通用寄存器作为变址寄存器。

变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户改变(作为偏移量),而形式地址A不变(作为基地址)。

优点:可扩大寻址范围(变址寄存器的位数大于形式地址A的位数);在数组处理过程中,可设定A为数组的首地址,不断改变

变址寄存器IX的内容,便可容易形成数组中任一数据的地址,特别适合编制循环程序。

基址寻址和变址寻址的区别?

参考:基址寻址与变址寻址的区别

基址寻址适合解决动态定位的问题,在多道程序环境中,操作系统根据内存空间的情况赋值给BR,一旦赋值成功,就不可更改,直至用户程序的结束,使得用户不必关心实际的地址而只需要关心自己的地址空间即可。

变址寻址适合循环问题,原因在于指令的形式地址(“基地址”)是不变的,使得再循环的时候,只需要自动的修改IX专用寄存器的值即可(迭代过程中不断加1)。但是如果使用基址寻址的方式,此时的基地址是BR中的内容,要使得循环继续,需要改变偏移量,也就是给出更多的指令来执行程序,需要循环几次,就需要给多少个命令来修改偏移量。相比于基址寄存器,变址寄存器只需要一条指令即可完成循环操作,可以大幅度缩短指令编码的长度,提高指令字的可用性。 基础寻址和变值寻址都是解决特定场景的问题,本质上其实是一样的,只是表现形式不一样

相对寻址

把程序计数器PC中的内容加上指令格式中的形式地址A而形成操作数的有效地址EA,即 E A = ( P C ) + A EA = (PC) + A EA=(PC)+A,其中A为相对于当前指令地址的偏移量,可正可负,补码表示。


优点:操作数的地址不是固定的,它随着PC值的变化而变化,并且指令之间总是相差一个固定值,因此便于程序浮动。相对寻址广泛应用与转移指令。

堆栈寻址

操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址。

堆栈是存储器(或专用存储器组)中一块特定的按“后进先出(LIFO)”原则管理的存储区,该存储区中的被读/写单元的地址使用一个特定的

寄存器给出的,该寄存器称为堆栈指针(SP)。


硬堆栈和软堆栈

硬堆栈:寄存器

软堆栈:主存

CISC和RISC

详情见:CISC和RISC的区别

CISC和RISC的主要区别:

  1. CISC的指令能力强,单多数指令使用率低却增加了CPU的复杂度,指令是可变长格式;RISC的指令大部分为单周期指令,指令长度固

    定,操作寄存器,只有Load/Store操作内存。

  2. CISC支持多种寻址方式;RISC支持方式少。

  3. CISC通过微程序控制技术实现;RISC增加了通用寄存器,硬布线逻辑控制为主,适合采用流水线。

  4. CISC的研制周期长。

  5. RISC优化编译,有效支持高级语言。

©️2021 CSDN 皮肤主题: 撸撸猫 设计师:马嘣嘣 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值