ARM汇编
一.ARMv7架构的寄存器
Arm公司的Cortex系列属于ARMv7架构,RMv7架构定义了三大分工明确的系列:“A”系列面向尖端的基于虚拟内存的操作系统和用户应用;“R”系列针对实时系统;“M”系列对微控制器。
采用ARMv7架构的常见嵌入式处理器有:Cotex-M4、M3;Cotex-M7;Cotex-A7(imx6ull)。
通用寄存器R0-R12:都可以用来保存中间的计算结果。R0 到 R3 通常用于函数调用中的参数传递。R4 到 R11 通常用于局部变量或函数内部使用的寄存器。
堆栈寄存器R13:MSP是主堆栈指针,PSP是进程堆栈指针,两个指针可以通过指令来切换使用,两个指针的值可以不一样,可以自己设置。
链接寄存器R14(LR):保存函数的返回地址。函数跳转硬件自动保存PC的下一条指令地址到LR
程序计数器R15(PC):PC里面的当前值一般指向正在执行指令地址+4处(thum),PC指向哪里,CPU就运行哪条代码。
(注:ARM内核中的寄存器的值就表示当前CPU运行的状态,也被称之为“现场”)
二.ARM汇编的特点
1.ARM采用RISC架构:CPU本身不能直接读取内存,而需要先将内存(SRAM)中的内容加载入CPU中通用寄存器中才能被CPU处理。
2.ldr(load register):指令将内存内容加载入通用寄存器。
3.str(store register):指令将寄存器内容存入内存空间中。
(注:ldr和str的组合就可以用来实现 ARM CPU和内存数据交换)
三.ARM常用汇编指令。
1.ldr 、str(load register、store register)
点击查看代码
ldr r0, =0X0209C004 @将地址 0X0209C004 加载到 R0 中,即 R0=0X0209C004
ldr r1, [r0] @读取地址 0X0209C004 中的数据到 R1 寄存器中
str r3, [r0], #4 @将 r3 寄存器中的数据存储到由 r0 寄存器当前值指定的内存地址处。存储完成后,将 r0 寄存器的值增加4,准备下一个连续的内存地址,以便进行连续的存储操作。
ldr r13, =__mmap_switched @将 __mmap_switched 的地址直接加载到 r13 寄存器
2.b 、bl、bx(Branch、Branch with Link、Branch and Exchange)
b 直接跳转。
bl 用于函数调用或中断,跳转时会保存返回地址到 lr。
bx 用于跳转到寄存器中的地址。
点击查看代码
_start:
ldr sp,=0X80200000 @设置栈指针
b main @跳转到 main 函数
bl system_irqhandler @加载中断处理函数,运行后返回。
5.mrc 、mcr(Move to Register from Coprocessor、Move to Coprocessor from Register)
Coprocessor: ARM架构支持多个协处理器,每个协处理器都有唯一的编号。CP15是系统控制协处理器,用于系统控制、缓存控制、内存控制(TLB)等。
系统控制:CP15可以用于控制处理器的工作模式、权限级别、异常处理等功能。
缓存控制:CP15负责管理内存地址空间、虚拟地址到物理地址的转换、内存保护等功能。
内存控制:CP15可以用于控制数据缓存和指令缓存的开启和关闭、缓存的清除和刷新等操作。
协处理器的寄存器介绍:
处理器ID寄存器(c0):处理器ID寄存器用于标识处理器的类型、制造商和版本信息。我们可以使用MRC指令来读取处理器ID。
点击查看代码
mrc p15, 0, r9, c0, c0 @将CP15(协处理器)的寄存器c0的值读取到cpu寄存器r9中。p15表示协处理器的编号(CP15)
ORR r9, r9, #0x4 ; 设置r0的第2位置1
mcr p15, 0, r9, c1, c0 @将cpu寄存器r9的值写入到CP15(协处理器)寄存器C0中。
控制寄存器(c1):通过设置控制寄存器的相应bit位来开启或关闭数据缓存。
点击查看代码
; 打开数据缓存
MRC p15, 0, r0, c1, c0, 0 ; 将CP15的寄存器c1的值移动到ARM寄存器r0
ORR r0, r0, #0x4 ; 设置r0的第2位置1
MCR p15, 0, r0, c1, c0, 0 ; 将ARM寄存器r0的值移动到CP15的寄存器c1
地址转换表基址寄存器(c2):用于存储内存地址转换(MMU)所需的表基址。可以使用MCR和MRC指令来修改和读取地址转换表基址。
点击查看代码
; 设置地址转换表基址
LDR r0, =0x40000000 ; 将地址0x40000000加载到ARM寄存器r0
MCR p15, 0, r0, c2, c0, 0 ; 将ARM寄存器r0的值移动到CP15的寄存器c2
CP15域访问控制寄存器(c3):用于控制内存访问权限
点击查看代码
; 设置所有域的访问权限为管理模式
LDR r0, =0xFFFFFFFF ; 将0xFFFFFFFF加载到ARM寄存器r0
MCR p15, 0, r0, c3, c0, 0 ; 将ARM寄存器r0的值移动到CP15的寄存器c3