加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 06:15:17 所属栏目:百科 来源:网络整理
导读:1、什么是编译地址?什么是运行地址?? ? ? 32 位的处理器,它的每一条指令是4 个字节,以4 个字节存储顺序,进行顺序执行,CPU?是顺序执行的,只要没发生什么跳转,它会顺序进行执行,编译器会对每一条指令分配一个?编译地址,这是编译器分配的,在编译过程
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+运行地址,而运行?地址是算出来的。?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读