深入理解基址寻址和变址寻址

对基址寻址和变址寻址的理解

其实两者都是 一个定地址 + 一个变地址 来形成有效地址的

基址寻址
EA=(BS)+A
定地址:BS 变地址:A

基址寻址的应用场景是程序段的地址分配问题,方便实现多程序段之间的转移,这就是为什么说基址寻址在多道程序中极为有用。

操作系统或者说管理程序会给定BS的值,这对于用户是透明的也不能自定义,这个BS值就是某个程序段的起始地址。在多道程序中,存在程序之间的切换场景。此时,只需要操作系统更改BS的值为对应程序段的起始地址就可以实现。

其次,变地址A,也可以说是程序段中的逻辑地址,当加上BS的程序基址之后,就可以得到实际的物理地址,也就实现了逻辑地址到物理地址的映射。

变址寻址
EA=(IX)+A
定地址:A 变地址:IX

变址寻址最为经典的使用场景就是对数组元素的运算。我们都知道,访问数组元素一般使用for循环,采样数组下标+1的方式遍历数组。从形式是看也很直观,一个定地址+一个累加的变地址就可以满足要求。

实际上,从汇编语言的角度就很好理解了。假设数组元素有N个,要求N个数的累加和,有如下方法:
1.写N条语句,逐条累加
需要N条汇编语句实现
在这里插入图片描述
2.使用变址寻址
变址寄存器是用户可以自定义的,那么将形式地址A放入数组起始地址,变址寄存器IX就可以自定义累加。
在这里插入图片描述

初学的时候也有疑问
1.为什么变址寻址不能将IX设定为数组起始地址,A设定为累加值?
我的理解是:
IX是寄存器值,更改寄存器值是一个累加语句就能实现的。
A是一个直接地址/立即数,每改变一次意味着需要重写整个变址寻址指令,就像图1中需要写ADD D,ADD (D+1),ADD (D+N-1),这就导致需要更多的存储空间来存储指令。

2.变址寻址和基址寻址的实现原理本质上都一样,为什么还要有所区分?
这一点,从使用场景上来看比较好理解。基址寻址的BS寄存器对于用户来说是透明的,用户不能更改BS的值,也就不能将其当作数组起始地址来赋值。而这个特点刚好符合不能由用户修改的一些场景,比如程序段地址,在程序运行过程中是不允许更改的。

  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值