第6章 andriod ARM 前期准备(番外篇)

来源:互联网 发布:淘宝虚拟物品类目违规 编辑:程序博客网 时间:2024/05/21 13:23

ARM 学习(番外篇)

 

一、先了解andriod系统架构

 

启动时会去读内存中的地址(就是存储器的地址)

 

片内程序->ADD(找地址)->加载内核(kernel)->加载类库(包括管理UI等)

 

1、这时就要写个程序,就是引导程序(bootloader),这个引导工具就包括了:

开机的引导工作和硬件的一些驱动工作等等,继续传承到下一步。如:加

载了网络、内存等。

 

2、这些加载完后在启动另一个地址,这个另一个地址是新的程序的路口,这

个路口程序比较大了称为操作系统入口,这个操作系统的入口就用到kernel,让它去加载,如:内存共享等。

 

3、接着在加载类库一直加载到UI的上一层。

 

kernel -> FileSystem -> 各种各样的类库 -> Framework ->应用层(applictions)

 

1、kernel+FileSystem          底层

2、lib+vm(类库+虚拟机)     系统层

3、Framework                 应用程序架构

3、applictions                           应用层

 

以上就是andriod的层次

 

 

二、ARM组成

 

1、程序是什么?程序就是数据结构+算法

 

2、ARM结构图

 

3、写程序就包括了:内存和外存,如在嵌入式芯片里面的菱角指定了0和1的数值,芯片存储器就是存储管理这些菱角的数值。存储器就是容量小存储快(这就是所说的寄存器),就是芯片内的一块小内存。所有在嵌入式里面就是控制:寄存器、内存、外存。

 

4、外存对应就是指令,接着跟芯片相关的寄存器。

5、ARM指令就是语法,指令就是要去执行的一个语句。

1)      ARM指令就将高级语言中的指令转换成32位指令。

2)      32位指令组成由0~31。

3)      Thumb指令就是比ARM指令更低的指令,由16位组成。

6、ARM架构9种处理器模式如下图:


1)      User是普通模式(用户模式)                                     对应的编码是10000

2)      FIQ是快速中断模式(如:按下键盘、按下鼠标) 对应的编码是10001

3)      IRQ是普通中断模式                                                对应的编码是10010

4)      Svc 是管理者(超级用户)模式                                  对应的编码是10011

5)      Mon是安全扩展模式                                               对应的编码是10110

6)      ABT是存储异常模式                                               对应的编码是10111

7)      HYP是虚拟化扩展模式                                           对应的编码是11010

8)      UND是未定义模式                                                  对应的编码是11011

9)      SYS是系统模式                                                      对应的编码是11111

 

7、 寄存器

 

 

1)      从R0~R12是普通寄存器下面标志的是模式,R13(SP)寄存器是栈指针寄存器用来存储数据的,R14(LR)寄存器是链接寄存器用来记录返回值,R15(PC)寄存器是计数器寄存器用来当前程序运行到哪里了。(A/C)PSR是状态寄存器是用来记录当前程序的状态A代表用户级的

2)      FIQ 模式中的SPSR是存储的状态寄存器,R0~R7是共享的,但是没有计数器了(R15)。

3)      其他模式R0~R12都是共享的。

 

实战例子:

         AREA  firstARM,CODE,READONLY          #开头起名为firstARM

         ENTRY                                                          #入口点

        

start                                                                          #定义起始标签

         MOV        R0,#0x12                                    #MOV是寻址指令

         END                                                              #结束点

 

注意:指令的语法是:操作码[条件码] RdRn,操作数。

MOV        R0,#0x12  #号代表立即数,这个意思就是将#0x12移动到源R0寄存器里面

 


8、 寻址方式

1)      立即数寻址

ADD R0,R0,#0x3F(#号就是立即数,ADD操作码添加的意思)
整行的意思就是R0=R0+3F

2)      寄存器寻址

ADD R0,R1,R2(R2表示寄存器,整行意思是R0=R1+R2)

3)      寄存器间接寻址

LDR R0,[R1] 0x0000013 (LDR是内存里面加载,整行的意思是将

R1中的内存值0x0000013考给R0)

STR R0,[R1] (STR就是R0的值存储到R1中去)

 

4)      寄存器位移寻址

ADD R0,R1,R2,LSL #2(LSL #2是左位移动两位,

整行的意思是R0=R1+R2左位移动两位)

5)      基础地址寻址

LDR R0,[R1,#4] (将立即数的值传给R1,接着将整个内存值考给R0)

6)      多寄存器寻址

LDMIA R0,{R1,R2,R3,R4} (R0指向的地址对应的内存的内容存入R1R2R3R4)

7)      相对寻址

BL NEXT            (BL就是break跳转指令)

MOV PC,LR

 

9、 寄存器的MOV是只能在寄存器之间操作的,而LDR,STR是可以在寄存器和内存中操作的。

接着上面的例子写:

         AREA  firstARM,CODE,READONLY          #开头起名为firstARM

         ENTRY                                                          #入口点

        

start                                                                          #定义起始标签

         MOV        R0,#0x12                                    #MOV是寻址指令

         LDR          R1,[R0]                                       #R0中的内存值给R1寄存器

         END                                                              #结束点

 

 

 

0 0
原创粉丝点击