术语
RISC(Reduced Instruction Set Computer,精简指令集计算机)
CISC(Complex Instruction Set Computer,复杂指令集计算机)
RISC优点
- 采用固定长度的指令格式,指令归整、简单、基本寻址方式有2~3种。
- 使用单周期指令,便于流水线操作执行。
- 大量使用寄存器,数据处理指令只对寄存器进行操作,只有加载/ 存储指令可以访问存储器,以提高指令的执行效率。
- 所有的指令都可根据前面的执行结果决定是否被执行,从而提高指令的执行效率。
- 可用加载/存储指令批量传输数据,以提高数据的传输效率。
- 可在一条数据处理指令中同时完成逻辑处理和移位处理。
- 在循环处理中使用地址的自动增减来提高运行效率。
ARM微处理器的寄存器结构
ARM处理器共有37个寄存器,被分为若干个组(BANK),这些寄存器包括:
- 31个通用寄存器,包括程序计数器(PC指针),均为32位的寄存器。
- 6个状态寄存器,用以标识CPU的工作状态及程序的运行状态,均为32位,目前只使用了其中的一部分。
ARM微处理器的指令结构
ARM指令为32位的长度
Thumb指令为16位长度
Thumb指令集为ARM指令集的功能子集,但与等价的ARM代码相比较,可节省30%~40%以上的存储空间,同时具备32位代码的所有优点。
ARM微处理器工作模式
工作模式 | 模式描述 |
---|---|
用户模式(usr) | ARM处理器正常的程序执行状态 |
系统模式(sys) | 运行具有特权的操作系统任务 |
快中断模式(fiq) | 支持高速数据传输或通道处理 |
管理模式(svc) | 操作系统保护模式 |
数据访问终止模式(abt) | 用于虚拟存储器及存储器保护 |
中断模式(irq) | 用于通用的中断处理 |
未定义指令终止模式(und) | 支持硬件协处理器的软件仿真 |
其余6种模式称为非用户模式或特权模式 | 用户模式和系统模式之外的5种模式称为异常模式。 |
ARM微处理器的指令集概述
助记符 | 指令功能描述 |
---|---|
ADC | 带进位加法指令 |
ADD | 加法指令 |
AND | 逻辑与指令 |
B | 跳转指令 |
BIC | 位清零指令 |
BL | 带返回的跳转指令 |
BLX | 带返回和状态切换的跳转指令 |
BX | 带状态切换的跳转指令 |
CDP | 协处理器数据操作指令 |
CMN | 比较反值指令 |
CMP | 比较指令 |
EOR | 异或指令 |
LDC | 存储器到协处理器的数据传输指令 |
LDM | 加载多个寄存器指令 |
LDR | 存储器到寄存器的数据传输指令 |
MCR | 从ARM寄存器到协处理器寄存器的数据传输指令 |
MLA | 乘加运算指令 |
MOV | 数据传送指令 |
MRC | 从协处理器寄存器到ARM寄存器的数据传输指令 |
MRS | 传送CPSR或SPSR的内容到通用寄存器指令 |
MSR | 传送通用寄存器到CPSR或SPSR的指令 |
MUL | 32位乘法指令 |
MLA | 32位乘加指令 |
MVN | 数据取反传送指令 |
ORR | 逻辑或指令 |
RSB | 逆向减法指令 |
RSC | 带借位的逆向减法指令 |
SBC | 带借位减法指令 |
STC | 协处理器寄存器写入存储器指令 |
STM | 批量内存字写入指令 |
STR | 寄存器到存储器的数据传输指令 |
SUB | 减法指令 |
SWI | 软件中断指令 |
SWP | 交换指令 |
TEQ | 相等测试指令 |
TST | 位测试指令 |
指令的条件域
条件码 | 助记符后缀 | 标 志 | 含 义 |
---|---|---|---|
0000 | EQ | Z置位 | 相等 |
0001 | NE | Z清零 | 不相等 |
0010 | CS | C置位 | 无符号数大于或等于 |
0011 | CC | C清零 | 无符号数小于 |
0100 | MI | N置位 | 负数 |
0101 | PL | N清零 | 正数或零 |
0110 | VS | V置位 | 溢出 |
0111 | VC | V清零 | 未溢出 |
1000 | HI | C置位Z清零 | 无符号数大于 |
1001 | LS | C清零Z置位 | 无符号数小于或等于 |
1010 | GE | N等于V | 带符号数大于或等于 |
1011 | LT | N不等于V | 带符号数小于 |
1100 | GT | Z清零且(N等于V) | 带符号数大于 |
1101 | LE | Z置位或(N不等于V) | 带符号数小于或等于 |
1110 | AL | 忽略 | 无条件执行 |
Thumb指令及应用
由于Thumb指令的长度为16位,即只用ARM指令一半的位数来实现同样的功能,所以,要实现特定的程序功能,所需的Thumb指令的条数较ARM指令多。在一般的情况下,Thumb指令与ARM指令的时间效率和空间效率关系为:
—Thumb代码所需的存储空间约为ARM代码的60%~70%
—Thumb代码使用的指令数比ARM代码多约30%~40%
—若使用32位的存储器,ARM代码比Thumb代码快约40%
—若使用16位的存储器,Thumb代码比ARM代码快约40%~50%
—与ARM代码相比较,使用Thumb代码,存储器的功耗会降低约30%
显然,ARM指令集和Thumb指令集各有其优点,若对系统的性能有较高要求,应使用32位的存储系统和ARM指令集,若对系统的成本及功耗有较高要求,则应使用16位的存储系统和Thumb指令集。当然,若两者结合使用,充分发挥其各自的优点,会取得更好的效果。
ARM程序设计基础
在ARM的汇编程序中,有如下几种伪指令:符号定义伪指令、数据定义伪指令、汇编控制伪指令、宏指令以及其他伪指令。
符号定义(Symbol Definition)伪指令
符号定义伪指令用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。常见的符号定义伪指令有如下几种:
—用于定义全局变量的GBLA、GBLL和GBLS。
—用于定义局部变量的LCLA、LCLL和LCLS。
—用于对变量赋值的SETA、SETL、SETS。
—为通用寄存器列表定义名称的RLIST。
数据定义(Data Definition)伪指令
数据定义伪指令一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。常见的数据定义伪指令有如下几种:
—DCB 用于分配一片连续的字节存储单元并用指定的数据初始化。
—DCW(DCWU) 用于分配一片连续的半字存储单元并用指定的数据初始化。
—DCD(DCDU) 用于分配一片连续的字存储单元并用指定的数据初始化。
—DCFD(DCFDU)用于为双精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。
—DCFS(DCFSU) 用于为单精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。
—DCQ(DCQU) 用于分配一片以8字节为单位的连续的存储单元并用指定的数据初始化。
—SPACE 用于分配一片连续的存储单元
—MAP 用于定义一个结构化的内存表首地址
—FIELD 用于定义一个结构化的内存表的数据域
汇编控制(Assembly Control)伪指令
汇编控制伪指令用于控制汇编程序的执行流程,常用的汇编控制伪指令包括以下几条:
—IF、ELSE、ENDIF
—WHILE、WEND
—MACRO、MEND
—MEXIT
其他常用伪指令
—AREA
—ALIGN
—CODE16、CODE32
—ENTRY
—END
—EQU
—EXPORT(或GLOBAL)
—IMPORT
—EXTERN
—GET(或INCLUDE)
—INCBIN
—RN
—ROUT