-ARM核介绍
-CPU核
CPU又叫中央处理器,其主要功能是进行算数运算和逻辑运算,内部结构大概可以分为控制单元,算术逻辑单元和储存单元等几个部分
-ARM核
工作模式:
user mode:用户模式是用户程序的工作模式,他运行在操作系统的用户态,没有权限去操作其他硬件资源,只能执行自己的数据,也不能切换到其他模式下,想要访问硬件只能通过软中断或产生异常
system mode:系统模式是特权模式,不受用户模式的限制,用户模式与系统模式共用一套寄存器,操作系统在该模式下可以方便的访问用户模式的寄存器,而且操作系统的一些特权任务可以使用这个模式访问一些受控的资源
IRQ mode:IRQ模式是采用IRQ中断的默认模式,一般中断模式也叫普通中断模式,用于处理一般的中断请求,通常在硬件产生中断信号之后自动进入该模式,该模式为特权模式,可以自由访问系统资源
FIQ mode:FIQ模式是采用FIQ中断的默认模式,快速中断模式是相对与一般中断模式而言的,它是用来处理时间相对比较紧急的中断请求,主要用于高速数据传输及通道处理
-ARM核的寄存器资源
寄存器是中央处理器内的组成部分,寄存器是有限存贮容量的高速存贮部件,它们可以用来暂存指令、数据和地址,在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)
寄存器用途分析
R0 -R10:用来存放用户的数据
R11(fp):用来记录一个栈空间的开始地址
R12(ip):用来临时存储sp
R13(sp):栈指针寄存器
R14(lr):在发生跳转的时候,用来保存PC寄存器的值
R15(pc):用来存放CPU需要执行的指令所在内存的地址
CPSR
mode[0:4]:记录当前ARM核所在的模式
T:ARM状态(执行32bit指令),thumb状态(执行16bit指令)
F:FIQ禁止(1)使能(0)
I:IRQ禁止(1)使能(0)
N:计算的结果为负数,则置1
Z:计算的结果为零,则置1
C:产生进位则置1,产生借位则置0
V:超过一个范围溢出
SPSR:异常产生的时候,用来保存CPSR的值
-ARM指令格式
立即数
立即数为一个常数,该常数必须对应8位位图,即一个8位的常数通过循环右移偶数位得到该数,该数位合法立即数 ;在指令中表示方法:#数字,例如#100
快速判定是否为合法立即数:
1.首先将这个数转换为32bit的16进制形式
2.除零外,仅有一位数为合法立即数
3.除零外,仅有二位数,并且相邻(包括首尾,例如0x1000000A)的为合法立即数
4.除零外,仅有三位数,并且相邻(包括中间有0相间,例如0x10800000;包括首尾相邻,例如0x14000003),这三位数中,最高位取值仅能为1,2,3,最低位取值仅能为4,8,C,中间位任意,这种组合为合法立即数
寄存器移位
将寄存器值读取之后,进行移位运算后,作为操作2参与运算,支持的移位方式如下:
1.LSL:逻辑右移
2.LSR:逻辑左移
-常用ARM核指令
数据传送指令
MOV指令
格式:mov 目标寄存器,操作数2
功能:将操作2的值赋值给目标寄存器
MVN指令
格式:mvn 目标寄存器,操作数2
功能:将操作2取反的值给目标寄存器
LDR指令
格式:ldr 目标寄存器,=数据
功能:完成任意的数据传送到目标寄存器
注意:数据前面不能加#,因为此时数据不按立即数来处理
数据计算指令
ADD指令
格式:add 目标寄存器,操作数1,操作数2
功能:将操作数1加上操作数2的结果给目标寄存器
SUB指令
格式:sub 目标寄存器,操作数1,操作数2
功能:将操作数1减去操作数2的结果给目标寄存器
注意:如果值为负数,会影响到CPSR寄存器的N位
MUL指令
格式:mul 目标寄存器,操作1,操作2
功能:将操作数1乘以操作数2的结果存放在目标寄存器
注意:操作数1和操作数2必须都是寄存器,并且操作数1的寄存器编号不能和目标寄存器一样
位运算
AND指令
格式:and 目标寄存器,操作数1,操作数2
功能:将操作数1按位与操作数2的结果存放在目标寄存器
ORR指令
格式:orr 目标寄存器,操作数1,操作数2
功能:将操作数1按位或操作数2的结果存放在目标寄存器
EOR指令
格式:eor 目标寄存器,操作数1,操作数2
功能:将操作数1按位异或操作数2的结果存放在目标寄存器
BIC指令(位清零操作)
格式:bic 目标寄存器,操作数1,操作数2
功能:将操作数1按位与操作数2取反的结果存放在目标寄存器
注意:目标寄存器=操作数1&~操作数2
比较指令--CMP指令
格式:cmp 寄存器,操作数2
功能:将寄存器的值与操作数2比较,比较的结果会自动影响CPSR的NZCV
跳转指令--B/BL指令
格式:B/BL 标签
功能:跳转到一个指定的标签,BL跳转之前,将跳转前的PC的值保存在LR,跳转范围+/-32M
给PC赋值
格式:ldr pc,=标签名
功能:将pc指针指向标签表示的地址
内存访问指令
单个数据访问(LDR,STR)
格式:ldr r0,[r1] //r0=*r1
功能:将内存中的值加载到寄存器(读内存)
格式:str r0,[r1] //*r1=r0
功能:将寄存器的内容写入内存(写内存)
基址变址寻址
将基地址寄存器加上指令中给出的偏移量,得到数据存放的地址
前索引
格式:str r0,[r1,#4] //*(r1+4)=r0
后索引
格式:str r0,[r1],#4 //*r1=r0 && r1=r1+4
自动索引
格式:str r0,[r1,#4]! //*(r1+4)=r0 && r1=r1+4
多个数据访问(LDM,STM)
格式:stm/ldm{条件} r1!,{r5-r7}
功能:ldm:将一块内存的数据,加载到多个寄存器中
stm:将多个寄存器的值,存储到一块内存中
栈操作指令
进栈:stmfd sp!,{寄存器列表}
出栈:ldmfd sp!,{寄存器列表}
注意:在对栈操作之前,必须设置sp的值,进栈和出栈的方式一样,ATPCS标准规定向下增长长满减栈
CPSR/SPSR操作指令
读操作:mrs 寄存器,cpsr/spsr
写操作:msr cpsr/spsr,寄存器