链接地址和存储地址
2015-08-24 21:06
260 查看
什么是存储地址呢?我们知道,我们编写的C代码,会被编译成汇编指令,进一步变成机器码,最后加载到arm的内存中。也就是说我们的汇编指令被存储在内存之中,而指令对应的地址,就是他的“存储地址”。其实“存储地址”的值,一直由pc这个寄存器所记载着。想改变“存储地址”的值直接改变pc好了
再说链接地址,他是指令应该运行的地方,也就是说,正常情况下指令的存储地址,和链接地址应该是相同的。不然程序会出错。链接地址是在程序一开始链接时就已经确定了,目的就是规划整个程序,比如说这个全局变量放在哪?那个静态又搁在哪?事前就确定好,那么到时程序访问的时候,就可以按照原先说好的位置去找他,那么这个“链接地址”就是我所说的“原先说好的位置”,而“存储地址”,就是“实际存在的位置”。
但是存在即使“链接地址”和“存储地址”不一样,也不会出错的代码——位置无关码。例如一些相对跳转指令b,bl(首先他们得不会去访问一些全局变量或者是静态变量)他们只需要在当前位置加上偏移量即可,不需要一个确切的地址。也就是说他们压根用不到链接地址,那么自然也就不会出错了。
2440开发板的代码首先是存在于NandFlash,上电后NandFlash中前4K的代码,会被自动拷贝到arm片内内存中。pc寄存器初始值为0,从运行开始到跳转到内存中运行的这个过程,处理器运行的都是位置无关码,链接地址与存储地址并不相同。
再说链接地址,他是指令应该运行的地方,也就是说,正常情况下指令的存储地址,和链接地址应该是相同的。不然程序会出错。链接地址是在程序一开始链接时就已经确定了,目的就是规划整个程序,比如说这个全局变量放在哪?那个静态又搁在哪?事前就确定好,那么到时程序访问的时候,就可以按照原先说好的位置去找他,那么这个“链接地址”就是我所说的“原先说好的位置”,而“存储地址”,就是“实际存在的位置”。
但是存在即使“链接地址”和“存储地址”不一样,也不会出错的代码——位置无关码。例如一些相对跳转指令b,bl(首先他们得不会去访问一些全局变量或者是静态变量)他们只需要在当前位置加上偏移量即可,不需要一个确切的地址。也就是说他们压根用不到链接地址,那么自然也就不会出错了。
2440开发板的代码首先是存在于NandFlash,上电后NandFlash中前4K的代码,会被自动拷贝到arm片内内存中。pc寄存器初始值为0,从运行开始到跳转到内存中运行的这个过程,处理器运行的都是位置无关码,链接地址与存储地址并不相同。
相关文章推荐
- Windows 安装bugzilla
- KMP HDOJ 4300 Clairewd's message
- Spring Boot 内嵌Tomcat的端口号的修改
- 计划doing.....
- Failed to install metadata only whitespace content allowed before start tag and not \u0
- POJ 3522 生成树(kruskal)
- web.xml配置
- NSTimer 的用法
- FORM表单新增的一些特性
- List Feature
- jQuery学习笔记--标签切换
- 魅蓝note如何进行安卓开发调试
- Tomcat 7 域名访问配置一
- POJ 2492 A Bug's Life(种类并查集 + 偏移量)
- Android的常用基本控件ImageView、ListView
- 45.数据库
- python把str转换为int
- Linux命令之目录管理类命令:mkdir, rmdir, tree, dirname, basename
- Button属性
- poj 2686 Traveling by Stagecoach【状态压缩】