软考笔记(9)--计算机组成原理2--指令系统
前言
CPU就是一个执行各种计算机指令的逻辑机器,计算机指令也叫做机器语言。不同CPU支持的语言可能不同,比如Inter的CPU和苹果手机ARM的CPU就支持不同的指令,每个CPU能支持的指令组合在一起就是计算机指令集。
指令是计算机执行操作的命令,计算机的所有指令集合构成计算机的指令系统,指令系统位于硬件和软件的交界面上,决定了计算机的基本功能。
1、指令的基本概念
指令:CPU能够识别的计算机指令,由0和1组成的机器码
计算机程序的最终执行都是通过指令来完成,由于指令都是0和1组成,程序员无法看懂,比如加法指令的机器码是00000011,你那么编程时就需要对机器码进行翻译,将0和1组成的机器码翻译成程序员能看懂的指令。所以就有了汇编语言,汇编语言本质上就是机器码的翻译,汇编语言的指令和机器码是一一对应的,比如加法就是ADD。不过虽然汇编语言是程序员可以看懂的语言,不过汇编语言是低级语言,需要频繁和计算机硬件如寄存器交互,这对于程序员而言并不友好,所以在汇编语言之上又有一种不需要和计算机直接交换的语言,也就是高级语言,如C语言。
高级语言到指令的过程为:先将高级语言进行编译,生成汇编语言,然后再通过汇编语言生成计算机能够识别的机器码,最终由CPU来执行对于的机器码指令。
指令集有复杂指令集(CISC)和精简指令集(RISC)两种
CISC是以硬件为中心的指令集设计,指令的长度可变,支持复杂的指令,通过硬件来实现各种复杂的程序指令,所以指令集中的指令会比较多;
RISC是以软件为中心的指令集设计,指令的长度不变,通常用于简单的指令,通过编译器实现简单指令的组合来完成复杂的功能,指令集中的执行比较少。
RISC架构中,将指令集精简到20%的简单指令,原先的复杂指令则通过简单指令组合实现,让软件来实现硬件的功能。这样CPU的硬件设计就比较简单,在硬件层面提升了性能。
RISC的CPU完成指令的电路简单了,就腾出更过的空间来给通用寄存器使用,因为RISC完成同样的功能需要执行的指令数量要比CISC多,需要反复从内存中读取指令和数据到寄存器中来,很多时间会花在访问内存上,所以RISC架构的CPU需要比CISC架构更多的通用寄存器。
CISC架构典型代表是X86架构;RISC架构典型代表是ARM架构。
2、指令的格式
指令由两部分组成,分别是操作码和操作数地址码
![](https://img2023.cnblogs.com/blog/822135/202304/822135-20230405194230913-814648988.png)
2.1、操作码
操作码指明指令操作性能的命令码,如操作码0000表示加法,0001表示减法操作,每条指令都要去它的操作码必须是独一无二,指令系统中每一个指令都有唯一的操作码,指令不同操作码肯定不同。
操作码的长度取决于指令系统中支持的指令条数,如操作码长度为4,那么指令系统中最多支持16条指令。
2.2、操作数地址码
操作数地址码用来描述指令的操作对象,地址码中可以用操作数本身,页可以指出操作数在存储器中的地址或寄存器地址,或表示操作数在存储器中的间接地址等。
一个指令中含有操作数地址可以没有或者可能不止一个,比如加减法指令就需要两个地址,考虑到需要保存操作结果的话还需要有一个存放结果的地址,考虑到还有下一条指令的话还需要存放下一条指令的地址等。
![](https://img2023.cnblogs.com/blog/822135/202304/822135-20230405194322351-1499153638.png)
![](https://img2023.cnblogs.com/blog/822135/202304/822135-20230405194441126-624219285.png)
一个指令中包含二进制代码的位数称为指令字长,而机器字长表示计算机能够直接处理的二进制数据的位数,机器字长通常于主存单元的位数一致。
如果指令字长等于机器字长,成为单字长指令;指令字长等于半个机器字长成为半字长指令;指令字长等于两个机器字长的指令成为双字长指令。
指令字长 = 操作码位数 + (操作数地址个数) * (操作数地址码位数)
机器码指令的优点是指令的类型、所有操作参数以及下一条指令地址都存在单个指令中,缺点就是指令长度可能会比较长。
3、寻址方式
寻址方式指确定本条指令的数据地址以及下一条要执行的指令地址的方法。一般把指令中存放的操作数地址称为形式地址,从形式地址中得到有效地址的方式称为寻址方式。
3.1、指令寻址方式
指令的寻址方式有顺序寻址和跳跃寻找两种方式
顺序寻址:指令在内存中是顺序存储,当前指令执行完成后顺序执行下一条指令,需要配合程序计数器PC来计数指令的顺序号,该顺序号就是指令在内存中的地址;
跳跃寻址:当程序转移执行时需要采用跳跃寻址,下一条指令地址不是通过程序计算器PC给出而是由当前指令给出,跳跃到新的地址后,程序计数器需要刷新成新的地址继续顺序执行。
3.2、操作数寻址方式
立即寻址
操作数地址中的数就是操作数,可以直接使用,无需访问存储器
直接寻址
操作数地址是操作数在存储器内的直接地址,可以直接访问一次存储器拿到,不过直接地址长度会影响指令字长,所以直接寻址的地址长度通常有限制
间接寻址
操作数地址存储的不是操作数在存储器内的直接地址,而是操作数在存储器内地址的地址,间接寻址方式需要访问两次存储器,先拿到操作数地址,然后再根据地址访问操作数。优点是可以利用的存储器空间比较大;
另外当操作数地址发生变化时,也不需要修改指令,只需要修改指令地址对应的存储器地址内存即可
变址寻址
操作数地址中的形式地址A与地址修改量X进行相加得到操作数有效地址EA,EA=A+X,其中X是地址修改量,成为变址值,由变址器存储。比如循环从连续地址操作时,就可以通过变址寻址的方式在原有地址基础上进行修改即可。
变址器一般采用寄存器实现,称为变址寄存器
基址寻址
操作数地址中的形式地址A与基址相加得到操作数有效地址,基址通常数一个专门的基址寄存器或由指令指定一个寄存器存储。基址寄存器通常用户程序无法修改,由管理程序来操作。一般用于解决程序在存储器中的定位和扩大寻址空间的问题。比如存储空间比较大时,指令的地址码无法直接访问到存储器所有单元,通常将整个存储器划分为若干个段,段的首地址存放在基址寄存器或段寄存器中,指令地址码存储段内偏移量即可,访问时由段首地址加上段内偏移量得到实际地址
相对寻址
操作数地址中的形式地址A与程序计数器PC作为基址进行相加得到有效地址,形式地址作为偏移量,有效地址为EA=A+PC,相对地址主要用于转移指令,相对寻址指操作数位置与当前指令之间的相对距离,若位移量不变,无论本指令位置在哪,操作数总是与当前指令保持一个相同距离,意味着这种指令不需要任何修改就能在主存的任意位置正确执行
寄存器寻址
操作数地址中的地址用寄存器编号代替,寄存器的作用由寻址方式码来指定。寄存器可以用直接寻址方式或间接寻址方式
4、指令的分类
一台计算机的指令系统通常有几十条至几百条指令,按照指令完成功能可以分为几个类型
1、数据传输类指令
用来完成计算机主机内部数据等存取操作,从操作对象区分,传输指令分为以下几种:
寄存器至寄存器(Register-Register,R-R)
存储器至寄存器(Storage-Register,S-R)
寄存器至存储器(Register-Storage,R-S)
存储器至存储器(Storage-Storage,S-S)
数据传输指令一次可以传输一个数据或一批数据,堆栈操作指令是一种特殊的数据传输指令,压入指令(PUSH)把指定的操作数送入栈顶,弹出指令(POP)把栈顶顶数据取出,送到指令所指定的目的地。
2、算术运算类指令
算术运算指令包括加减乘除法等指令
3、逻辑运算类指令
逻辑运算指令主要是对布尔变量的运算,包括逻辑与、逻辑或、逻辑非和逻辑异或指令
4、移位指令
移位指令分为算术移位、逻辑移位和循环移位三种,移位可以是左移或右移
5、程序控制类指令
用户控制程序的流向,包括转移指令、转子与返回指令和程序中断指令等
转移指令包括无条件转移和条件转移指令,用于转移到下一条指令;
转子与返回指令用于调用子程序的指令,调用子程序时先将下一条指令的地址压入堆栈保存,然后转入所调用的子程序执行,子程序执行完成的返回指令把调用指令压入的返回地址从堆栈中弹出,返回调用程序
程序中断指令是计算机出现异常情况或特殊请求时随机产生的,中断指令作为隐指令不提供给用户使用
6、输入输出指令
处理器和外部设备通信的指令,包括输入指令和输出指令两种;
7、字符串处理指令
用于字符串传输、比较、查询和转换等指令;
8、处理器控制类指令
包括停机指令、等待指令、空操作指令、开中断指令、关中断指令和设置条件码指令等;
9、特权指令
在多用户多任务的计算机系统中,特权指令用于系统资源的分配和管理,包括改变系统的工作方式、检测用户的访问权限、修改虚拟存储器管理的段表、页表和完成任务的创建和切换等;