表示:

  • A: 指令中地址字段的内容
  • R: 指向寄存器的指令字段的内容
  • EA: 被访问未知的实际(有效)地址
  • (X): 存储器位置 X 或者寄存器 X 的内容

立即寻址 (Immediate Addressing)

操作数存在于指令中:

操作数 = A

应用: 定义和使用常数, 或者设置变量的初始值.

优点: 获取操作书不需要访问存储器, 只获取指令

缺点: 数字的大小被限制为地址字段的大小

.jpg)

直接寻址 (Direct Addressing)

地址字段包含着操作数的有效地址, 早期计算机常见

EA = A

优点: 只有一次存储器访问, 不需要进行专门计算

缺点: 只能提供有限的地址空间

间接寻址(Indirect Addressing)

指令中地址字段只是一个存储器字地址, 而这个地址保存着操作数的全长度地址

EA = (A)

优点: 扩大了寻址空间

缺点: 需要访问两次内存来获取操作数

评价: 一次能够引用的不同地址数存在限制

.jpg)

寄存器寻址 (Register Addressing)

类似直接寻址, 地址字段指的时寄存器而不是一个主存地址.

EA = R

优点: 指令中只需要一个很小的地址字段用来指向寄存器, 不需要访问内存

缺点: 寻址空间极其有限

注意: 只有寄存器得到了有效的使用才有意义

寄存器间接寻址(Register Indirect Addressing)

地址的字段指向一个寄存器

EA = (R)

优点: 扩大了寻址空间, 比间接寻址少访问一次主存

劣势: ?

.jpg)

偏移寻址(Displacement Addressing)

结合直接寻址和间接寻址

EA = (R) + A

指令中有两条地址字段, 其中至少一个是显性的. 其中一个地址字段(val = A) 被直接使用, 另一个地址字段指向寄存器. 寄存器的内容加上 A 产生有效地址.

三种偏移寻址:

1.相对寻址

隐式引用的寄存器时程序计数器PC, 即当前 PC 的值 (为现执行指令的下一条指令的地址), 加上地址字段的值(A, 通常为补码整数), 得到有效地址

EA = (PC) + A

优点: 利用了程序局部性的概念, 并在指令中保存了地址位.

用途: 子程序跳转?

2.基址寄存器寻址

引用的寄存器含有一个主存地址, 地址字段含有一个相对于那个地址的偏移量(usually unsigned)

可以是显式引用, 也可以是隐式引用

EA = (R) +A

3.变址

地址字段引用一个主存地址, 被引用的寄存器对于那个地址有一个正的偏移量

EA = A+(R)

用法: 高效完成重复操作, 将值 A 存入指令的地址字段, 选取一个寄存器作为变址寄存器, 初始化为0, 每次操作之后, 变址寄存器加1

扩展:结合间接寻址和变址:

  • 后变址: 间接寻址之后变址

    EA = (A) + (R)
  • 前变址: 变址在间接寻址之前

    EA = (A+(R))

栈寻址

栈指针维护在寄存器中, 所以对内存栈位置的访问实际上是一种寄存器间接寻址方式.

注意: 与栈相关的是一个指针, 它的值可能是栈顶地址或者第三个元素的地址(前两个可能已经进入寄存器)

指令格式

指令长度, 位分配, 可变长度指令