bootloader---7.start.S中relocate部分分析,adr与ldr区别

原创 2016年08月29日 13:51:04

u-bootstart.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 during debug         */

       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:

       …….

比较r0r1,如果不相等就把代码从flashcopyram中去。但问题是单从adrldr这两条指令上怎么就能判断出r0r1不相等呢?

 

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

33d800b0 :

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

 

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

pc-184处的标号的地址,并把这个地址赋给r0,而_start是随着加载地址的不同而变化的,所以r0是变化的。当从nandflash运行时,实际上是在sram0x0地址运行,_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.

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

版权声明:本文为博主原创文章,转载请注明出处。

LDR与ADR区别(转)

LDR与ADR区别(转) 在资料中,ADR的定义为:小范围的地址读取伪指令,ADR指令将基于PC相对偏移的地址值读取到寄存器中,在编译源程序时ADR伪指令被编译器替换成一 条合适的指令。...
  • zhangwenjianqin
  • zhangwenjianqin
  • 2012年06月25日 16:33
  • 2472

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

在u-boot的start.S中有这么一段 relocate:                       /*relocate U-Boot to RAM       */        adr...
  • u013256622
  • u013256622
  • 2015年01月02日 23:25
  • 608

ARM指令 LDR 和 ADR的一些区别

LDR 是ARM中的指令,也是伪指令。当用 LDR r, =imd  // r 为寄存器, imd为立即数LDR 是一条伪指令。编译器会根据 立即数的大小,决定用 ldr 指令或者是mov或mvn指令...
  • zhou1232006
  • zhou1232006
  • 2011年01月16日 19:46
  • 13125

arm汇编指令之LDR 和 ADR的一些区别

arm汇编指令之LDR 和 ADR的一些区别
  • Ultraman_hs
  • Ultraman_hs
  • 2016年11月04日 18:58
  • 2265

ARM汇编指令:adr和ldr的前因后果

http://blog.sina.com.cn/s/blog_4b5210840100c80i.html 这两个都是伪指令:adr是小范围的地址读取伪指令,ldr是大范围...
  • Ray_ree
  • Ray_ree
  • 2015年09月01日 20:52
  • 1410

ADR与LDR伪指令

在学习ARM指令时,经常会对adr和ldr这两个命令产生疑惑,那他们究竟有什么区别呢?其实这两个都是伪指令:adr是小范围的地址读取伪指令,相于PC 寄存器或其它寄存器的小范围转移;ldr是大范围的读...
  • coder9999
  • coder9999
  • 2012年05月26日 17:58
  • 269

伪指令ADR和LDR的区别

1、一个事实:大部分指令是位置有关编码     a、位置无关编码(PIC,position independent code):汇编源文件被编码成二进制可执行程序时编码方式与位置(内存地址)无关...
  • waynewu919512
  • waynewu919512
  • 2015年07月12日 10:42
  • 574

ldr与adr区别

ldr与adr的区别 转自:http://coon.blogbus.com/logs/2738861.html         ldr     r0, _start         ...
  • mldxs
  • mldxs
  • 2013年12月02日 20:20
  • 597

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

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://www.blogbus.com/coon-logs/2738861.html         l...
  • gujintong1110
  • gujintong1110
  • 2015年03月13日 22:59
  • 828

ldr与adr的区别

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://coon.blogbus.com/logs/2738861.html        ldr     r0, _start ...
  • rockhard
  • rockhard
  • 2009年05月11日 02:23
  • 954
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:bootloader---7.start.S中relocate部分分析,adr与ldr区别
举报原因:
原因补充:

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