您现在的位置: 主页 > MCU > 单片机应用 > TQ2440之uboot---6.start.S中relocate部分分析,adr与ldr区别 -
本文所属标签:
为本文创立个标签吧:

TQ2440之uboot---6.start.S中relocate部分分析,adr与ldr区别 -

来源: 网络用户发布,如有版权联系网管删除 2018-09-08 

[导读]
在u-boot的start.S中有这么一段relocate: /*relocate U-Boot to RAM */ adr r0, _start /*r0 800b4: e51f107cldr r1, [pc, #-124]字面意思是要取[pc, #-124]地址中的值,也就是要取_TEXT_BASE这个地址

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

本文引用地址: http://www.21ic.com/app/mcu/201806/764776.htm

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 :

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运行时,实际上是在sram的0x0地址运行,_start的地址是0x0;而从0x33d80000处运行时,此时_start的值是0x33d80000。

ldr r1, _TEXT_BASE ==>800b4: e51f107cldr 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.




              查看评论 回复



嵌入式交流网主页 > MCU > 单片机应用 > TQ2440之uboot---6.start.S中relocate部分分析,adr与ldr区别 -
 

"TQ2440之uboot---6.start.S中relocate部分分析,adr与ldr区别 -"的相关文章

网站地图

围观()