完整word版嵌入式系统原理与设计重点总结推荐文档Word下载.docx
《完整word版嵌入式系统原理与设计重点总结推荐文档Word下载.docx》由会员分享,可在线阅读,更多相关《完整word版嵌入式系统原理与设计重点总结推荐文档Word下载.docx(25页珍藏版)》请在冰豆网上搜索。
ARM主要采用32位指令集,Thumb16位指令集
ARM9处理器架构
•ARM9处理器系列有两个分支
◦基于v4版本的ARM9,典型的有ARM9TDMI和ARM922T
◦基于v5TE或v5TEJ架构的ARM9E,典型处理器有ARM9EJ-S和ARM926EJ-S等
◦后面关于ARM9的介绍主要也是围绕ARM9E系列
•状态寄存器
◦1个当前程序状态寄存器(CPSR)和5个备份状态寄存器(SPSR)
状态寄存器结构
SPSR在处理器进入异常模式时用来保存CPSR寄存器内容,当从异常退出时,用SPSR恢复CPSR的值
流水线技术和哈佛体系结构
•冯·
诺依曼体系将数据和指令全部存储在同一个存储器中
•哈佛体系中,指令存储和数据存储是分开的,指令的存取和数据的存取通过不同的数据总线进行
•
内存管理单元MMU作用
•CPU产生的虚拟地址被先送到MMU中,通过一定的映射,转换为物理地址,然后进行相应的读写操作
•有了MMU,才能使用虚拟内存
第三章
1.立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数没有存储在寄存器或存储器中,而是包含在指令的操作码中,只要取出指令也就取到了操作数。
这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。
例如指令:
MOVR0,#0xFF000;
将立即数0xFF000装入R0寄存器
ADDR1,R1,#0x7f;
R1←R1+0x7f
在以上两条指令中,第二个源操作数即为立即数,要求以“#”为前缀,对于以十六进制表示的立即数,还要求在“#”后加上“0x”。
2.寄存器寻址就是利用寄存器中的内容作为操作数,寄存器本身就是操作数地址。
这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。
例如指令:
MOVR2,R3;
R2←R3R3中的内容赋给R2
ADDR2,R3,R4
;
R2←R3+R4R3和R4中的内容相加,结果赋给R2
3.寄存器间接寻址就是以寄存器中的内容作为操作数的地址,而操作数本身存放在存储器中。
例如指令:
LDRR1,[R2];
R1←[R2]
STRR1,[R2];
[R2]←R1
第一条指令将以R2中的内容为地址,将该地址中的数据传送到R1中。
第二条指令将R1中的内容传送到以R2中的内容为地址的存储器中。
4.变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。
变址寻址方式常用于访问某基地址附近的地址单元。
LDRR0,[R1,#8];
R0←[R1+8]
LDRR0,[R1,#8]!
;
R0←[R1+8],R1←R1+8
LDRR0,[R1],#2;
R0←[R1],R1←R1+2
LDRR0,[R1,R2];
R0←[R1+R2]
5.寄存器移位寻址是ARM指令集独有的寻址方式,操作数由寄存器的数值进行相应移位而得到;
移位的方式在指令中以助记符的形式给出,而移位的位数可用立即数或寄存器寻址方式表示。
6.多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。
这种寻址方式可以一次对多个寄存器寻址,多个寄存器由小到大排列,最多可传送16个寄存器。
例如:
LDMIAR1!
,{R2-R4,R5};
R2←[R1]
;
R3←[R1+4]
R4←[R1+8]
R5←[R1+12]
该指令的后缀IA表示在每次执行完加载/存储操作后,R1按字长度增加,因此,指令可将连续存储单元的值传送到R2~R5。
7.堆栈寻址:
堆栈是一种数据结构,按先进后出(FirstInLastOut,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。
●当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(FullStack);
而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(EmptyStack)。
●同时,根据堆栈的生成方式,又可以分为递增堆栈(AscendingStack)和递减堆栈(DecendingStack),当堆栈由低地址向高地址生成时,称为递增堆栈,当堆栈由高地址向低地址生成时,称为递减堆栈。
ARM微处理器支持这四种类型的堆栈工作方式,即:
●满递增方式FA(FullAscending):
堆栈指针指向最后入栈的数据位置,且由低地址向高地址生成。
●满递减方式FD(FullDecending):
堆栈指针指向最后入栈的数据位置,且由高地址向低地址生成。
●空递增方式EA(EmptyAscending):
堆栈指针指向下一个入栈数据的空位置,且由低地址向高地址生成。
●空递减方式ED(EmptyDecending):
堆栈指针指向下一个入栈数据的空位置,且由高地址向低地址生成。
8.相对寻址:
与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。
●以下程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式:
BLNEXT;
跳转到子程序NEXT处执行
……
NEXT
……
MOVPC,LR;
从子程序返回
1.单一数据加载/存储指令
(1)LDR指令
格式为:
LDR{条件}目的寄存器,<
存储器地址>
LDR指令是字加载指令,用于从存储器中将一个32位的字数据传送到目的寄存器中。
●指令示例:
LDRR3,[R4]
将存储器地址为R4的字数据读入寄存器R3。
LDRR3,[R1,R2]
将存储器地址为R1+R2的字数据读入寄存器R3。
LDRR3,[R1,#8]
将存储器地址为R1+8的字数据读入寄存器R3。
LDRR3,[R1,R2]!
将存储器地址为R1+R2的字数据读入寄存器R3,并将新地址R1+R2写入R1。
LDRR3,[R1,#8]!
将存储器地址为R1+8的字数据读入寄存器R3,并将新地址R1+8写入R1。
应用示例:
LDRR3,[R4];
将R4指向地址的字数据存入R3
0x55
R3
R4
0x40000000
0x12345678
存储器
地址
LDRR3,[R1],R2
;
将存储器地址为R1的字数据读入寄存器R3,并将新地址R1+R2写入R1。
LDRR3,[R1,R2,LSL#3]!
将存储器地址为R1+R2×
8的字数据读入寄存器R3,并将新地址R1+R2×
8写入R1。
LDRR3,[R1],R2,LSL#3
将存储器地址为R1的字数据读入寄存器R3,并将新地址R1+R2×
注:
R15不可以作为偏移寄存器使用。
(2)LDRB指令
LDR{条件}B目的寄存器,<
LDRB指令是字节加载指令,用于从存储器中将一个8位的字节数据传送到目的寄存器中,同时将寄存器的高24位清零。
该指令通常用于从存储器中读取8位的字节数据到通用寄存器,然后对数据进行处理。
指令示例:
LDRBR3,[R1]
将存储器地址为R1的字节数据读入寄存器R0,并
将R3的高24位清零。
LDRBR3,[R1,#8]
将存储器地址为R1+8的字节数据读入寄存器R3,
并将R3的高24位清零。
(3)LDRH指令
LDR{条件}H目的寄存器,<
LDRH指令是无符号半字加载指令,用于从存储器中将一个16位的半字数据传送到目的寄存器中,同时将寄存器的高16位清零。
该指令通常用于从存储器中读取16位的半字数据到通用寄存器,然后对数据进行处理。
LDRHR3,[R1]
将存储器地址为R1的半字数据读入寄存器R3,并将R3的高16位清零。
LDRHR3,[R1,#8]
将存储器地址为R1+8的半字数据读入寄存器R3,并
将R3的高16位清零。
LDRHR3,[R1,R2]
将存储器地址为R1+R2的半字数据读入寄存器R3,
并将R3的高16位清零。
(4)STR指令
STR{条件}源寄存器,<
STR指令是字存储指令,用于从源寄存器中将一个32位的字数据传送到存储器中。
该指令在程序设计中比较常用,且寻址方式灵活多样,使用方式可参考指令LDR。
STRR3,[R1],#8
将R3中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。
STRR3,[R1,#8]
将R3中的字数据写入以R1+8为地址的存储器中。
(5)STRB指令
STR{条件}B源寄存器,<
STRB指令是无符号字节存储指令,用于从源寄存器中将一个8位的字节数据传送到存储器中。
该字节数据为源寄存器中的低8位。
STRBR3,[R1]
将寄存器R3中的字节数据写入以R1为地址的存储器中。
STRBR3,[R1,#8]
将寄存器R3中的字节数据写入以R1+8为地址的存储器中。
(6)STRH指令
格式为:
STR{条件}H源寄存器,<
STRH指令是无符号半字存储指令,用于从源寄存器中将一个16位的半字数据传送到存储器中。
该半字数据为源寄存器中的低16位。
STRHR3,[R1]
将寄存器R3中的半字数据写入以R1为地址的存储器中。
STRHR3,[R1,#8]
将寄存器R3中的半字数据写入以R1+8为地址的存储器中。
2.批量数据加载/存储指令
ARM微处理器所支持批量数据加载/存储指令可以一次在一片连续的存储器单元和多个寄存器之间传送数据,批量加载指令用于将一片连续的存储器中的数据传送到多个寄存器,批量数据存储指令则完成相反的操作。
●数据处理指令只能对寄存器的内容进行操作,不允许对存储器中的数据进行操作,也不允许指令直接使用存储器的数据或在寄存器与存储器之间传送数据。
●数据处理指令可分为3大类:
●数据传送指令
●算术逻辑运算指令
●比较指令
●数据传送指令用于在寄存器和寄存器之间进行数据的双向传输。
●算术逻辑运算指令完成常用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR中的相应条件标志位。
●比较指令是完成对指定的两个寄存器(或1个寄存器,1个立即数)进行比较,不保存运算结果,只影响C