7.1 数据处理指令
7.1.1 数据传送类
MOV 类指令:核内寄存器间的数据传送
加载和存储指令(L/S):核内寄存器与挂在存储器总线上器件的数据传送
注意:
核内寄存器就是 R0-R15
外设寄存器入 GPIO 的寄存器
7.1.2 算术逻辑运算类
ADD:假发指令
MOV R0,#0x01
ADD R0,R0.#0x01
SUB:减法指令
MUL:乘法指令
AND:按位与指令
ORR:按位或指令
EOR:按位异或指令
BIC:清零指令
BIC R1,R1,#0x0f
最低 4 位清零
注意:ARM 指令集中没有除法指令,通过软件(移位-比较-相减)实现,不过在 ARMV7 指令集中增加了除法指令
7.1.3 比较指令
CMP:比较两个数,会影响标志位
TST:测试某一位是否为0,常与 EQ, NE 等条件码结合使用
TEQ:判断两个数的位值是否相等,与 EQ, NE 条件码结合使用
注意:它们不需要加后缀 S,它们会直接影响程序状态寄存器,常用于选择/循环结构
7.2 跳转指令
B:直接跳到要执行的指令处
BL:待返回的跳转指令,相当于 C 语言的函数调用
BX:改变状态的跳转,把 RN 的值赋值给 R15(PC),然后改变 CPSR 的 T位, T 位由 RN 里面的最低为即 bit 0 决定
Rn[0] = 1, THUMB 状态(在原有的 Rn 上加 1 即可)
Rn[0] = 0,ARM 状态
BX R0 跳到 R0 地址处
1110 0001 0010 1111 1111 1111 0001 0000
BLX:带返回的改变状态的跳转
7.3 协处理指令
协处理器是协助主 CPU 完成一些特定功能(MMU、Cache 和 TLB 等等)的处理器
功能上和操作系统的虚拟地址映射、Cache 管理等有关。
主要的指令有三类
数据操作指令:ARM 处理器通过 CDP 命令通知协处理器完成一些初始化操作,命令的解析由协处理器完成
存储器数据传送指令:ARM 处理器通过 LDC/STC 指令将内存单元的数据读取或者写入到协处理器的寄存器中
寄存器数据传送指令:ARM 处理器通过 MCR/MRC 指令将 ARM 处理器中的寄存器数据与协处理器中的寄存器数据进行数据传送
协处理器有 16 个,一般 CP15 是设置 MMU, Cache, 大小端等关于存储器配置的。
CP15 包含 16 个 32 位寄存器, C0 - C15
MCR{cond} coproc, opcode1, Rd, CRn, CRm, opcode2
MRC{cond} coproc, opcode1, Rd, CRn, CRm, opcode2
coproc:指令操作的协处理器名,标准名为 pn, n 为 0 ~ 15
opcode1:协处理器的特定操作码,对于 CP15 寄存器来说, opcode 永远为0,不为 0 时,操作不可预知
Rd:CPU 的寄存器
CRn:存放第一个操作数的协处理器寄存器
CRm:存放第二个操作数的协处理器,用来区分同一个编号的不同物理寄存器,当不需要提供附加信息时,指定为 C0
opcode2:可选的协处理器操作码,用来区分同一个编号的不同物理寄存器,当不需要提供附加信息时,指定为 0
7.4 杂项指令
7.4.1 软中断
SWI:软中断,一般用于系统调用,有两种方式完成:
MOV R0, #0x12
MOV R1, #0x01
SWI 0x00 产生中断,模式变成 SVC,跳到中断向量位置去
MOV R0, #0x01 设置子功能为 0x01
SWI 0x12 调用 0x12 软中断
方式一:
方式二:
7.4.2 寄存器与 PSR 数据传送
指令:MRS 和 MSR
PSR 的控制域(fsxc):
位【31:24】位条件标志位域,用 f 表示;
位【23:16】为状态位域,用 s 表示;
位【15:8】为扩展位域,用 x 表示;
位【7:0】位控制位域,用 c 表示
mrc r0, cpsr 将 cpsr 的值存入到 r0 中
msr cpsr_c, #0xd3 将立即数 0xd3 放入到 cpsr 的 C 控制域中
7.5 伪指令
伪指令不是 ARM 指令,但可以把它当作指令来使用,主要作用是方便编写程序,最终还是会转换成 ARM 指令
LDR R0,=0x12345678 ;绝对地址
ADR R0,xxx(地址标号) ;相对地址
ADRL R0, xxx(地址标号) ;相对地址
NOP ;MOV R0, R0
区分:
adr r0, _start ;取运行地址
ldr r1, _start ;取得运行地址中的值(指令)
ldr r2, = start ;取的是链接地址