- | 过程 | 优点 | 缺点 | 执行时访存次数(不考虑取指令) |
---|---|---|---|---|
直接寻址 | 指令字中的形式地址A就是操作数的真实地址EA,即EA=A。 | 简单,指令执行阶段仅访问一次主存,不需专门计算操作数的地址。 | A的位数决定了该指令操作数的寻址范围。操作数的地址不易修改。 | 1 |
间接寻址 | 指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址,即EA=(A) | 可扩大寻址范围(有效地址EA的位数大于形式地址A的位数)。便于编制程序(用间接寻址可以方便地完成子程序返回)。 | 指令在执行阶段要多次访存(一次间址需两次访存,多次寻址需根据存储字的最高位确定几次访存)。 | n+1 |
寄存器寻址 | 在指令字中直接给出操作数所在的寄存器编号,即EA=R,其操作数在由R所指的寄存器内。 | 指令在执行阶段不访问主存,只访问寄存器,指令字短且执行速度快,支持向量/矩阵运算, | 寄存器价格昂贵,计算机中寄存器个数有限 | 0 |
寄存器间接寻址 | 寄存器R中给出的不是一个操作数,而是操作数所在主存单元的地址, | 与一般间接寻址相比速度更快,但指令的执行阶段需要访问主存(因为操作数在主存中)。 | - | 1 |
隐含寻址 | 不是明显地给出操作数的地址,而是在指令中隐含着操作数的地址。 | 有利于缩短指令字长。 | 需增加存储操作数或隐含地址的硬件。 | - |
立即寻址 | 形式地址A就是操作数本身,又称为立即数,一般采用补码形式。 | 指令执行阶段不访问主存,指令执行时间最短 | A的位数限制了立即数的范围。如A的位数为n,且立即数采用补码时,可表示的数据范围为\(-2^{n} - 2^{n}-1\) | 0 |
基址寻址 | 将基址寄存器(BR)的内容加上指令字中的形式地址A而形成操作数的有效地址,即EA=(BR)+A | 便于程序“浮动”,有利于多道程序并发运行 | - | 1 |
变址寻址 | 有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容之和,即EA=(IX)+A,其中IX可以为变址寄存器(专用),也可用通用寄存器作为变址寄存器 | 在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可很容易形成数组中任一数据的地址,特别适合编制循环程序。还可以扩大寻址范围(变址寄存器的位数大于A的位数) | - | 1 |
相对寻址 | 把程序计数器PC的内容加上指令格式中的形式地址A而形成操作数的有效地址,即EA=(PC)+A,其中A是相对与当前PC值的偏移量,可正可负,补码表示。(不能说A是相对于当前指令地址的偏移量) | 操作数的地址不是固定的,它随着PC值的变化而变化,且指令地址之间总相差一个固定的偏移量,因此便于程序浮动。相对寻址广泛应用于转移指令 | - | 1 |
堆栈寻址 | 操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址。 | - | - | - |