基本指令
数据传输指令
-
MOV
: 将立即数或寄存器值移动到寄存器中。- 示例:
MOV R6, #0x80
- 解释: 将立即数
0x80
加载到寄存器R6
中。
- 解释: 将立即数
- 示例:
-
MRS
: 从特殊寄存器读取值到通用寄存器。- 示例:
MRS R5, APSR
- 解释: 读取特殊寄存器
APSR
的值,并存入寄存器R5
中。
- 解释: 读取特殊寄存器
- 示例:
-
LDR
: 从内存加载值到寄存器。- 示例:
LDR R2, =0x12345678
- 解释: 将立即数
0x12345678
加载到寄存器R2
中,通常是通过伪指令实现。
- 解释: 将立即数
- 示例:
-
STR
: 将寄存器值存储到内存地址。- 示例:
STR R0, [R1, R2, LSL #2]
- 解释: 将寄存器
R0
的值存储到内存地址[R1 + (R2 << 2)]
中。
- 解释: 将寄存器
- 示例:
浮点操作指令
-
VMOV.F32
: 移动浮点数值到浮点寄存器。- 示例:
VMOV.F32 S2, #0.5
- 解释: 将浮点数值
0.5
移动到浮点寄存器S2
。
- 解释: 将浮点数值
- 示例:
-
VMRS
: 将浮点状态寄存器的标志位更新到APSR。- 示例:
VMRS APSR_nzcv, FPSCR
- 解释: 将浮点状态寄存器
FPSCR
的标志位更新到APSR_nzcv
中。
- 解释: 将浮点状态寄存器
- 示例:
存储器访问指令
-
LDRSH
: 加载内存中的有符号半字到寄存器。- 示例:
LDRSH R2, [R2, #16]
- 解释: 从内存地址
[R2 + 16]
读取一个有符号的半字数据,存入寄存器R2
。
- 解释: 从内存地址
- 示例:
-
LDRB
: 从内存加载1字节到寄存器。- 示例:
LDRB R5, [R6]
- 解释: 从内存地址
[R6]
读取1字节数据,并存入寄存器R5
。
- 解释: 从内存地址
- 示例:
-
ADD
: 将两个操作数相加,结果存入寄存器。- 示例:
ADD R2, R2, #16
- 解释: 将寄存器
R2
的值与立即数16
相加,并将结果存入寄存器R2
。
- 解释: 将寄存器
- 示例:
栈操作
进栈操作
-
STMFD
: 多寄存器存储到栈中,递减栈指针。- 示例:
STMFD SP!, {R2, R4, R5, R6, R8}
- 解释: 将寄存器
R2
,R4
,R5
,R6
, 和R8
的值存入栈中,并递减栈指针SP
。
- 解释: 将寄存器
- 示例:
-
PUSH
: 将指定寄存器的值进栈。- 示例:
PUSH {R2, R4, R5, R6, R8}
- 解释: 将寄存器
R2
,R4
,R5
,R6
, 和R8
的值存入栈中。
- 解释: 将寄存器
- 示例:
条件指令
条件跳转
- 根据比较结果进行跳转。
IT块
- 用于条件执行多条指令。
特殊操作
PC相关地址访问
- 从程序计数器(
PC
)相关的地址加载值。- 示例:
LDR R1, [PC, #6]
- 解释: 从当前程序计数器地址加上偏移量
6
的内存位置读取一个字数据,并存入寄存器R1
。
- 解释: 从当前程序计数器地址加上偏移量
- 示例:
非乘法实现乘法
- 使用移位和加法实现乘法运算。
- 示例: 将
R6 * 9
实现:MOV R7, R6 ; R7 = R6 ADD R7, R7, R6 ; R7 = R6 * 2 ADD R7, R7, R6 ; R7 = R6 * 3 ADD R7, R7, R6 ; R7 = R6 * 9
- 解释
第一步: 将 R6 的值复制到 R7。
第二步: 将 R7 的值加上 R6,得到 R6 * 2。
第三步: 再次加上 R6,得到 R6 * 3。
第四步: 最后再加上 R6,得到 R6 * 9。