数据传输指令
- 将数据从一个寄存器传递到另一个寄存器
- 将数据从一个寄存器传递到特殊特殊寄存器
- 将立即数传递到寄存器
- MOV指令
MOV R0,R1
MOV R0,#0X12 - MRS指令
MRS RO,CPSR - MSR指令
MSR CPSR,R0
存储器访问指令
LDR R0,=0X0209C004
LDR R1,[R0]
LDR指令
LDR R0,=0X0209C004
LDR R1, [R0]
STR指令
LDR R0,=0X0209C004
LDR R1,=0X20000002
STR R1,[R0]
压栈和出栈指令
R0~R3和R12寄存器压栈
PUSH {R0~R3} 底[LR,R0,R1,R2,R3,R12]顶 向底部增长
POP {LR}
POP {R0~R3,R12}
STMFD SP!,{R0~R3,R12}
STMD SP!,{LR}
LDMFD SP!,{LR}
LDMFD SP!,{R0~R3,R12}
STM和LDM就算多存储和多加载,可以连续地读写存储器中多个连续的数据
跳转指令
- 直接使用跳转指令B,BL,BX等
- 直接向PC寄存器中写入数据
B指令会将PC寄存器的值设置为跳转目标地址。执行B指令,ARM处理器就会立即跳转到指定的目标地址。
_start:
ldr sp, = 0X80200000
b main
BL指令
BL指令相比与B指令,在跳转之前会在寄存器LR中保存当前PC的值,这就可以通过将LR寄存器的值重新加载到PC中拉
push {r0,r1}
cps #0x13 @进入SVC模式,允许其他终端再次进去
bl system_irqhandler @加载C语言中断处理函数到r2寄存器中
cps #0x12 @进入IRQ模式
pop {r0,r1}
str r0,[r1,#0x10] @中断完成,写EOIR
ADD Rd,Rn, Rm Rd = Rn + Rm
ADD Rd, Rn, #Immed
ADC Rd, Rn, Rm(带进位)
ADC Rd, Rn, #immed(带进位)
SUB Rd, Rn, Rm(带进位)
SUB Rd, #immed (带进位)
SUB Rd, Rn, #immed
SBC Rd, Rn, #immed
SBC Rd, Rm, #immed 借位
MUL Rd,Rn,Rm @32位乘法
UDIV Rd,Rn,Rm @无符号乘法
SDIV Rd,Rn,Rm @有符号除法
逻辑运算指令
AND Rd,Rn @按位与
AND Rd,Rn #immed @按位与
AND Rd,Rn,Rm
ORR Rd,Rn @按位或
ORR Rd,Rn,#immed
ORR Rd,Rn,Rm
BIC Rd,Rn @按位清除
BIC Rd,Rn,#immed
BIC Rd, Rn,Rm
ORN Rd,Rn,#immed @按位或非
ORN Rd,Rn,Rm
EOR Rd,Rn @按位异或
EOR Rd,Rn,#immed
EOR Rd,Rn,Rm