历史上的今天
今天是:2025年04月15日(星期二)
2018年04月15日 | TQ2440之uboot---6.start.S中relocate部分分析,adr与ldr区别
2018-04-15 来源:eefocus
在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 :
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: 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.
上一篇:LED裸程序
史海拾趣
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:58 编辑 当一个产品或者一种技术仍处在新兴阶段的时候,它还不能说是彻底失败。在功能和使用环境方面,这些技术在许多情况下仍在寻找自己的最佳卖点。 不过,虽然现在说某些技术是彻底的失败有些为 ...… 查看全部问答> |
|
采用at91sam9261+ADS7843e控制触摸屏 在linux下的驱动修改完成后,现在用一个小测试程序来读触摸屏的坐标,但是读出来的坐标值不对,按说应该是240*320的屏幕,但是读出来的横竖坐标都只在一个固定值的上下5个数字之间变动。 可以肯定测试程序没 ...… 查看全部问答> |
|
请教各位 GPIO的上拉电阻的作用除了驱动能力会增强外 当设置GPIO为输入状态时, 产品做高温实验,温度升高造成了GPIO检测的输入状态不对, 是否是上拉电阻的原因??? … 查看全部问答> |
|
有一个现场,功率稍微大的电动机,电机接线盒里,电缆过来的N 线已经接地,(盒内接地端子)但是电机外壳仍要和接地网干线再次用接地导线相连,目的是什么?… 查看全部问答> |
|
首先在ST官网上下载了STM32的USB开发套件地址:http://www.st.com/stonline/products/support/micro/files/um0424.zip由于此开发套件基于ST的官方开发板,与EK-STM32F的电路有所不同。比较了一下,不同之处在于1, 官方的开发套件使用PD. ...… 查看全部问答> |




