您的位置:首页 > 其它

arm汇编标号.globel和.word解释

2014-12-15 15:16 162 查看
原文地址:http://blog.csdn.net/kuangdoushi/article/details/9315963

bootloader的目标:启动内核

1、从Flash上把内核读入内存

a、能读Flash

b、初始化内存 时钟 其他

2、启动

a、设置参数

b、跳转执行

最简单的bootloader的编写步骤:

1. 初始化硬件:关看门狗、设置时钟、设置SDRAM、初始化NAND FLASH

2. 如果bootloader比较大,要把它重定位到SDRAM

3. 把内核从NAND FLASH读到SDRAM

4. 设置"要传给内核的参数"

5. 跳转执行内核

地址的确定:

mov r0, #0 //传参数

ldr r1, =_start //这个是链接地址即就是第一个标号

ldr r2, =__bss_start//

sub r2, r2, r1

bl copy_code_to_sdram

下面是从以下博客摘录

/article/7480314.html

http://sdnydubing.blog.163.com/blog/static/13747057020112904958830/

解释:.globl _start

.globl指示告诉汇编器,_start这个符号要被链接器用到,所以要在目标文件的符号表中标记它是一个全局符号(在第 5.1 节 “目标文件”详细解释)。

_start就像C程序的main函数一样特殊,是整个程序的入口,链接器在链接时会查找目标文件中的_start符号代表的地址,把它设置为整个程序的入口地址,

所以每个汇编程序都要提供一个_start符号并且用.globl声明。如果一个符号没有用.globl声明,就表示这个符号不会被链接器用到。

解释:_bss_start:

.word __bss_start

word expression就是在当前位置放一个word型的值,这个值就是expression

举例来说,

_rWTCON:

.word 0x15300000

就是在当前地址,即_rWTCON处放一个值0x15300000

感觉一定要理解一些基本的概念,然后在看懂汇编的基础上,再分析uboot的流程。

1.关于汇编的语法

这里有两套汇编的语法:分为ARM公司的标准ARM汇编语言和GNU对ARM支持的GNU ARM汇编。ARM标准汇编语言即ARM公司的开发工具ADS里用的汇编语言;GNU汇编即在LINUX下用GCC编译的汇编。两者语法有少许差异。因此,通常我们下载的LINUX下的ARM接口代码放到ADS下是不能编译通过的,需要进行少许修改。

GNU AS语法即AT&T汇编语法,uboot用到的语法。

2.标签的含义

As代码

.globl _start

_start: b reset

标签就是在某行程序代码前作一个标记,标签代表的是这行代码的地址。

As代码

.globl _armboot_start

_armboot_start:

.word _start

.word expression就是在当前位置放一个word型的值,这个值就是expression ,此处的含义就是建立一个全局标签_armboot_start,

在这个位置上放置_start的值(可以这样理解,_armboot_start是一个地址,这个地址中的内容是_start),则下面的语句会把地址_armboot_start处

的内容(_start)装载到r2中。

As代码

ldr r2, _armboot_start

这样做的目的是因为LDR指令的格式为:LDR{条件} Rd, <地址>。

3..word 0x0badc0de

含义:保留一个字,初始化一下。实际的值应该在运行时计算出来。(badcode吗,呵呵)。

ldr r1, _rWTCON

_rWTCON:

.word 0x15300000

这两个语句是不是说把地址0x1530 0000 上的内容传递到r1? 而不是把0x1530 0000 放到r1 ?

不是把地址0x1530 0000 上的内容传递到r1,是把地址_rWTCON上的内容放到r1,而地址_rWTCON上的内容是0x15300000。实际上就是把r1设置为0x15300000

------------------------------------------

.word和0x1530 0000有什么关系?.word就是把expression上的值取出来? expression代表地址?

.word expression就是在当前位置放一个word型的值,这个值就是expression

举例来说,

_rWTCON:

.word 0x15300000

就是在当前地址,即_rWTCON处放一个值0x15300000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: