目录
指令(又称机器指令):
是指示执行操作的命令,是计算机运行的最小功能单位.一台计算机的所有指令的集合构成该机的指令系统,也称为指令集.
注:一台计算机只能执行自己指令系统中的指令,不能执行其他系统的指令.
一条指令就是机器语言的一个语句,它是一组有意义的二进制代码.
一条指令通常包括操作码字段和地址码字段两部分:
一条指令可能包含0个,一个,2个,3个,4个地址码...
根据地址码数目不同,可以将指令分为零地址指令,一地址指令,二地址指令....
零地址指令OP
指令用途
1.不需要操作数,如空操作,停机,关中断等指令
2.堆栈计算机,两个操作数隐含存放在栈顶和次栈顶,计算结果压回栈顶
指令含义:OP(A1)->A1:完成一条指令需要3次访存:取值->读A1->写A1
一地址指令OP A1
1.只需要单操作数,如加1,减1,取反,求补等
2.需要两个操作数,但其中一个操作数隐含在某个寄存器
指令含:(ACC)OP(A1)->ACC:完成一条指令需要2次访存:取指->读A1
注:A1指某个主存地址,(A1)表示A1所指向的地址中的内容
二地址指令OP A1(目的操作数) A2(源操作数)
常用于需要两个操作数的算术运算,逻辑运算相关指令
指令含义:(A1)OP(A2)->A1
完成一条指令需要访存4次,取指->读A1->读A2->写A1
三地址指令OP A1 A2 A3(结果)
常用语需要俩个操作数的算术运算,逻辑运算相关指令
指令含义:(A1)OP(A2)->A3
完成一条指令需要访存4次,取指->读A1->读A2->写A3
四地址指令OP A1 A2 A3(结果) A4(下址)
指令含义:(A1)OP(A2)->A3,A4=下一条将要执行指令的地址
完成一条指令需要访存4次,取指->读A1->读A2->写A3
正常情况下:取指令之后PC+1,指向下一条指令
四地址指令:执行指令后,将PC的值修改位A4所指地址
指令字长:一条指令的总长度(可能会变)
机器字长:CPU进行一次整数运算所能处理的二进制数据的位数(通常和ALU直接相关)
存储字长:一个存储单元中的二进制代码位数(通常和MDR位数相同)
单字长指令:长度等于机器字长
半字长指令:长度等于半个机器字长
双字长指令:长度等于两杯机器字长
定长指令字结构:指令系统中所有指令的长度都相等
变长指令字结构:指令系统中指令的长度不等
定长操作码:指令系统中所有指令的操作码长度都相同;控制器的译码电路设计简单,但灵活性较低
可变长操作码:指令系统中各指令的操作1码长度可变;控制器的译码电路设计复杂,但灵活性高
定长指令字结构+可变长操作码 ->扩展操作码指令格式
1.数据传送
LOAD 作用:把存储器中的数据放在寄存器中
STORE作用:把寄存器中的数据放到存储器中
2.算术逻辑操作
算术:加,减,乘,除,增1,减1,求补,浮点运算,十进制运算
逻辑:与,或,非,异或,位操作,位测试
3.移位操作
算术移位,逻辑移位,循环移位
4.转移操作
无条件转移 JMP
条件转移 JZ:结果为0; JO:结果溢出;JC:结果有进位
5.输入输出操作
CPU寄存器与IO端口之间的数据传送(端口即IO接口中的寄存器)
定长指令字结构+可变长操作码->扩展操作码指令格式
举例:
指令字长为16位,每个地址码占4位;
前4位为基本操作码字段OP,另有3个4位长的地址字段A1,A2和A3;
4位基本操作码若全部用于三地址指令,则有16条.
1111 1111留作扩展操作码之用,二地址指令为15条;
1111 1111 1111留作扩展操作码之用,一地址指令为15条;
零地址指令为16条
在设计扩展操作码指令格式时,必须注意以下两点:
1)不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同
2)各指令的操作码一定不能重复
通常情况下,对使用频率较高的指令,分配较短的操作码;对使用频率较低的指令,分配较长的操作码,从而尽可能减少指令译码和分析的时间
如下设计:
设地址长度为n,上一层留出m种状态,下一层可扩展出m*2^n种状态
定长操作码:
优:定长操作码对于简化计算机硬件设计,提高指令译码和识别速度很有利;
缺;指令数量增加时会占用更多固定位,留给表示操作数地址的位数受限
扩展操作码;
优:在指令字长有限的前提下扔保持比较丰富的指令种类;
缺:增加了指令译码和分析的难度,使控制器的设计复杂化;
指令寻址 下一条欲执行指令的地址(始终由程序计数器PC给出)
顺序寻址
通过程序计数器(PC)加1,自动生成下一条指令的地址
(PC)+“1”->PC:这里的1理解为1个指令字长,实际加的值会因指令长度,编址方式而不同;
如果系统采用变长指令字结构,每一种颜色代表一个指令字长;
读入一个字,根据操作码判断这条指令的总字节数n,修改pc的值.
(PC)+n->PC
跳跃地址
通过转移类指令实现,是否跳跃受到状态寄存器和操作数的控制
跳跃到的地址分类:绝对地址:由标记符直接得到;相对地址:相对于当前指令地址的偏移量;
跳跃的结果是当前指令修改PC值
JMP:无条件转移把PC的内容改成7;无条件转移指令类似于C语言中的goto;
在指令中表示一个操作数的地址
结构:操作码+寻址特征+形式地址A
前面有讲过跳跃地址,JMP是这样解释的:需要跳转到地址为7的地方;
那么假设我们从第100存储地址,
这里还能解释成跳转到7的地方吗?显然是错误的,这个程序是从100往后存储的,地址为7的是属于其他的存储地址,我们可以这样解读:基于100往后的7个偏移量;
那么我们再改一下
之前说过,每取出来一个数,就将PC+1,就到了104的位置,然后再往后偏移3个位置;
从上可见,数据的寻址方式,解释方式有很多很多种,下面我们会对其进行介绍,
假设指令字长=机器字长=存储字长,操作数为3
一地址指令
直接寻址:指令字中的形式地址A就是操作数的真实地址EA,即EA=A;
一条指令的执行:取指令 访存1次;执行指令 访存1次;暂不考虑存结果;共访存2次
优点:简单,指令执行阶段仅访问一次主存,不需专门计算操作数的地址
缺点:A的位数决定了该指令操作数的寻址范围。操作数的地址不易修改.
假设指令字长=机器字长=存储字长,操作数为3
间接寻址:指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址,即EA=(A);
一次间接寻址
多次间接寻址
优点:可扩大寻址范围(有效地址EA的位数大于形式地址A的位数)便于编制程序(用间接寻址可以方便地完成子程序返回)
缺点:需要多次访存,访问速度过慢,这种寻址方式不是特别常用
假设指令字长=机器字长=存储字长,操作数为3
寄存器寻址:在指令字中直接给出操作数所在的寄存器编号,即EA=Ri,其操作数在由Ri所指的寄存器内。
一条指令的执行:取指令 访存一次;执行指令 访存0次;暂不考虑存结果,共访存一次;
优点:指令在执行阶段不访问主存,只访问寄存器,指令字短且执行速度快,支持向量/矩阵运算。
缺点:寄存器价格昂贵,计算机中寄存器个数有限;
假设指令字长=机器字长=存储字长,操作数为3
寄存器间接寻址:寄存器Ri中给出的不是一个操作数,而是操作数所在主存单元的地址,即EA=(Ri).
一条指令的执行:取指令 访存一次;执行指令 访问一次;暂不考虑结果,共访问2次;
特点:与一般间接寻址相比速度较快,但指令的执行阶段需要访问内存.
隐含寻址:不是明显地给出操作数的地址,而是在指令中隐含着操作数的地址;
优点:有利于缩短指令字长
缺点:需增加存储操作数或隐含地址硬件
假设指令字长=机器字长=存储字长,操作数为3
立即寻址:形式地址A就是操作数本身,又称为立即数,一般采用补码形式。#表示立即寻址特征。一条指令的执行:取指令 访存一次。执行指令 访存0次。暂不考虑结果,共访存一次。
优点:指令执行阶段不访问主存,指令执行时间最短。
缺点:A的位数限制了立即数的范围
基址寻址:将CPU中基址寄存器(BR)的内容加上指令格式中的形式地址A,而形成操作数的有效地址,即EA=(BR)+A;其中基址寄存器既可采用专用寄存器,又可采用通用寄存器
基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定,主要用于解决程序逻辑空间与存储器物理空间的无关性。在程序执行中,基址寄存器的内容不变,形成地址可变。采用通用寄存器作为基址寄存器时,可由用户决定哪个基址寄存器,但其内容仍由操作系统确定
基址寻址的优点是可扩大寻址范围(基址寄存器的位数大于形式地址A的位数);用户不必考虑自己的程序存于主存的哪个空间区域,因此有利于多道程序设计,并可用于编制浮动程序但偏移量(形式地址A)的位数较短。
例子:
这样可以使用直接寻址就可以完成,主存地址为0,指令的形式地址为5,则直接指向主存地址为5的地方,但是如果程序从地址100开始存放
使用直接寻址是不行的,这时候我们需要使用基址寻址EA=(BR)+A;BR=0000 0000 0110 0100对应十进制100;EA=100+5=105;采用基址寻址无需修改指令中的地址码;变量a的实际存放地址为105
变址寻址:有效地址EA等于指令字中的形式地址A与地址寄存器IX的内容相加之和,即EA=(IX)+A,其中IX可为贬址寄存器(专用),也可用通用寄存器作为变址寄存器
注:变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户改变(IX作为偏移量),形式地址A不变(作为基地址)。
优点:在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可狠容易形成数中任一数据的地址,特别适合编制循环程序。
相对寻址:把程序计数器PC的内容加上指令格式中的形式地址A而形成操作数的有效地址,即EA=(PC)+A,其中A是相对于PC所指地址的位移量,可正可负,补码表示.
问题:我们还是这个代码块,随着代码越写越多,你想挪动foe循环的位置
假设我们随便挪个位置
主存M+3的位置的地址码是跳转到主存地址2的位置,可是这个位置已经不属于这个内存卡,会出现错误,这时候我们就需要使用相对寻址,取出M+3这条指令之后,PC会自动往后+1,即M+4的位置,如果让我们的M+4,跳转到M的位置即-4即可
优点:操作数的地址不是固定的,它随PC值的变化而变化,且指令地址之间总是相差一个固定值,因此便于程序浮动。相对寻址广泛应用于转移指令.
堆栈寻址;操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址
堆栈是存储器(或专用寄存器组)中一块特定的按"后进先出"原则管理的存储区,该存储区中被读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP)
这种堆栈称为硬堆栈,这种会更快,成本会更高
在主存中划分的则是软堆栈
对以上10种进行总结
指令系统朝两个截然不同的方向发展:一是增强原有指令的功能,设置更为复杂对的新指令实现软件功能的硬件,这类机器称为复杂指令系统计算机(CISC),典型的有采用X86架构的计算机;二是减少指令种类和简化指令功能,提高指令的执行速度,这类机器称为精简指令系统计算机(RISC),典型的有ARM,MIPS架构的计算机
CISC的主要特点;
1.指令系统复杂庞大,指令数目一般为200条以上
2.指令的长度不固定,指令格式多,寻址方式多
3.可以访存的指令不受限制
4.各种指令使用频度相差很大
5.各种指令执行时间相差很大,大多数指令需多个时钟周期才能完成
6.控制器大多数采用微程序控制。有些指令非常复杂,以至于无法采用硬连线控制
7.难以用优化编译生成高效的目标代码程序
一味地追求指令系统的复杂和完备程度不是提高计算机性能的唯一途径。后来人们发现,一味地追求指令系统的复杂和完备程度不是提高计算机性能的唯一途径.对传统CISC指令系统的测试表明,各种指令的使用频率相差悬殊,大概只有20%的比较简单的指令被反复使用,约占整个程序的80%;而80%左右的指令则是很少使用,约占整个程序的20%,从这一事实出发,人们开始了对指令系统合理性的研究,于是RISC随之诞生.
精简指令系统计算机(RISC)
精简指令系统计算机的中心思想是要求指令系统简化,尽量使用寄存器-寄存器操作指令,指令格式力求一致。RISC的主要特点如下:
1.选取使用频率最高的一些简单指令,复杂指令的功能由简单指令的组合来实现
2.指令长度固定,指令格式种类少,寻址方式种类少
3.只有Load/store指令访存,其余指令的操作都在寄存器之间进行
4.CPU中通用寄存器的数量相当多
5.RISC一定采用指令流水线技术,大部分指令在一个时钟周期内完成
6.以硬布线控制为主,不用或少用微程序控制
7.特别重视编译优化工作,以减少程序执行时间