您的位置:首页 > 其它

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

2016-03-10 18:33 281 查看
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 #结束点

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

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指向的地址对应的内存的内容存入R1、R2、R3和R4)

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 #结束点
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: