九种运行模型:User、 FIQ、 IRQ、Supervisor(SVC)、 Abort、 Undef 、Monitor、Hyp和 System
除了 User(USR)用户模式以外,其它 8 种运行模式都是特权模式。
可以通过软件进行任意切换,也可以通过中断或者异常来进行切换。
每一种模式都有一组寄存器供异常处理程序使用。
R0~R7,所有模式下这 8 个寄存器都是同一个物理寄存器, 模式切换会被覆盖。
R8~R14,部分模式独有的寄存器(蓝色),可以不用执行保存和恢复中
断现场
R13(SP 指针),指向该模式专用的栈地址
R14(LR),存放当前子程序的返回地址, BL 或者 BLX指令会把LR设置为子函数的返回地址
R15(PC), 保存着当前执行的指令地址值加 8 个字节
CPSR,当前程序状态寄存器
SPSR,备份程序状态寄存器,保存/恢复 CPSR
M[4:0]: 处理器模式控制位
I(bit7): I=1 禁止 IRQ, I=0 使能 IRQ。
F(bit6): F=1 禁止 FIQ, F=0 使能 FIQ。
label: instruction @ comment
label 即标号,表示地址位置
instruction 即指令
comment 就是注释内容
预定义了段名:
.text 表示代码段。
.data 初始化的数据段。
.bss 未初始化的数据段。
.rodata 只读数据段。
.section 来定义一个段
.section .testsection @定义一个 testsetcion 段
MOV 指令
从一个寄存器拷贝到另外一个寄存器,或者将一个立即数传递到寄存器里面
MOV R0, R1 @将寄存器 R1 中的数据传递给 R0,即 R0=R1
MOV R0, #0X12 @将立即数 0X12 传递给 R0 寄存器,即 R0=0X12
MRS MSR 指令
殊寄存器(如 CPSR 和 SPSR) 和 通用寄存器之间数据传递
MRS R0, CPSR @将特殊寄存器 CPSR 里面的数据传递给 R0,即 R0=CPSR
MSR CPSR, R0 @将 R0 中的数据复制到 CPSR 中,即 CPSR=R0
先将要配置的值写入到 Rx(x=0~12)寄存器中,然后借助LDR/STR将 Rx 中的数据写入到 寄存器(地址)。
LDR R0, =0X0209C004 @将寄存器地址 0X0209C004 加载到 R0 中,即 R0=0X0209C004
LDR R1, [R0] @读取地址 0X0209C004 中的数据到 R1 寄存器中
LDR R0, =0X0209C004 @将寄存器地址 0X0209C004 加载到 R0 中,即 R0=0X0209C004
LDR R1, =0X20000002 @R1 保存要写入到寄存器的值,即 R1=0X20000002
STR R1, [R0] @将 R1 中的值写入到 R0 中所保存的地址中
主要用于保护现场,使用SP指针在函数调用时,保存和恢复寄存器的值。
PUSH {R0~R3, R12} @将 R0~R3 和 R12 压栈
PUSH {LR} @将 LR 进行压栈
POP {LR} @先恢复 LR
POP {R0~R3,R12} @在恢复 R0~R3,R12
B 指令: 相对跳转,当前PC到Label的偏移,有个范围限制; 不影响LR寄存器。
BL 指令: 跳转之前会在寄存器 LR(R14)中保存当前 PC 寄存器值 (相对跳转)。
BX & BLX 跳转到存放于 Rm 中的地址处,绝对跳转,依赖程序在RAM的位置。