您的位置:首页 > 其它

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

2013-09-10 16:41 302 查看
例程:

  .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 的话那就一切都错了!
转自:http://tan.bai.blog.163.com/blog/static/386039522010101811332589/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  arm 汇编 u-boot