调一些代码遇到的问题,总结一下。

先铺垫一下,有这个一个问题:

圈6如何找到圈8 ?
答案a:找出圈8相对于圈6的位置,即圈6后边第二个。这个就是位置无关了。有一个神器就是“ADRL”,它能做到这一点。
答案b: 找出圈8的绝对地址,即地址3。找的办法可以是这样的:位置=8 - 5。这样就可以找出绝对地址3了。这个可以先用"LDR"记下圈8的编号(即8),然后减去圈5的编号(即5)得到的就是地址3。
上边只是理解,具体的体现答案a是在《嵌入式应用开发完全手册》光盘代码中用汇编对SDRAM初始化用到的。代码如下:

b是在u-boot-2009.11中lowlevel_init.S用汇编对SDRAM进行初始化时出现的。代码如下:

通过反汇编也可以看到区别:

(adrl可以看出得到的就是一个相对地址)

(ldr直接得到的是一个不正确的编号,再减去链接地址0x30000000,就可以是正确的绝对地址了)
而我的问题是用了答案b,却不完整,没有对减去链接起始地址。导致出现了问题。不过也学到的东西。不过对于答案a和答案b,我现在不能说哪个方法好一点,只是都能用,u-boot中为什么用看似复杂的方法应该有它的原因。
本文探讨了ARM汇编语言中位置无关代码的两种实现方式:使用ADRL指令和LDR结合减法计算绝对地址。通过对这两种方法的具体实例分析,解释了它们在嵌入式系统内存初始化过程中的应用。

2820

被折叠的 条评论
为什么被折叠?



