Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6554
  • 博文数量: 6
  • 博客积分: 190
  • 博客等级: 入伍新兵
  • 技术积分: 70
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-21 11:49
文章分类

全部博文(6)

文章存档

2011年(6)

我的朋友
最近访客

分类:

2011-04-10 15:26:33




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

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
例程:

_TEXT_BASE: 
.word TEXT_BASE /*uboot映像在SDRAM中的重定位地址,我 设置为0x33f80000 */ 

  .globl _armboot_start 
_armboot_start:
 .word _start /*_start是程序入口,链接完 毕它的值应该是0x33f80000=TEXT_BASE*/ 

/* 这句话的意思应该是在_armboot_start标号处,保存了_start的值,也就是说,_armboot_start是存放_start的地址, 该地址对应的存储单元内容是0x33f80000*/  

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 的话那就一切都错了!

阅读(819) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:转:u-boot-2010.06 源码分析<1>--总体结构

给主人留下些什么吧!~~