与偏移地址相对应的还有基地址和有效地址
有效地址=基地址+偏移地址
一个例子:比如在一个城市中要定位一个人的地址,可以把街道看做基地址,门牌号看做偏移地址,那么有效地址就是街道加门牌号(某某街多少号)。
其实这个问题我觉得跟什么比较像呢?我觉得就和我们一般用的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课的期末报告,靠这个来打期末总分的
总之,有各种理由导致了偏移地址这个概念的生成!
网友评论