指令系统
第一节: 指令的格式
指令的寻址方式
第二节: 指令的寻址方式
寻址方式:寻找本条指令的数据地址和下一条指令的地址。寻址方式包括指令寻址和数据寻址两大类。
指令寻址
指令寻址:找到下一条将要执行的指令。
- 顺序寻址:通过PC计数器+1(指令字长),自动确定下一条指令的地址。
- 跳跃寻址:通过转移类指令实现。地址有本条指令给出下条地址的计算方式。跳跃形成的结果是当前指令修改的PC值。下一条指令的地址有PC计算器给出。
数据寻址
数据寻址:找到本条指令的操作数地址。
指令格式:[OP][寻址特征][形式地址A] 寻址特征表明数据的寻址方式
隐含寻址
隐含寻址:不是明显地给出操作数的地址,而是在指令中隐含着操作数的地址。
优点:有利于缩短指令字长。
缺点:需增加存储操作数或隐含地址的硬件。
立即寻址
立即寻址:形式地址A就是操作数本身,又称为立即数,一般采用补码形式。 #表示立即寻址特征。
优点:指令执行阶段不访问主存,指令执行时间最短
缺点:A的位数限制了立即数的范围。
直接寻址
直接寻址:指令字中的形式地址A就是操作数的真实地址EA,即EA=A 。
一条指令的执行: 取指令访存1次 执行指令访存1次 暂不考虑存结果 共访存2次
优点:简单,指令执行阶段仅访问一次主存, 不需专门计算操作数的地址。
缺点: A的位数决定了该指令操作数的寻址范围。 操作数的地址不易修改。
间接寻址
间接寻址:指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址 所在的存储单元的地址,也就是操作数地址的地址,即EA=(A) 。
优点: 可扩大寻址范围,便于编制程序(用间接寻址可以方便地完成子 程序返回)。
缺点: 指令在执行阶段要多次访存
寄存器寻址
寄存器寻址:在指令字中直接给出操作数所在的寄存器编号,即EA =Ri,其操作数在由Ri所指的寄存器内。
一条指令的执行: 取指令访存1次 执行指令访存0次 暂不考虑存结果 共访存1次
优点: 指令在执行阶段不访问主存,只访问寄存器, 指令字短且执行速度快,支持向量/矩阵运算。
缺点: 寄存器价格昂贵,计算机中寄存器个数有限。
寄存器间接寻址
寄存器间接寻址:寄存器Ri中给出的不是一个操作数,而是操作数所在主存单元的地址, 即EA=(Ri) 。
一条指令的执行: (一次间接寻址)取指令访存1次 执行指令访存1次 暂不考虑存结果 共访存2次
特点: 与一般间接寻址相比速度更快,但指令的执行阶段需要访问主存(因为操作数在主存中)。
偏移寻址
便宜寻址:以某个地址作为起点,形式地址 视为“偏移量”。
基址寻址
基址寻址:以程序的起始存放地址作为“起点”,将CPU中 基址寄存器(BR)的内容加上指令格式中的形式地址A, 而形成操作数的有效地址,即EA=(BR)+A。
注:基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定。基址寄存器在执行过程中不可变,指令中的A是可变的。基址寄存器的选择可有专用和通用寄存器。
- 在程序执行 过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量)。
- 当采用通用寄存器作为基址寄存器时,可由用户决定哪个寄存器作为基址寄存器, 但其内容仍由操作系统确定。
优点:可扩大寻址范围,故有利于多道程序设计,以及可用于编制浮动程序。
变址寻址
变址寻址:有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容相加之和, 即EA= (IX)+A,其中IX可为变址寄存器(专用),也可用通用寄存器作为变址寄存器。
注:变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户改变 (IX作为偏移量),形式地址A不变(作为基地址)
优点:在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便 可很容易形成数组中任一数据的地址,特别适合编制循环程序。
相对寻址
相对寻址:把程序计数器PC的内容加上指令格式中的形式地址A而形成操作数的有效地址, 即EA=(PC)+A,其中A是相对于PC所指地址的位移量
优点:操作数的地址不是固定的,它随着PC值的变化而变化,并且与指令地址之间总是 相差一个固定值,因此便于程序浮动(一段代码在程序内部的浮动)。 相对寻址广泛应用于转移指令。
堆栈寻址
堆栈寻址:操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址。 堆栈是存储器(或专用寄存器组)中一块特定的按“后进先出(LIFO)” 原则管理的存储区,该存储区中被读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP)。
- 硬堆栈:寄存器堆栈,成本高
- 软堆栈:主存中划分,划算最常用