历史上的今天
返回首页

历史上的今天

今天是: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.


推荐阅读

史海拾趣

C&D公司的发展小趣事

随着国内市场的逐渐饱和,C&D公司开始积极拓展海外市场。公司制定了国际化战略,通过参加国际展会、建立海外销售网络等方式,不断开拓国际市场。同时,C&D公司还针对不同地区的市场需求,推出定制化的产品和服务,进一步提升了其在国际市场中的竞争力。

Fuji Electric Co Ltd公司的发展小趣事

随着国内市场的逐渐饱和,C&D公司开始积极拓展海外市场。公司制定了国际化战略,通过参加国际展会、建立海外销售网络等方式,不断开拓国际市场。同时,C&D公司还针对不同地区的市场需求,推出定制化的产品和服务,进一步提升了其在国际市场中的竞争力。

ATO SOLUTION公司的发展小趣事

随着公司规模的扩大,ATO SOLUTION公司开始实施全球化战略布局。公司先后在多个国家和地区设立了研发中心和生产基地,充分利用当地资源和市场优势,提升整体竞争力。同时,公司还加强了与国际知名企业的合作,共同推动电子行业的发展和创新。

GWM Associates公司的发展小趣事
使用稳定的电源,并加入滤波电路以减小电源噪声对放大器的影响。
Heidenhain Corp公司的发展小趣事

随着电子行业的快速发展,对高精度电子元件的需求日益增长。海德汉公司凭借其iTNC系列数控系统的高精度控制能力,成为众多电子元件制造商的首选合作伙伴。某知名电子元件生产商在引入海德汉iTNC 530数控系统后,成功实现了微型电子元件的精密加工,将加工精度提升至微米级,大大提高了产品的质量和市场竞争力。这一合作不仅巩固了海德汉在高精度加工领域的领先地位,也推动了电子行业向更高精度、更高质量方向发展。

ELMEC Technology Of America Inc公司的发展小趣事

在电子行业,技术创新是企业持续发展的关键。为了保持竞争力,ELMEC不断投入研发资金,引进高端人才,加强技术创新。他们与多所知名大学和研究机构建立合作关系,共同开展前沿技术研究。这些努力使得ELMEC在人工智能、物联网等新兴领域取得了多项重要突破,为公司的发展注入了新的活力。

问答坊 | AI 解惑

2007年最令人遗憾的九项新兴技术

本帖最后由 jameswangsynnex 于 2015-3-3 19:58 编辑 当一个产品或者一种技术仍处在新兴阶段的时候,它还不能说是彻底失败。在功能和使用环境方面,这些技术在许多情况下仍在寻找自己的最佳卖点。  不过,虽然现在说某些技术是彻底的失败有些为 ...…

查看全部问答>

考一下新人,基础知识。不知几人能答上。

高手请嘴下留情。 四位二进制数运算 为什么 (-3)+(-6)=(+7)…

查看全部问答>

IGBT上桥臂缓冲电路发热

做了一个IGBT的缓冲电路,可是发现RD发热严重,这会是什么原因? 1.C选择不对? 2.工作条件是否有问题?…

查看全部问答>

9261在 linux下触摸屏驱动的问题

采用at91sam9261+ADS7843e控制触摸屏 在linux下的驱动修改完成后,现在用一个小测试程序来读触摸屏的坐标,但是读出来的坐标值不对,按说应该是240*320的屏幕,但是读出来的横竖坐标都只在一个固定值的上下5个数字之间变动。 可以肯定测试程序没 ...…

查看全部问答>

时钟芯片显示问题

我用C51读取DS1687(时钟芯片)中的时间,然后送到16*48点阵LED上显示; 可是每次上电,只能显示当前的读取时间,时间并不自动更新;相关的控制寄存器我都已经设置了, 怎么弄也不更新. 请教各位高手,帮忙指点一下,分析分析原因,给点思路.   &nb ...…

查看全部问答>

请教关于ARM_GPIO上拉电阻问题

请教各位 GPIO的上拉电阻的作用除了驱动能力会增强外 当设置GPIO为输入状态时, 产品做高温实验,温度升高造成了GPIO检测的输入状态不对, 是否是上拉电阻的原因??? …

查看全部问答>

什么书好。学驱动开发

我只会VC。我想学文件驱动开发,网络驱动开发。总之是基于软件的驱动开发。我应该要看什么书。有什么必须学的好书吗。推荐下,…

查看全部问答>

电机外壳再次接地线,主要目的是什么?

有一个现场,功率稍微大的电动机,电机接线盒里,电缆过来的N 线已经接地,(盒内接地端子)但是电机外壳仍要和接地网干线再次用接地导线相连,目的是什么?…

查看全部问答>

在EK-STM32F学习套件上实现了USB-DFU设备功能

首先在ST官网上下载了STM32的USB开发套件地址:http://www.st.com/stonline/products/support/micro/files/um0424.zip由于此开发套件基于ST的官方开发板,与EK-STM32F的电路有所不同。比较了一下,不同之处在于1, 官方的开发套件使用PD. ...…

查看全部问答>

电机控制器

大家好:有谁知道电机控制器是怎么开发的吗?或是有什么好的参考资料~应该如何入手?…

查看全部问答>