本文共 591 字,大约阅读时间需要 1 分钟。
什么是存储地址呢?我们知道,我们编写的C代码,会被编译成汇编指令,进一步变成机器码,最后加载到arm的内存中。也就是说我们的汇编指令被存储在内存之中,而指令对应的地址,就是他的“存储地址”。其实“存储地址”的值,一直由pc这个寄存器所记载着。想改变“存储地址”的值直接改变pc好了
再说链接地址,他是指令应该运行的地方,也就是说,正常情况下指令的存储地址,和链接地址应该是相同的。不然程序会出错。链接地址是在程序一开始链接时就已经确定了,目的就是规划整个程序,比如说这个全局变量放在哪?那个静态又搁在哪?事前就确定好,那么到时程序访问的时候,就可以按照原先说好的位置去找他,那么这个“链接地址”就是我所说的“原先说好的位置”,而“存储地址”,就是“实际存在的位置”。
但是存在即使“链接地址”和“存储地址”不一样,也不会出错的代码——位置无关码。例如一些相对跳转指令b,bl(首先他们得不会去访问一些全局变量或者是静态变量)他们只需要在当前位置加上偏移量即可,不需要一个确切的地址。也就是说他们压根用不到链接地址,那么自然也就不会出错了。
2440开发板的代码首先是存在于NandFlash,上电后NandFlash中前4K的代码,会被自动拷贝到arm片内内存中。pc寄存器初始值为0,从运行开始到跳转到内存中运行的这个过程,处理器运行的都是位置无关码,链接地址与存储地址并不相同。
转载地址:http://ahigi.baihongyu.com/