计算机组成原理(3)-指令系统
指令系统:一台计算机中所有机器指令的集合。
一般情况下,指令叫机器指令。但是如果你要细分哪种指令,指令可以分为微指令、宏指令和机器指令。
1.微指令是微程序级的命令,属于硬件。
2.宏指令是由多条机器指令组成的软件指令,属于软件。
3.机器指令是CPU能直接识别并执行的指令。
复杂指令系统计算机(CISC):大多数计算机的指令系统多达几百条
精简指令系统计算机(RISC):庞大的指令系统不但使计算机的研制周期变长,且由于采用了大量使用频率很低的复杂指令而造成硬件资源浪费,因此提出了RISC。
一条指令的结构:操作码字段OP+地址码字段A(即操作数的地址)<字段长度是固定的,但是内容不固定>
一般来说,一个包含n位的操作码最多能够表示2^n条指令。
指令格式
零地址指令:OP码
例如停机指令,不需要地址码,因为停机操作不需要操作数
-------------------------------
一地址指令:OP+A(A是隐含的,是另一个操作数地址,可能是立即数或者其他数的地址)
例如以运算器中累加寄存器AC中的数据为隐含的被操作数,指令字的地址码字段所指明的数为操作数,操作结果又放回累加寄存器AC中,而累加寄存器中原来的数随即被冲掉。
AC<==(AC)op(A)
-------------------------------
二地址指令(两个数在内存中或运算器中通用寄存器的地址):OP+A1(可做存放操作结果的地址)+A2
A1<==(A1)op(A2)
在二地址格式中,又分为三种类型:
(1)访问内存,存储器-存储器(SS)。
参与操作的数都在内存里,需要多次访问内存。
(2)访问寄存器,寄存器-寄存器(RR)。
参与操作的数都在寄存器中,执行不需要访问内存。
(3)访问内存又访问寄存器,寄存器-存储器(RS)。
--------------------------------
三地址指令:OP+A1(源操作数地址)+A2(终点操作数地址)+A3(存放操作结果的地址)
A3<==(A1)op(A2)
为了加快指令执行速度
---------------------------------
指令字长度
指令字长度:一个指令字中包含二进制码的位数。
机器字长:计算机能直接处理的二进制数据的位数,它决定了计算机的运算速度。
单字长指令:指令字长度等于机器字长度的指令。
半字长度指令:指令长度等于半个机器字长度的指令。
双字长度指令:指令长度等于两个机器字长度的指令。
多字长指令的优缺点
优点:在于提供足够的地址位来解决访问内存任何单元的寻址问题。
缺点:必须两次或三次访问以取出一整条指令,这就降低了CPU的运算速度,同时又占用了更多的存储空间。
等长指令字结构:在一个指令系统中,如果各种指令字长度是相等的,可以都是单字长种指令或半字长指令。
优点:结构简单,指令长度不变。
变长指令字结构:如果各种指令字长度随着指令功能而异,例如在一个指令系统中,有的是单字长指令,有的是双字长指令。
优点:结构灵活,充分利用指令长度,但是指令控制复杂。
指令和数据的寻址方式
寻址方式:当采用地址指定方式时,形成操作数或指令地址的方式。
寻址方式分为两种:指令寻址方式(简单)和数据寻址方式(较复杂)
指令寻址方式又分为两种:顺序寻址方式和跳跃寻址方式
顺序寻址方式
由于指令地址在内存按顺序安排,当执行一段程序时,通常是一条指令接一条指令的顺序进行。即取出一条指令并执行,接着再做下一条指令的重复动作。因此,必须使用程序计数器(指令指针寄存器)PC来计数指令的顺序号,该顺序号就是指令在内存中的地址。
跳跃寻址方式
当程序转移执行的顺序时。所谓跳跃,是指下条指令的地址码不是由程序计数器给出,而是本条指令给出。因此,执行程序跳跃后,指令计数器的内容也必须相应改变,以便及时跟踪新的指令地址。
操作数基本寻址方式
由于指令中操作数字段的地址码是由形式地址和寻址地址方式特征位等组合形成。因此指令中所给出的地址码,并不是操作数的有效地址。如图:
1.隐含寻址
2.立即寻址
3.直接寻址
4.间接寻址
5.寄存器寻址
6.寄存器间接寻址
7.偏移寻址
(1)相对寻址
隐含引用的专用寄存器是程序计数器(PC),即EA=A+(PC),它是当前PC的内容加上指令地址字段中A的值。有效地址是对当前指令地址的一个上下范围的偏移,基于程序的局部性原理。优点:节省指令中的地址位数,也便于程序在内存中成块搬动。
(2)基址寻址
1.被引用的专用寄存器含有一个存储器地址,地址字段含有一个相对于该地址的偏移量(通常是无符号整数)。
2.寄存器的引用可以是显示的,也可以是隐式的。
3.利用了存储器访问的局部性原理。
详细说明:基址寻址设置基址寄存器BR,则有
EA=A(形式地址A,也是偏移量)+(BR)(基地址)
所谓的显式是指在一组CPU中的通过寄存器,某个需要的寄存器作为基址寄存器,存放基地址。
所谓的隐式是指使用专门的基址寄存器BR,只需要在指令的特征位反映基址寻址。
OP+寻址特征+A
显式是指在一组通用寄存器中,用户需要显式指出哪个寄存器作为我们的基址寄存器,存放基地址。
(2)基址寻址可以扩大我们的寻址范围,因为基址寄存器的位数可以大于形式地址A的位数。
(3)基址寻址在多道程序中极为有用。比如在汇编当中,我们有多个段,有时我们不必关心自己的程序位于哪一个位置,我们只需要给出基址寄存器,操作系统或者管理程序就可以根据主存空间状况,为我们指定的基址寄存器赋一个初值。
(3)变址寻址
变址寻址其有效地址EA等于指令字中的形式地址A与变址寄存器IX中的内容相加。
EA=A+(IX)
基址寻址中的基址寄存器的内容通常由操作系统或者管理程序决定,在程序执行过程中是不可变的,而指令字中的A是可变的。变址寻址中变址寄存器的值是由用户设定的,在程序执行过程中是可变的,而指令字中的A是不可变的。
变址寻址特别适合编制循环程序。
比如我们要求出前100个数组元素的和:
如果我们用基址寻址的话,我们的偏移量是从指令中的形式地址得来的,那么如果我们要使偏移量不同,我们就要用不同的指令。这样看来我们就要写好多指令哦!但是如果我们用变址寻址的话,那么我们的偏移量是放在变址寄存器中的,那么我们无需改变指令,而只要改变寄存器中的值即可,因为我们的指令中存放的只是寄存器的编号而已,这样我们就大大缩短了我们指令的长度!(基址寻址和变址寻址,摘自某文章的一段文字)
8.段寻址方式(采用段基址寄存器,属于基址寻址)
9.堆栈寻址
堆栈寻址分为两种:寄存器堆栈和存储器堆栈。