ADS集成开发环境
ARM工作模式
1)工作状态
从编程的角度看,ARM微处理器的工作状态一般有两种,并可在两种状态之间切换
*ARM状态,此时处理器执行32位的字对齐的ARM指令
Thumb状态,此时处理器执行16位的,半字对齐的Thumb指令
存储器的格式
ARM体系结构将存储器看作是从零地址开始的字节的线性组合。
从0字节到3字节放置第一个存储的字(32位)数据。。。。。。
32为微处理器,arm体系结构所支持的最大寻找空间为4GB
存储格式
大小端支持
大端:逻辑数据的低位 存储在 物理地址的高位
小端: 正好相反。
工作模式
1用户模式Usr
用于正常执行的程序
其余6中模式为非用户模式,也叫特权模式
2
。。。
7
运行模式可以通过软件改变,也可以通过外部中断或异常处理改变。
ARM处理器
37个32位寄存器,其中31个通用寄存器,6个程序状态寄存器。
通用寄存器:
不分组通用寄存器 R0~R7
分组寄存器 R8~R14
1 R8~R12 FIQ模式分组寄存器
2 FIQ外的寄存器分组寄存器
R13通常用作对栈指针SP
R14 用作子程序链接寄存器(LR,指向函数的返回地址)
程序计数器 R15(PC)
状态寄存器
CPSR
SPSR_svc
SPSR_abt
SPSR_und
SPSR_irq
SPSR_fiq
ARM寻址方式
寻址:处理器根据指令中给出的地址信息来寻找物理地址的方式。
立即寻址(立即数寻址),操作数本身就在指令中给出,取出指令就取出了操作数。这个操作被称为立即数。
例: ADD R0,R0,#0x3f
以#为前缀,对于16进制的立即数还要在#后加上0x或&
寄存器寻址
利用寄存器中的数值作为操作数。
效率最高的寻址方式。
如:ADD R0,R1,R2
寄存器间接寻址
以寄存器中的值作为操作数的地址,而操作数放在存储器中。
如: ADD R0,R1,[R2] ;R0->R1 +[R2]
基址变址寻址
将寄存器的内容与指令中给出的地址的偏移量相加,从而得到一个操作数的有效地址。
LDR R,[R1,#4] ; R0<-[R1+4]
LDR R0,[R1,#4]!; R0<-[R1+4],R1<-R1+4
LDR R0,[R1],#4;R0<-[R1], R1<-R1+4
LDR R0,[R1,R2]
多寄存器寻址
一条指令可以完成多个寄存器的访问
相对寻址
以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。
堆栈寻址
递增堆栈:向高地址方向生长
递减堆栈:
满堆栈:堆栈指针指向最后压入堆栈的有效堆栈
空堆栈:堆栈指针指向下一个要放入数据的空位置
arm指令
跳转指令
实现程序流程的跳转的方法:
1 使用专门的跳转指令(前后32M的地址空间)
B 跳转指令
BL 呆返回的跳转指令
BLX 呆返回和状态切换的跳转指令
BX 带状态切换的跳转指令
详细:
B{条件} 目标地址;无条件是直接跳转, 有条件时检查CPSR寄存器条件码置位时,程序跳转。
{条件指令: EQ,NE,CS......
}
BL{条件} 目的地址; 在R14中保存PC的值
BLX 目的地址 ; 将处理器的工作状态从arm状态切换到thumb状态,并且保存pc值到R14
BX{} 目的地址; 目的地址可以是arm也可以是thumb地址。
2 直接向程序计数器PC写入跳转地址值(4G地址空间的任意跳转)
如 MOV LR,PC
数据处理指令
分为:数据传送,
MOV{条件}{S} 目的寄存器,源操作数
没有S时指令不更新CPSR中的条件标准位的值。
MOV{条件}{S} 目的寄存器,源操作数
与mov的区别是在传送强把源操作数按位取反
CMP{条件} 操作数1,操作数2
比较结果,同时更新CPSR中的条件标志位的值。(该指令进行一次减法运算,不存储结果,只更改条件标志位)
TST指令
用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新CPSR中的条件标准位的值。
TST R1,#%1;用于测试在寄存器R1中是否设置了最低位(%表示二级制数),EQ位被置位。
ADD指令
ADD{条件}{S} 目的寄存器,操作数1,操作数2
ADD R0,R2,R3,LSL#1; R0=R2+(R3<<1)
SUB{条件}{S} 目的寄存器,操作数1,操作数2
AND{条件}{S} 目的寄存器,操作数1,操作数2
ORR{条件}{S} 目的寄存器,操作数1,操作数2