ARM处理器的运行模式
用户模式
可以使用的不分组寄存器R0~R7,分组寄存器R8~R14.程序计数器R15(PC),
工作状态
ARM状态和Thumb状态,处理器可以在这两种状态之间随意切换。
当处理器处于ARM状态的时候,执行32位字对齐的ARM指令
当处理器处于Thumb状态的时候,会执行16位对齐的Thumb指令
ARM状态和Thumb状态的寄存器命名差异
Thumb状态下R0~R7和ARM状态下的R0和R7相同
Thumb状态下CPSR和ARM状态下的CPSR相同
Thumb状态下的FP对应ARM状态下的R11
Thumb状态下的IP对应于ARM状态下的R12
Thumb状态下的SP对应于ARM状态下的R13
Thumb状态下的LR对应于ARM状态下的R14
Thumb状态下的PC对应于ARM状态下的R15
立即寻址
实例:
MOV R0,#1234
执行结果:
R0=1234
立即数以#开头
寄存器寻址
格式
MOV R0,R1
执行结果
R0=R1
寄存器移位寻址
基本操作
LSL:逻辑左移,移位后的寄存器空出的低位补0
LSR:逻辑右移,移位后的寄存器空出的高位补0
ASR:算术右移,移位过程中符号位保存不变,如果源操作数是正数则移位后空出的高位补0,否则补1。
ROR:循环右移,移位后移出的低位填入移位空出的高位。
RRX:带拓展的循环右移,操作数右移一位,移位空出的高位有C标志位的值填充。
实例:
MOV R0,R1,LSL #2
执行结果:
R1的值逻辑左移两位,R1<<2
R0=R1*4
寄存器间接寻址
实例:
LDR R0,[R1]
执行结果:
将R1保存的是数值的地址,取出地址里的值并且将其赋给R0
基址寻址
实例:
LDR R0,[R1,#-4]
执行结果:
将R1保存的是数值的地址,将地址的值减4的到新地址,取出新地址里的值并且将其赋给R0
多寄存器寻址
LDMIA R0,{R1,R2,R3,R4}
LDM是数据加载指令,指令的后缀IA表示每次执行完加载操作之后R0寄存器的值自增1个字,ARM指令集中,字表示一个32位的数值。这条指令执行后:
R1=[R0],R2=[R0+#4],R3=[R0+#8],R4=[R0+#12]
堆栈寻址
堆栈寻址是ARM的一种特有的寻址方式,指令对
(LDMFA/STMFA;LDMEA/STMEA;LDMFD/STMFD;LDMED/STMED)
前缀:LDM和STM,表示多寄存器寻址
后缀:FA,EA,FD,ED
块拷贝寻址
指令对:
(LDMIA/STMIA;LDMDA/STMDA;LDMIB/STMIB;LDMDB/STMDB)
相对寻址
相对寻址以程序计数器PC的值为当前的基地址,指令中的地址标号作为地址偏移量,将两者相加之和得到操作数的有效地址。
BL NEXT
…
NEXT:
…