一 ARM的寻址方式
寻址:数据存放在哪里
[1]立即数寻址
[2]寄存器寻址
[3]寄存器移位寻址
[4]寄存器间接寻址
[5]基址变址寻址
<1>前索引
<2>后索引
<3>自动索引
[6]相对寻址
[7]多寄存器寻址
[8]堆栈寻址
二 CPSR/SPSR操作指令
[1]读CPSR/SPSR
MRS r0,cpsr =>r0 = cpsr
[2]写CPSR/SPSR
MSR cpsr,r0 =>cpsr = r0
思考:使能IRQ异常,其他位不变,如何操作?
MRS R0,CPSR
MOV r1,#1
BIC r0,r0,r1,lsl #7 @r0 = r0 & ~(r1 << 7)
MSR CPSR,R0
三 常用的ARM伪指令
伪指令不是ARM设计的指令,是编译器为了方便程序使用而设计的指令,编译器会对伪指令进行翻译,翻译成ARM核所能识别的指令
ldr r0,=0x12345678
含义:将0x12345678加载r0
ldr r0,=label
含义:
将标签表示的地址加载r0,(标签表示的地址受指定的代码运行地址影响 -Ttext = addr)
ldr r0,label
含义:
将标签表示的地址内容加载到r0
adr r0,label
含义:
在代码运行的时候,动态获取标签所在内存的地址(此时根据pc的值 +/- 偏移量得到标签所在的地址),
代码在不同的地方运行,获得的标签值不一样
四 ARM异常处理
1.异常产生的时候,ARM核自己做的事情
[1]保存CPSR到异常模式的spsr
[2]设置CPSR相应位
<1>进入ARM状态
<2>进入相应的异常模式
<3>禁用相应的中断(可选)
[3]保存pc到异常模式的lr
[4]将pc指向对应的异常向量
2.程序需要做的事情
[1]编写异常向量表(一块内存,放了一些跳转指令)
[2]告诉ARM核异常向量表所在的位置
<1>ARM7/ARM9/ARM11 异常向量表可以存放在:0x0000 0000 或 0xffff 0000
<2>cortex-A系列,异常向量表可以存放在任意位置,它有协处理器cp15的c12寄存器决定
注意:ARM核从0x0000 0000地址寻找异常向量表
[3]编写异常处理函数
注意:
异常处理函数应该做的事情
[1]保存共用的寄存器的值
[2]做异常处理的事情
[3]返回:恢复现场
<1>恢复保存的寄存器的值
<2>将异常模式的lr寄存器值赋值给pc
<3>恢复cpsr |