本博客最先发表于我的个人博客。
寻址方式是指确定本条指令的数据地址以及下一条将要被执行的指令地址的方法,与硬件结构紧密相关,而且直接影响指令格式和指令功能。
1. 指令寻址
- 顺序寻址
- 跳跃寻址
2. 数据寻址
- A: 操作数的形式地址
- EA: 操作数的真实地址
2.1 立即寻址
| OP | # | A |
|---|---|---|
| 指令 | 立即寻址特征 | 立即数 |
- 特点:操作数本身设在指令字内,又称之为立即数
- 优点:在执行阶段不需要访问存储器
- 缺点:A的位数限制了立即数的范围
2.2 直接寻址
- 特点:指令字内的形式地址A就是操作数的真实地址EA
- 优点:寻找操作数比较简单,不需要专门计算操作数地址,在执行阶段只需访存一次
- 缺点:A的位数限制了操作数的寻址范围,而且必须修改A的值,才能修改操作数地址
2.3 隐含寻址
- 特点:指令字中不明显给出操作数的地址,其操作数的地址隐含在操作码或某个寄存器中
- 优点:由于隐含寻址在指令字中少了一个地址,因此有利于缩短指令字长
2.4 间接寻址
- 指令字内的形式地址不直接给出操作数的地址,而是指出操作数有效地址所在的存储单元地址
- 当多次间接寻址时,可用存储字的首位标志间接寻址是否结束。为“1”,则仍为A;为“0”,说明是EA
- 优点:
- 与直接寻址相比,扩大了操作数的寻址范围(A的位数通常小于指令字长)
- 便于编制程序
- 缺点:指令的执行阶段需要访存两次或多次
2.5 寄存器寻址
- 特点:地址码字段直接指出了寄存器的编号,即EA=R,操作数在R内
- 优点:
- 操作数不在主存内,故无需访存,节省了执行时间
- 只需指明寄存器编号,故指令字较短,节省了存储空间
2.6 寄存器间接寻址
- 特点:R中存放的不是操作数,而是操作数所在主存单元的地址号
2.7 基址寻址
-
特点:设有基址寄存器BR,其操作数的有效地址EA等于指令字中的形式地址与基址寄存器中的内容相加
-
优点:
- 可以扩大操作数的寻址范围
- 基址寻址在多道程序中极为有用
-
用户不可以修改BR的值,只能修改A
-
采用通用寄存器寻址
2.8 变址寻址
- 特点:有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容相加之和,IX由用户给定,可以改变
- 优点:可以扩大操作数的寻址范围
2.9 相对寻址
- 特点:相对寻址的有效地址是将PC的内容(当前指令的地址)与指令字中的形式地址A相加而成
- 常被用于转移类指令,转移后的目标地址与当前指令有一段距离,称为相对位移量
2.10 堆栈寻址
- 特点:堆栈指针一般用SP表示,进栈PUSH,出栈POP,SP的内容都需要发生变化,操作数的地址总被隐含在SP中
- 根据堆栈增长方向,基于主存实现的堆栈分为:
- 递增堆栈,随着数据的压入,这种堆栈向高地址方向增长
- 递减堆栈,随着数据的压入,这种堆栈向低地址方向增长
- 根据SP所指示栈顶单元的属性,也可分为:
- 满堆栈:SP指示栈顶单元存储的是最后压入的数据
- 空堆栈:SP指示栈顶单元用于接收下一个要压入的数据
-
SP的修改与主存编制方法有关
-
按字编址
- 进栈 (SP)-1 --> SP
- 出栈 (SP)+1 --> SP
-
按字节编址
- 存储字长16位 进栈 (SP)-2 --> SP 出栈 (SP)+2 --> SP
- 存储字长32位 进栈 (SP)-4 --> SP 出栈 (SP)+4 --> SP
-