(非偏移)
数据寻址:本指令的地址码指明的真实地址
- 地址码的解读方式很多,应该用哪一种呢?
- 可能是绝对地址,也可能是相对本程序起点,也可能是相对pc
- 用bit位来标识
- 地址解读: 形式地址A–>有效地址EA
- 多种方式:
- 直接寻址:EA=A
- 取指令、执行指令访存 两次
- 简单,不需要计算
- 地址位数有限,对地址大小限制
- 若数据存储地址改变,则gg了,灵活性太差了
- 间接寻址:EA=(A)
- A中存储的是有效地址
- 三次访存
- 扩大了寻址范围;很像递归的过程,便于编程
- 但多次访存,浪费一倍的空间
- 寄存器寻址:形式地址指向寄存器编号,地址在寄存器中
- 只用访存一次,速度很快
- 寄存器数量少,编号的位数少
- 缺点是寻址能力有限
- 寄存器间接寻址
- 寄存器中指向主存存储指令的位置
- 隐含寻址
- 指令中隐含着操作数的地址
- 比如之前的默认加法,另一个操作数在acc中,此时只用一个地址就能加法
- 不用访存
- 立即寻址
- 将操作数显示放入指令中
- 通常用补码形式
- 这就不用访存了
- # \# # 表示
- 立即数的范围被限制
- 直接寻址:EA=A
(偏移)
- 有三种,区别在于起点不同
- 基址寻址:程序的起始存放地址为起点
- 基址寄存器 BR 存储当前程序存放地址
- 优点:
- 便于程序放在主存中的任意位置,只需要修改BR,其他的就不用改
- 从而实现多道程序并发运行‘
- 可以扩大寻址范围
- BR的内容是放在PCB中的,BR是面向操作系统的,程序员不能修改
- 方便程序在主存中浮动
- 变址寻址:程序员自己决定
- 变址寄存器: IX
- 与基址寻址很像,主要区别在于面向用户,形式地址不变,变的是寄存器的内容
- 如果采用直接寻址,那么这种迭代的代码就很蠢
- 而采用变址寻址,就很舒服了,见下图
- 用这种的原因在于:指令中的地址是不能变的,而寄存器中的内容是可以变的,于是,采用变址的方式,通过指令改变IX寄存器中的内容,实现每次不同的寻址
- 相对寻址:程序计数器pc为起点
- EA=(PC)+A
- A可正可负
- 作用:代码越写越多,把for循环的位置移动到别的地方,所以需要相对寻址。。方便某段代码在程序内部浮动
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nWiUGM9T-1643979769034)(https://gitee.com/huozuo/typoraImage/raw/master/img/image-20220204203825932.png)]
堆栈寻址
- 两种方式实现堆栈
- 一组寄存器指向栈顶元素 硬堆栈
- 主存中划分区域来实现 软堆栈 使用这种
- 都是用sp 寄存器
- 除了sp,没啥需要特别注意的,哦,一般用主存的方式,更大更便宜,速度也凑活,不够用谈速度没啥意义