原文地址:http://sdnydubing.blog.163.com/blog/static/13747057020112904958830/
_undefined_instruction:
.word undefined_instruction
_undefined_instruction是一个标号,处理到这里时,asm会把undefined_instruction的值按16bit的形式放在此标号处。
ldr pc, _undefined_instruction
就是从_undefined_instruction处取值,即undefined_instruction, 并设置到pc中。
.word就是在这个地方放一个值。相当于在这里定义一个数据变量。用.word定义了一个16bit的数据。
并将underfined_instruction的值本身放在这里,因此,pc=undefined_instruction,实现跳转。
ldr 是把数据从存储器传输到寄存器上,格式如下:
ldr(条件) 目的寄存器,<存储器地址>
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
翻译成intel的汇编语句就是:
_rWTCON dw 0x15300000没有.long/.word
汇编程序就不知道你想在这里放一个多大的数据,
相当于数据类型。
另外还应注意:在arm7,9中(其他的我不清楚)arm指令集中一个字类型就是32位。
原文地址:http://ackerman.iteye.com/blog/796754
感觉一定要理解一些基本的概念,然后在看懂汇编的基础上,再分析uboot的流程。
1.关于汇编的语法
这里有两套汇编的语法:分为ARM公司的标准ARM汇编语言和GNU对ARM支持的GNU ARM汇编。ARM标准汇编语言即ARM公司的开发工具ADS里用的汇编语言;GNU汇编即在LINUX下用GCC编译的汇编。两者语法有少许差异。因此,通常我们下载的LINUX下的ARM接口代码放到ADS下是不能编译通过的,需要进行少许修改。
GNU AS语法即AT&T汇编语法,uboot用到的语法。
2.标签的含义
.globl _start
_start: b reset
标签就是在某行程序代码前作一个标记,标签代表的是这行代码的地址。
.globl _armboot_start
_armboot_start:
.word _start
.word expression就是在当前位置放一个word型的值,这个值就是expression ,此处的含义就是建立一个全局标签_armboot_start,在这个位置上放置_start的值(可以这样理解,_armboot_start是一个地址,这个地址中的内容是_start),则下面的语句会把地址_armboot_start处的内容(_start)装载到r2中。
ldr r2, _armboot_start
这样做的目的是因为LDR指令的格式为:LDR{条件} Rd, <地址>。
3..word 0x0badc0de
含义:保留一个字,初始化一下。实际的值应该在运行时计算出来。(badcode吗,呵呵)。
4.关于判断是否拷贝到ram
如果是debug下,uboot直接运行在ram中,从而得到的_start值和TEXT_BASE是相等的,不需要拷贝。如果从flash启动,_start为0x0,TEXT_BASE是sdram的地址,二者是不相等的,需要拷贝。(TQ2440的SDRAM为64M,bank6,地址空间为0x30000000-0x34000000,TEXT_BASE设置为0x33D000000,即0x33D00000-0x34000000为uboot使用的空间+bss和其他的空间)。
见映射图
5.汇编中调用c函数
遵循ATPCS(ARM-THUMB procedure call standard)标准。