原创 u-boot: _start, _armboot_start, .word等概念的理解

2009-7-13 18:00 3962 6 7 分类: MCU/ 嵌入式

关于u-boot中 _start, _armboot_start, .word等概念的理解


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
例程:
  .globl _armboot_start
_armboot_start:
 .word _start


 ldr r2, _armboot_start
链接后查看:
a1700044 <_armboot_start>:
a1700044: a1700000 .word 0xa1700000
a1700074: e51f2038 ldr r2, [pc, #-56] ; a1700044 <_armboot_start>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


1. 汇编语言中所有定义的标号指的都是绝对地址, 对标号的引用也就是绝对地址的引用.
   _armboot_start: 相当于直接的 #define 定义, 对_armboot_start的引用就是直接的替换操作.


2. 汇编中没有变量的概念, 但是使用LDR指令可以实现类似C中变量的功能.
   比如上程序中,
 ldr r2, _armboot_start   [1]
   与
 ldr r2, =_armboot_start   [2]
   是不同的, [1]可以理解为将变量_armboot_start的值即_start送入r2.
             [2]则是将_armboot_start所在的地址送入日r2. 相当于C中的&_armboot_start(取地址操作).


3. 汇编中的.word其实是变相的实现了C的变量功能, 只是在使用上值得大家注意.


4. u-boot中start.S做了如下的多处定义:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_TEXT_BASE:
 .word TEXT_BASE


  .globl _armboot_start
_armboot_start:
 .word _start


  .globl _bss_start
_bss_start:
 .word __bss_start


  .globl _bss_end
_bss_end:
 .word _end
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   其实就是一个变量的定义, 这样在汇编中通过ldr实现了变量的操作. 而当在C语言中作为变量引用时又很方便.
   比如lib_arm/board.c中start_armboot()函数中对u-boot镜像大小的计算:
 monitor_flash_len = _bss_start - _armboot_start;
   这在C语言中就是简单的变量操作,但是如果直接使用 __bss_start-_start 的话那就一切都错了!


 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户50595 2010-7-20 14:13

我觉得上面描述有点不妥,标号相当于指针,[1]相当于r2=*_armboot_start, [2]相当于r2=_armboot_start;
相关推荐阅读
用户1156376 2014-08-18 17:23
[博客大赛]MDK下代码的分段管理 续3
继续写点分段管理的问题。 设计思想主要是设计一个通用的BSP,固化后只需要修改APP代码就可以,这适用于远程升级的系统或是进行二次开发的系统。 考虑到编译器链接的时候会把没有使用的代码段(...
用户1156376 2014-02-27 18:14
Freescale MCU SPI
Freescale S12 SPI: 0. 以下所述为查询模式使用SPI 1. SPI控制器有两个中断, 数据发送(SPTEF)和数据接收(SPIF) 2. 数据发送(SPTEF)标志...
用户1156376 2014-02-26 09:17
Freescale MCU摘记
仅用于记录Freescale的点滴记录: 1. 把AD口用作IO口的方法: 除了正常的设置外,还需要把 ATDDIEN 寄存器写为0xFF, 这样使能了数字IO。否则默认为AD输入。 ...
用户1156376 2013-12-14 11:33
[STM32]MDK下代码的分段管理 续2
前文所述的代码分段,限定比较大,对于使用 #pragma arm section code=".ARM.__at_0x8100000" 固定地址的方式,每个文件都需要指定不同的地址以区别。...
用户1156376 2013-12-09 18:12
[STM32]MDK下代码的分段管理
编译大型的程序时,可能某一段代码固定之后不再改变(比如BSP),而应用部分经常修改。在这种情况下,如果使用在线升级或是Bootloader的方式升级程序时,你就觉得每次升级的代码有一部分是重复的(...
用户1156376 2012-10-14 09:10
【uCOS-III移植笔记】OS启动过程
(1) 关闭系统中断 (2) CPU_Init(); 初始化CPU服务(时间戳、中断时间测量、CPU信息初始化等) (3) OSInit(); 初始化系统(系统变量、系统任务...
EE直播间
更多
我要评论
1
6
关闭 站长推荐上一条 /3 下一条