有效地址=基地址+偏移地址
一个例子:比如在一个城市中要定位一个人的地址,可以把街道看做基地址,门牌号看做偏移地址,那么有效地址就是街道加门牌号(某某街多少号)。
其实这个问题我觉得跟什么比较像呢?我觉得就和我们一般用的Linux有相对地址也有绝对地址的概念的原因,在很多情况下相对地址能解决很多移植问题
为什么会有这个概念,来举个例子,就跟我们在做ppt一样,一般把ppt有关的ppt中用到的一些视频文件音频文件一起放在一个文件夹里面进行打包,这样ppt中资源的查找路径就是ppt所在的当前目录之中,但是如果你在引用资源之中改成了绝对地址比如D:/tmp/saocaozuo.avi 这样你把将ppt拷到另外的电脑要进行演讲时候对应的会去查找D:/tmp/之中有没有saocaozuo.avi,结果那电脑甚至连D盘这个盘符对应的硬盘都没有,那么你只有选择懵逼了,所以程序打包起来之后一般是用到的相对路径这么一个概念。
那么就可以解释了:设计之初不直接用绝对地址,这样的话可以使得程序可以在内存的任意位置运行,而不用依赖于绝对地址。
更深的本质还有一个用小资源就能去表示一个更大的数,这也是我之前ARM嵌入式系统课上面学的
,看上图:B指令在机器之中它机器码的格式可以这样的来表示;
可以看出用来表示地址的就只剩下24位了,但是一般在32位系统之中内存最大能达到2^32Bit=4GByte也就是要用32位数才能表示的完跳转的目的地址;
那么怎么办呢?
如何用24位来表示本来应该用26或更多位的32位才能完全表示的数呢?
PC(new) = PC(now) + (SignExtend(signed_imm24)<<2)
B <目标地址/目标的标号(本质也是地址)>
将指令中24位带符号的补码立即数扩展为32(扩展其符号位);将此32位数左移两位;将得到的值加到pc寄存器中,即得到跳转的目标地址。
很深奥是吧?确实,所以说这个课题也是我们arm课的期末报告,靠这个来打期末总分的
总之,有各种理由导致了偏移地址这个概念的生成!
0035H,00A0H,2314H,1FD0H,23175H。逻辑地址由16位二进制数(4位十六进制数)的段地址和偏移地址组成。
段首地址:5位十六进制数中的末尾1位十六进制数为0的地址,即可作为段首地址
段地址是指每一段的段首地址的高4位十六进制数,通常被保存在某个段寄存器中。
偏移地址则是指在段内相对于段首地址的偏移值,也取4位十六进制数。
偏移地址(OffsetAddress)或有效地址(EA,EffectiveAddress)计算方法物理地址计算方法8086/8088有20条地址线,它的直接寻址能力为1MB。也就是在一个系统中可以有多达1MB的存储器,地址从00000H—FFFFFH。
举个例子,你要告诉别人你藏的东西埋在树林里哪个地方,会这么说:从这儿过去,第5棵大树再向前2米。
这里,“第5棵大树”是一个粗的框架,“向前2米”则是在这个框架内以框架为基准的一个偏移量。
8086/8088
cpu
访问内存时,内存地址由两个十六位的二进制数构成,即:段地址+偏移地址。
段地址就是上面例子中的框架,偏移地址就是框架内相对框架基准的一个局部偏移量。
“段地址+偏移地址”这种地址表示方式,称为逻辑地址表示。若要转换成真实的内存物理地址,方法是:段地址x16+偏移地址。
8086/8088中之所以要用逻辑地址,是因为物理地址的长度(20位)超过了处理器的字长(16位),无法一次完整表示,不得不分成两部分。同时这样处理还带来了可以方便程序动态内存定位的好处。