编译地址 运行地址 相对地址

原创 2012年03月29日 19:12:50
1、什么是编译地址?什么是运行地址? 

    32 位的处理器,它的每一条指令是4 个字节,以4 个字节存储顺序,进行顺序执行,CPU 是顺序执行的,只要没发生什么跳转,它会顺序进行执行,编译器会对每一条指令分配一个 编译地址,这是编译器分配的,在编译过程中分配的地址,我们称之为编译地址。 

     运行地址是指,程序指令真正运行的地址,是由用户指定的,用户将运行地址烧录到哪里, 哪里就是运行的地址。比如有一个指令的编译地址是0x5,实际运行的地址是0x200,如果 用户将指令烧到0x200 上,那么这条指令的运行地址就是0x200,当编译地址和运行地址不 同的时候会出现什么结果?结果是不能跳转,编译后会产生跳转地址,如果实际地址和编译 后产生的地址不相等,那么就不能跳转。C 语言编译地址都希望把编译地址和实际运行地址 放在一起的,但是汇编代码因为不需要做C 语言到汇编的转换,可以人为的去写地址,所以 直接写的就是他的运行地址,这就是为什么任何bootloader 刚开始会有一段汇编代码,因为 起始代码编译地址和实际地址不相等,这段代码和汇编无关,跳转用的运行地址。编译地址 和运行地址如何来算呢?假如有两个编译地址a=0x10,b=0x7,b 的运行地址是0x300,那 么a 的运行地址就是b 的运行地址加上两者编译地址的差值,a-b=0x10-0x7=0x3,a 的运行 地址就是0x300+0x3=0x303。 假设uboot 上两条指令的编译地址为a=0x33000007 和b=0x33000001,这两条指令都落在 bank6 上,现在要计算出他们对应的运行地址,要找出运行地址的始地址,这个是由用户烧录进去的,假设运行地址的首地址是0x0,则a 的运行地址 为0x7,b 为0x1,就是这样算出来的。 


2、什么是相对地址? 


以NOR Flash 为例,NOR Falsh 是映射到bank0 上面,SDRAM 是映射到bank6 上面,uboot 和内核最终是在SDRAM 上面运行,最开始我们是从Nor Flash 的零地址开始往后烧录,uboot 中至少有一段代码编译地址和运行地址是不一样的,编译uboot 或内核时,都会将编译地址 放入到SDRAM  中,他们最终都会在SDRAM  中执行,刚开始uboot 在Nor Flash 中运行,运 行地址是一个低端地址,是bank0 中的一个地址,但编译地址是bank6 中的地址,这样就会 导致绝对跳转指令执行的失败,所以就引出了相对地址的概念。那么什么是相对地址呢?至 少在bank0 中uboot 这段代码要知道不能用b+编译地址这样的方法去跳转指令,因为这段 代码的编译地址和运行地址不一样,那如何去做呢?要去计算这个指令运行的真实地址,计 算出来后再做跳转,应该是b+运行地址,不能出现b+编译地址,而是b+运行地址,而运行 地址是算出来的。 

版权声明:原创文章,请注明出处。

相关文章推荐

《C编译原理》程序的加载地址与运行地址

一、程序的加载地址 程序被加载到RAM中的地址;这个不能由编译器决定、也就是不能由编译参数决定!由该模块的调用者决定! 因为程序在nandflash中不能运行,所以需要加载到RAM中。 一般我们必须在...

运行地址和加载地址

运行地址和加载地址           在连接目标代码时,会提到运行地址和加载地址。这两者有什么区别呢?           加载时地址就是程序放置的地址,运行地址就是程序定位的绝对...
  • ce123
  • ce123
  • 2011-11-23 18:07
  • 11639

代码的加载地址与运行地址

下面内容是技术讨论群里的读者的提问: 问: 程序下载到NOR中,在ADS中加载地址却是0x30000000,是SDRAM的地址,难道是调试器自动搬运的? 答: 一个地址是加载 地址一个是运...

加载地址与运行地址

要是做过uboot开发,就是会遇到过运行地址与加载地址的概念,确实比较抽象与模糊,网上很多解释都是说运行地址就是加载地址,还有就是他们有很大的关系。其实他们根本一点关系都没有,但是很巧合他们很多时候都...

编译地址与运行地址

(1)什么是编译地址   32位的处理器,它的每一条指令是4个字节,以4个字节存储顺序,进行顺序执行,CPU是顺序执行的,只要没发生什么跳转,它会顺序进行执行行, 编译器会对每一条指令分配一个编译地...

s5pv210学习<四>定位程序运行地址

一、程序运行 我们知道,任何程序都是运行在内存中的,而内存其实就是一段地址序列而已,每一个程序在运行的时候,系统都会把程序搬移到内存去运行,下面的程序我们要来实现一下如何搬移程序,以及运行。...

linux基础之uboot load address、entry point、 bootm address以及kernel运行地址的意义及联系

按各地址起作用的顺序,uboot引导linux内核启动涉及到以下地址: load address: entry point: 这两个地址是mkimage时指定的 bootm ad...
  • xqmoo8
  • xqmoo8
  • 2012-04-01 10:54
  • 5675

编译地址 运行地址 相对地址

32 位的处理器,它的每一条指令是4 个字节,以4 个字节存储顺序,进行顺序执行,CPU 是顺序执行的,只要没发生什么跳转,它会顺序进行执行,编译器会对每一条指令分配一个 编译地址,这是编译器分配的,...

uboot load address、entry point、 bootm address以及kernel运行地址的意义及联系

按各地址起作用的顺序,uboot引导linux内核启动涉及到以下地址: 1.      load address: 2.     entry point: 这两个地址是mkim...

代码的加载地址与运行地址

下面内容是技术讨论群里的读者的提问: 问: 程序下载到NOR中,在ADS中加载地址却是0x30000000,是SDRAM的地址,难道是调试器自动搬运的? 答: 一个地址是加载 地址一个是运...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)