Chinaunix首页 | 论坛 | 博客
  • 博客访问: 316355
  • 博文数量: 146
  • 博客积分: 198
  • 博客等级: 入伍新兵
  • 技术积分: 689
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-24 08:35
文章分类

全部博文(146)

文章存档

2013年(46)

2012年(98)

2011年(1)

2010年(1)

我的朋友

分类: 嵌入式

2013-02-22 11:54:51

Ubootstart.S源码的指令级的详尽解析

Version: 1.6

Author: green-waste (at) 163.com

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

截止2011-05-01,当前最新版本是v1.6.

说明,由于本文内容太长,不方便在博客系统一点点贴出来,所以,此处只是贴出来目录,感兴趣的话,自己下载PDF版本:

 Uboot中start.S源码的指令级的详尽解析 v1.6(下载pdf后一定要将后缀改为7z再解压即可).pdf   

http://blog.chinaunix.net/attachment/attach/77/44/27/277744278a6fbb52c4ea9bb1f25fd651107a3697.pdf

 

 

下载地址:

1.csdn资源下载:

2.爱问iask:

3.rayfile:

4.豆丁在线阅读:

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

 

目录

1.    正文之前... 4

1.1.    本文内容... 4

1.2.    本文目标... 4

1.3.    代码来源... 4

1.4.    关于本文内容的组织形式... 4

1.5.    阅读此文所要具有的前提知识... 5

1.6.    声明... 5

2.    start.S详解... 6

2.1.    设置CPU模式... 6

2.2.    关闭看门狗... 19

2.3.    关闭中断... 23

2.4.    设置堆栈sp指针... 27

2.5.    清除bss... 36

2.6.    异常中断处理... 48

3.    start.S的总结... 63

3.1.    start.S各个部分的总结... 63

3.2.    Uboot中的内存的Layout 64

4.    相关知识点详解... 67

4.1.    如何查看C或汇编的源代码所对应的真正的汇编代码... 67

4.2.    uboot初始化中,为何要设置CPU为SVC模式而不是设置为其他模式... 69

4.3.    什么是watchdog + 为何在要系统初始化的时候关闭watchdog. 70

4.3.1.     什么是watchdog. 71

4.3.2.     为何在要系统初始化的时候关闭watchdog. 71

4.4.    为何ARM7中PC=PC+8. 71

4.4.1.     为何ARM9和ARM7一样,也是PC=PC+8. 73

4.5.    AMR寄存器的别名 + APCS. 79

4.5.1.     ARM中的寄存器的别名... 79

4.5.2.     什么是APCS. 81

4.6.    为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈... 81

4.6.1.     保存现场/上下文... 82

4.6.1.1.    什么叫做上下文context 82

4.6.2.     传递参数... 82

4.6.3.     举例分析C语言函数调用是如何使用堆栈的... 83

4.7.    关于为何不直接用mov指令,而非要用adr伪指令... 84

4.8.    mov指令的操作数的取值范围到底是多少... 85

4.9.    汇编学习总结记录... 89

4.9.1.     汇编中的标号=C中的标号... 89

4.9.2.     汇编中的跳转指令=C中的goto. 89

4.9.3.     汇编中的.globl=C语言中的extern. 90

4.9.4.     汇编中用bl指令和mov pc,lr来实现子函数调用和返回... 90

4.9.5.     汇编中的对应位置有存储值的标号 = C语言中的指针变量... 91

4.9.6.     汇编中的ldr+标号,来实现C中的函数调用... 93

4.9.7.     汇编中设置某个寄存器的值或给某个地址赋值... 94

5.    引用... 97

 

图表

图表 1 global的语法... 7

图表 2 LDR指令的语法... 9

图表 3 .word的语法... 10

图表 4 balignl的语法... 11

图表 5 CPSR/SPSR的位域结构... 16

图表 6 CPSR=0xD3的位域及含义... 18

图表 7 pWTCON.. 19

图表 8 INTMOD.. 19

图表 9 INTMSK. 19

图表 10 INTSUBMSK. 20

图表 11 CLKDIVN.. 20

图表 12 WTCON寄存器的位域... 23

图表 13 INTMSK寄存器的位域... 24

图表 14 INTSUBMSK寄存器的位域... 25

图表 15 CLKDIVN的位域... 26

图表 16 控制寄存器1的位域含义... 44

图表 17 时钟模式... 45

图表 18 关于访问控制位在域访问控制寄存器中的含义... 45

图表 19 关于访问允许(AP)位的含义... 46

图表 20 macro的语法... 50

图表 21 LDM/STM的语法... 50

图表 22 条件码的含义... 51

图表 23 Uboot中的内存的Layout 66

图表 24 ARM中CPU的模式... 69

图表 25 AMR7三级流水线... 72

图表 26 ARM7三级流水线状态... 72

图表 27 ARM7三级流水线示例... 73

图表 28 ARM7三级流水线 vs ARM9五级流水线... 74

图表 29 ARM7三级流水线到ARM9五级流水线的映射... 74

图表 30 ARM9的五级流水线示例... 75

图表 31 ARM9的五级流水线中为何PC=PC+8. 77

图表 32 ARM Application Procedure Call Standard (AAPCS) 79

图表 33 ARM寄存器的别名... 80

图表 34 数据处理指令的指令格式... 87

图表 35 mov指令0xe3a00453的位域含义解析... 88

 

版本历史

版本

时间

内容

1.0

2011-04-17

1.详细解释了ubootstart.s中的每行代码;

2.添加了相关知识点的详细解释;

1.6

2011-05-01

1.添加汇编学习记录;

2.添加了如何查看C或汇编的源代码所对应的真正的汇编代码;

3.添加Start.S的总结;

3.1 Start.S的各个部分的总结;

3.2 Uboot中的内存的layout

4.更加详细地解释了为何ARM9PC=PC+8

5.添加了一些其他的细节的内容;

6.修正一些拼写错误;

 

阅读(1205) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~