ARM架构初探
什么是ARM
ARM架构,进阶精简指令集机器(Advanced RISC Machine)更早称作Acorn RISC Machine,是一个32位精简指令集(RISC)处理器架构
内核(架构)版本 | 处理器版本 |
---|---|
ARMv1 | ARM1 |
ARMv2 | ARM2、ARM3 |
ARMv3 | ARM6、ARM7 |
ARMv4 | StrongARM、ARM7TDMI、ARM9TDMI |
ARMv5 | ARM7EJ、ARM9E、ARM10E、XScale |
ARMv6 | ARM11、ARM Cortex-M |
ARMv7 | ARM Cortex-A、ARM Cortex-M、ARM Cortex-R |
ARMv8 | ARM Cortex-A30、ARM Cortex-A50、ARM Cortex-A70 |
ARM的使用场景
手机、电脑、智能家居 …
ARM大小端
- 最高有效为 MSB(Most Significant Bit) 对应大端(Big-endian)
- 最低有效为 LSB(Least Significant Bit) 对应小端(Little-endian)
- armel : arm eabi little endian的缩写,软件浮点
- armhf : arm hard float的缩写,硬件浮点
- arm64 : 64位的arm默认就是hf的,因此不需要hf的后缀
ARM运行模式
运行模式 | 功能 |
---|---|
用户模式(USR) | ARM处理器正常程序执行状态 |
快速中断模式(FIQ) | 高速数据传输或通道处理 |
外部中断模式(IRQ) | 通用的中断处理 |
管理模式(SVC) | 操作系统使用的保护模式 |
数据访问终止模式(ABT) | 当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护 |
系统模式(SYS) | 运行具有特权的操作系统任务 |
未定义指令终止模式(UND) | 未定义的指令执行是进入该模式 |
ARM寄存器
ARM指令集特点
- 所有指令定长 : 4字节/32位
- 大部分指令都可以在一个时钟周期内执行完毕
- 每一个指令都可以有条件执行
- 执行在通电后可以配置为低位优先或高位优先
- LOAD/STORE模型,专有指令才能访问内存
- ARM两种指令格式ARM&Thumb
ARM状态
- 指令集状态
- 执行状态
- 安全状态
- 调试状态
ARM三级流水线
- CPU流水线、把一条指令分为多个处理阶段
- ARM使用三级流水线、加速指令处理速断
- ARM的三级流水分别是 : 取址(fetch)、译码(decode)、执行(execute)。PC执行fetch的指令
ARM V9之后使用了5级流水线
ARM指令集
- 数据处理指令
- 数据传送指令
- mov
- mvn
- 算术逻辑运算指令
- add
- anc
- 比较指令
- cmp
- tst
- 数据传送指令
- 跳转指令
- b
- BL
- 程序状态寄存器(PSR)处理指令
- msr
- mrs
- 存储器访问指令
- ldr
- str
- 协处理器指令
- cdp
- LDC
- 异常产生指令
- SWI
- BKPT
ARM环境介绍
操作系统 : Ubuntu x64 / Windows 7
ARM IDE : Keil uVersion
交叉编译 : arm-linux-gnueabi*
模拟环境 : qemu
sudo apt-get install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi
sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf
编译并运行arm程序
keil
交叉编译ARM程序
编写代码
#include<stdio.h>
int main()
{
printf("hello\n");
return 0;
}
交叉编译工具进行编译
arm-linux-gnueabi-gcc hello.c -o hello
qemu执行
qemu-arm -L /usr/arm-linux-gnueabi/ ./hello
另一个方式
hello.s
.text
.global _start
_start:
mov r0,#1
ldr r1,=message
ldr r2,=len
mov r7,#4
swi 0
mov r7,#1
swi 0
.data
message:
.asciz "hello world\n"
len = .-message
arm-linux-gnueabi-as hello.s -o hello.so
arm-linux-gnueabi-ld hello.so -o hello
qemu-arm ./hello