u-boot start.S中relocate部分分析,adr与ldr区别

在u-boot的start.S中有这么一段

relocate:                       /*relocate U-Boot to RAM       */

       adr   r0, _start        /*r0 <- current position of code   */

       ldr   r1, _TEXT_BASE         /* test if we run from flash or RAM */

       cmp     r0, r1                  /* don't reloc duringdebug         */

       beq     clear_bss

       ldr   r2, _armboot_start

       ldr   r3, _bss_start

       sub  r2, r3, r2        /*r2 <- size of armboot            */

       bl  CopyCode2Ram      /*r0: source, r1: dest, r2: size */

clear_bss:

       …….

比较r0和r1,如果不相等就把代码从flash中copy到ram中去。但问题是单从adr和ldr这两条指令上怎么就能判断出r0和r1不相等呢?

 

既汇编搞不定那就反汇编了,汇编以上代码可以看出这两个指令有不同之处

33d800b0 <relocate>:

33d800b0:  e24f00b8    sub r0, pc, #184    ; 0xb8

33d800b4:  e51f107c    ldr r1, [pc, #-124] ;33d80040 <_TEXT_BASE>

33d800b8:  e1500001    cmp r0, r1

33d800bc:  0a000003    beq 33d800d0 <clear_bss>

 

adr   r0, _start ==> 33d800b0:   e24f00b8    sub r0, pc, #184    ; 0xb8

取pc-184处的标号的地址,并把这个地址赋给r0,而_start是随着加载地址的不同而变化的,所以r0是变化的。当从nandflash运行时,实际上是在sram的0x0地址运行,_start的地址是0x0;而从0x33d80000处运行时,此时_start的值是0x33d80000。

 

ldr   r1, _TEXT_BASE ==>800b4:   e51f107c   ldr r1, [pc, #-124]

字面意思是要取[pc, #-124]地址中的值,也就是要取_TEXT_BASE这个地址中的值,无论如何链接_TEXT_BASE的地址会变,但是_TEXT_BASE地址处的值TEXT_BASE不变。这条指令就是把_TEXT_BASE的值也就是 .word       TEXT_BASE 赋给r1,既r1=TEXT_BASE=0x33d80000。 这条指令跟程序跑在什么位置没有关系,只要定义了TEXT_BASE, 那么此处r1=TEXT_BASE.

(啰嗦了这么多,希望下一次看的时候自己能明白)。


原文地址:http://blog.chinaunix.net/uid-26009923-id-3188307.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值