数据寻址——偏移寻址

简介: 数据寻址——偏移寻址

偏移寻址


相对寻址、基址寻址、变址寻址都属于偏移寻址。



三种偏移地址区别:


但是他们之间还是有区别的,在于偏移的“起点”不一样


  • 基址寻址:以程序的起始存放地址作为“起点”


  • 变址寻址:程序员自己决定从哪里作为“起点”


  • 相对寻址:以程序计数器PC所指地址作为“起点”


基址寻址


基址寻址:将CPU中基址寄存器(BR)的内容加上指令格式中的形式地址A,而形成操作数的有效地址,即EA=(BR)+A。


下图是两种基址寄存器的构成方式:



问题:(b)要用几个bit指明寄存器?


根据通用寄存器总数判断


假如通用寄存器有八个,因为 23=8 在,用3个bit 就可以指明 0~7 共八个数


基址寻址的作用


优点


优点:便于程序“浮动”,方便实现多道程序并发运行


扩充一下哈:


优点:


  1. 可扩大寻址范围(基址寄存器的位数大于形式地址A的位数);


  1. 用户不必考虑自己的程序存于主存的哪一空间区域,故有利于多道程序设计;


  1. 可用于编制浮动程序(整个程序在内存里边的浮动) 。


如下图是对一个简单程序的基址寻址图解



注意:


基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定。在程序执行过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量)。


当采用通用寄存器作为基址寄存器时,可由用户决定哪个寄存器作为基址寄存器,但其内容仍由操作系统确定。


变址寻址


变址寻址:有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容相加之和,即EA= (IX)+A,其中IX可为变址寄存器(专用),也可用通用寄存器作为变址寄存器 。



注意:


变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户改变(IX作为偏移量),形式地址A不变(作为基地址) 。


  • 这里对比一下基址寄存器中BR与A的执行过程:


基址寻址中,BR保持不变作为基地址,A作为偏移量


变址寻址的作用


我们先探讨一个问题:


当我们在用高级语言进行编写循环语句的时候,我们看着是很简单的,就像下面的C语言循环语句。


for(int i=0; i<10; i++){
  sum += a[i];
}


但是再计算机中他是这个样子的,



那么是时候召唤变址寻址了!!!!!


在数组处理过程中,可设定A为数组的 首地址,不断改变 变址寄存器IX的内容,便可很容易形成数组中任一数据的地址,特别适合编制循环程序。


我们将上面的改成变址寻址就是下图这个样子



优点


在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可很容易形成数组中任一数据的地址,特别适合编制循环程序。


注意:


变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户改变(作为偏移量),形式地址A不变(作为基地址) 。


补充:基址&变址复合寻址


实际应用中往往需要多种寻址方式复合使用(可理解为复合函数)



相对寻址


相对寻址:把程序计数器PC的内容加上指令格式中的形式地址A而形成操作数的有效地址,即EA=(PC)+A,其中A是相对于PC所指地址的位移量,可正可负,补码表示 。



相对寻址的作用


我们在探讨一下:还是刚才的程序


想一下:如果代码越来越多,我们要挪动for循环的位置呢?只通过直接和变址寻址还能正确访问地址吗?



怎么解决这个问题呢?我么可以在此基础上+上PC值,就能正确访问了,如下图所示。



优点:


操作数的地址不是固定的,它随着PC值的变化而变化,并且与指令地址之间总是相差一个固定值,因此便于程序浮动(一段代码在程序内部的浮动)。


相对寻址广泛应用于转移指令


小结



*扩展:硬件如何实现数的“比较”


相关文章
|
存储 芯片 内存技术
DRAM集中刷新,分散刷新,异步刷新的区别
DRAM集中刷新,分散刷新,异步刷新的区别
2534 0
|
存储 缓存 算法
409操作系统学习笔记——内存管理(二)
409操作系统学习笔记——内存管理
3056 1
409操作系统学习笔记——内存管理(二)
uniapp的touchstart与click
uniapp的touchstart与click
949 0
|
消息中间件 canal 缓存
项目实战:一步步实现高效缓存与数据库的数据一致性方案
Hello,大家好!我是热爱分享技术的小米。今天探讨在个人项目中如何保证数据一致性,尤其是在缓存与数据库同步时面临的挑战。文中介绍了常见的CacheAside模式,以及结合消息队列和请求串行化的方法,确保数据一致性。通过不同方案的分析,希望能给大家带来启发。如果你对这些技术感兴趣,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!
795 6
项目实战:一步步实现高效缓存与数据库的数据一致性方案
|
存储 Unix 程序员
计算机组成原理(5)----指令系统(2)
计算机组成原理(5)----指令系统
3360 2
|
Oracle 安全 Java
安卓逆向 -- Unidbg环境搭建篇
安卓逆向 -- Unidbg环境搭建篇
1384 3
|
机器学习/深度学习 算法框架/工具 Python
基于深度学习的手写数字识别项目GUI(Deep Learning Project – Handwritten Digit Recognition using Python)
基于深度学习的手写数字识别项目GUI(Deep Learning Project – Handwritten Digit Recognition using Python)
877 0
|
存储 算法 程序员
操作系统(12)----页面分配策略
操作系统(12)----页面分配策略
887 1
|
存储 缓存 网络协议
|
消息中间件 网络协议 算法
网络协议的重要性与应用:理解进程间通信和网络分层结构(上)
学习网络协议的关键是了解其分层结构。在计算机网络中,我们使用的是OSI标准模型和TCP/IP网络模型。这些模型将网络通信划分为多个层级,每个层级都有不同的功能和作用。在本章节中,我们主要讲解了TCP/IP网络模型的前三层:应用层、传输层和网络层。后面的数据链路层和物理层将在下一篇文章中进行详细讲解
1437 0
网络协议的重要性与应用:理解进程间通信和网络分层结构(上)