介绍
本章是整个ARM嵌入式系统开发手册中最基本的章节。在做嵌入式研发无论是深度优化还是高效算法都需要本章知识为基础。这里介绍了最常用和实用的ARM 指令。
指令系统
一个CPU所能够处理的全部指令集合,比如多数个人电脑采用的是x86指令集。CPU对指令需要进行译码才能运行。
- 指令分类 :CISC(复杂指令集)和RISC(精简指令集)。
寄存器
CPU的一个组成部分,里面存放着指令、数据和地址等供CPU计算使用,速度比较快。
- 寄存器分类:通用寄存器(完成通用的计算功能,谁都可以使用)和 专用寄存器(状态寄存器,下一条执行指令寄存器,栈寄存器等,不能随便修改)。
不同的ARM架构支持不同的指令,然而,新的版本通常加一些新的指令保留向下兼容。ARMv4T架构应在ARMv5TE处理器上执行。下表展示的完整的可用的ARM指令为ARMv5TE指令集集架构(ISA)。
ISA包括了所有的核心指令。
我们发现处理器操作使用了pre-conditions和post-conditions来描述指令执行前后的寄存器和存储器。
PRE <pre-conditions>
<instructon/s>
PRO <post-conditions>
在pre- 和 post-conditions,存储器表示为:
mem<data_size>[addresses]
data_size比特的存储器起始地址为addresses 字节。比如:mem32[1024]为起始地址为1KB的32位存储器。
ARM指令处理在寄存器中的数据,并且只能使用加载(load)和存储(store)指令来访问存储器。ARM指令集通常有两个或者三个操作数(operands)。
在上述指令中,ADD指令是将 r1 和 r2 寄存器(source源寄存器)中的值相加,然后把结果写回到r3 (destination 目标寄存器)。
ARM 汇编特点1:LDR/STR架构
ARM采用RISC架构,CPU本身不能直接读取内存,而需要先将内存中内容加载入CPU中通用寄存器中才能被CPU处理。
- ldr(load register)指令将内存内容加载入通用寄存器。
- str(store register)指令将寄存器内容存入内存空间中。
- ldr/str组合用来实现 ARM CPU和内存数据交换
ARM 汇编特点2:指令后缀
同一指令经常附带不同后缀,变成不同的指令。经常使用的后缀有:
- B(byte)功能不变,操作长度变为8位
- H(Half word)功能不变,长度变为16位
- S(Signed)功能不变,操作数变为有符号
如ldr, ldrb, ldrh, ldrsb, ldrsh - S(S标志)功能不变,影响CPSR标志位,如mov, movs
AEM 汇编特点3:条件后缀
- EQ 相等
- NE 不相等
- CS/HS 无符号数大于或等于
- CC/LO 无符号数小于
- MI 负数
- PL 正数或零
- VS 溢出
- VC 没有溢出
- HI 无符号数大于
- LS 无符号数小于或等于
- GE 有符号数大于或等于
- LT 有符号数小于
- GT 有符号数大于
- LE 有符号数小于或等于
- AL 无条件执行(指令默认条件)
- NV 从不执行(不要使用)
- 例子:moveq r0, r1 @如果eq后缀成立,则直接执行mvo r0, r1; 如果eq不成立则本句代码直接作废,相当于没有。
- 条件后缀执行注意两点:
1.条件后缀是否成立,不是取决于本句代码,而是取决于这句代码之前的代码运行后的结果。
2.条件后缀决定了这句代码是否被执行,而不影响其他代码的执行。 - 多级指令流水线:为增加处理器指令流的速度,ARM使用多级流水线
ARM 指令集分类
ARM指令集根据指令的类别来划分为以下几类
1.数据处理指令(data processing instructions)
2.分支指令(branch instructions)
3.访存指令(load-store instructions)
4.软件中断指令(software interrupt instructions)
5.程序状态寄存器指令(program status instructions)
将通过3.1~3.5 五个笔记对每个类进行详解。