1、ARM指令集特点
(1)指令码长度固定,如32bit
(2)几乎所有指令都是有条件执行
(3)寄存器与内存之间交换数据采用专用指令集
2、指令格式
<opcode>{<cond>}(S) <Rd>,<Rn>{,<operand2>}
opcode: 指令助记符
cond: 执行条件
S: 是否影响CPSR寄存器(当MDK
程序状态)的值
Rd: 目标寄存器
Rn: 第1个操作数的寄存器
operand2: 第2个操作数
3、数据传送指令
指令 | 功能 | 实例 | 注释 |
---|---|---|---|
mov | 给一个寄存器赋值 | move r0, #10 | |
mvn | 把一个数值按位取反后赋值给一个寄存器 | mvn r0, #0xff | R0 = ~0xff |
add | 计算两个数值的加法 | add r0, r0, #10 add r0, r0, r1 | R0 = r0 + 10 R0 = r0 + r1 |
sub | 计算两个数值的减法 | sub r0, r0, #10 sub r0, r0, r1 | R0 = r0 - 10 R0 = r0 - r1 |
mul | 乘法 | mul r0, r1, r2 | R0 = r1 * r2 |
往寄存器存放数据的三种方式:
(1)mov 有效的立即数
(2)mvn 立即数的按位取反的数
(3)ldr 任何数
4、数据运算指令
指令 | 功能 | 实例 | 注释 |
---|---|---|---|
orr | 按位或 | Orr r0, r0, r1 Orr r0, r0, #10 | R0 = r0 I r1 R0 = r0 I 10 |
and | 按位与 | And r0, r0, r1 And r0, r0, #10 | R0 = r0 & r1 R0 = r0 & 10 |
bic | 位取反 | Bic r0, r0, r1 Bic r0, r0, #10 | R0 = r0 & (~r1) R0 = r0 & (~10) |
5、内存操作指令
指令 | 功能 | 实例 | 注释 |
---|---|---|---|
swp Rd, Rm, [Rn] | 将寄存器中的值与内存地址中的值交换 | swp r0, r1, [r2] | r0 = *r2 *r2 = r1 |
ldr | 把数据从内存加载到寄存器 | ldr r0, =addr ldr r1, [r0] ldr r1, [r0, #4] ldr r1, [r0, #4]! ldr r1, [r0], #4 | R0 = addr R1 = *r0 R1 = *(r0+4) ldr r1, [r0, #4]! ldr r1, [r0], #4 |
str | 把数据从寄存器保存到内存 | str r1, [r0]; | *r0 = r1; |
ldmfd | 把数据从内存加载到寄存器 | Ldmfd sp!, {r0-r12, lr} | 把寄存器的值放到慢递减栈中 |
stmfd | 把数据从寄存器保存到内存 | Stmfd sp!, {r0-r12, lr} | 从慢递减栈中把值取到寄存器 |
6、跳转指令
指令 | 功能 | 实例 | 注释 |
---|---|---|---|
b | 跳转 | B lable | 跳到lable处执行 |
bl | 跳转并保存返回地址 | Bl lable | 保存下一条指令的地址到lr,并跳转到lable处执行 |
b和bl都是相对跳转,通过偏移量跳转,最大跳转距离是-32MB~32MB
mov和ldr为绝对跳转,会修改pc指针
b, mov和ldr都不会保存返回地址,bl会保存返回地址