指令系统
指令又称为机器指令,是指示计算机执行某种操作的命令,一台计算机所有指令的集合构成该机的指令系统,也称指令集。
指令格式
指令是一组有意义的二进制代码,通常包括操作码字段和地址码字段。根据地址个数,又分为零地址指令,一地址指令,二地址指令等。
操作码指出该指令应该执行什么操作,具有什么功能,地址码给出被操作的信息的地址。
指令字长是指一条指令所包含的二进制代码的位数,取决于操作码的长度、地址码的长度和地址码的个数。指令字长和机器字长没有固定的关系,可以大于,可以等于,可以小于。
一般可以根据指令字长将指令分为半字长指令、单字长指令、双字长指令。指令字长也会影响取指令的时间开销,单字长指令只需要一次访存就能将指令完整取出,而双字长指令需要两次。
零地址指令
只给出操作码,没有显式地址。有些指令不需要操作数,比如空操作指令、停机指令或者关中断指令等,也有在堆栈计算机中的一些运算类指令,会将操作数利用堆栈存取,不需要给出地址。
一地址指令
一地址指令一般就两种情况
- 只有目的操作数的单操作数指令,按地址码读取操作数后,操作完成将结果存回原地址
- 隐含阅读的目的地址的双操作指令,比如累加器累加,最后运算结果会存放在累加器中
二地址指令
给出两个操作数,并指令目的操作数和源操作数,并将运算结果保存至目的操作数的地址。
三地址指令
在二指令的基础上,给出结果存放的地址,将运算结果写到指明的目的地址。
四地址指令
在三地址的基础上给出下一条指令的地址。
指令的寻址方式
寻找下一条执行的指令的地址称为指令寻址,寻找本条指令的数据地址称为数据寻址。
指令寻址
通过程序计数器 PC 加 1(1 指的是一条指令的长度),自动形成下一条指令的地址,这种寻址方式称为顺序寻址。
也有一些跳转指令,下一条指令的地址并不是按照顺序来的,而是通过本条指令计算出下一条指令的地址,跳跃的方式分为绝对转移方式(地址码由指令直接给出)和相对转移方式(地址码指出转移目的地址相对于当前 PC 的偏移量),这种寻址方式称为跳跃寻址。
数据寻址
数据寻址的方式较多,为了区别各种方式,通常会在指令字中设置一个寻址特征字段,用来指明属于哪种寻址方式。
地址格式:操作码 | 寻址特征 | 形式地址
直接寻址
形式地址给出的就是操作数的真实地址,优点是简单,不需要专门的计算操作数的地址,指令在执行过程中也只要访存一次,但也有缺点,就是 A 的位数限制了操作数的寻址范围,操作数的地址不易修改。
间接寻址
间接寻址是相对于直接寻址而言,形式地址给出的并不是操作数的地址,而是存有操作数有效地址所在的主存单元的地址,也就是操作数地址的地址。优点是扩大了寻址的范围,缺点是需要多次访存。
寄存器寻址
形式地址给出的是寄存器的编号,寄存器中存放的操作数。
寄存器间接寻址
形式地址给出的是寄存器的编号,寄存器中存放的是操作数的地址。比一般的间接寻址要快。
隐含寻址
操作数不会显式的指出而是隐含的约定,比如前面提到过的累加寄存器。
立即寻址/立即数寻址
形式地址给出的就是操作数。优点是不需要访存,缺点就是 A 大小受限。
相对寻址
形式地址给出的是偏移量,基准是程序计数器 PC。
基址寻址
形式地址给出的是偏移量,基准是基址寄存器 BR。寄存器由操作系统管理,一般不可由用户改变。
变址寻址
形式地址给出的是偏移量,基准是变址寄存器 IX。寄存器是面向用户的,内容由用户设定。
堆栈寻址
堆栈式存储器中一块特定的按后进先出原则管理的存储区,存储区的读/写单元地址用一个特殊的寄存器给出(堆栈指针 SP)。在采用堆栈结果的计算机中,大部分指令都是零地址指令,因为操作数地址都隐含的使用了 SP。