1.内部数据传输
1.1 MOV
用于将数据从一个寄存器拷贝到宁外一个寄存器。
MOV R0,R1 @R0 = R1
MOV R0, #0X12 @R0 = 0X12
1.2 MRS
用于将 特殊寄存器(CPSR,SPSR)中的数据传递给通用寄存器。(读取特殊寄存器值)
MRS CPSR,R0
1.3 MSR
用于将普通寄存器的数据传递给特殊寄存器(写特殊寄存器)
MSR CPSR,R0
2.存储器访问
由于ARM不能直接访问存储器,一般汇编配置借助存储器访问指令。先将配置值写入到Rx(0-12)中,然后借助存储器访问指令写入到寄存器中。
2.1 LDR
用于从存储器中加载数据到寄存器RX中。
LDR R0,=0x20000000 @将寄存器地址加载到R0中
LDR R1,[R0] @ 读取地址0x20000000的数据到R1寄存器中
2.2 STR
用于写入数据到存储器。
LDR R0, =0X20000000 @将寄存器地址加载到R0中
LDR R1, =0XFFFFFFFF @ R1 保存写入的数据 R1 = 0XFFFFFFFF
STR R1,[R0] @ 将R1的值写入到R0所保存的地址中
3.压栈出栈
3.1 push
保存寄存器值,将寄存器值压入栈中,从SP指针向下增长。
push {lr}
push {r0~r3,r12}
3.2 pop
取出寄存器保存值
pop {lr} @ 先恢复lr
pop {r0~r3,r12}
4.跳转
4.1 B
B指令用于跳转到目标地址,调用函数不返回原来执行处,使用B指令。
_start:
LDR SP,=0X80200000 @设置栈指针
b main @跳转到main函数
4.2 BL
跳转目标地址,并保存返回地址到LR中。可以通过加载LR的值继续从跳转之前的代码运行。
psuh {r0,r1} @保存r0,r1
cps #0x13 @进入SVC模式,允许其他中断再次进去
bl system_irqhander @加载C语言中断处理函数
cps #0x12 @进入IRQ模式
pop {r0,r1}
str r0,[r1,#0x10]