tyw藏书
2.2 ARM 指令集
2.2.1 ARM 微处理器的指令集概述
ARM 微处理器的指令集主要有 6 大类。
• 跳转指令
• 数据处理指令
• 程序状态寄存器(PSR)处理指令
• 加载/存储指令
• 协处理器指令
• 异常产生指令
具体的指令及功能如表 2.2 所示(表中指令为基本 ARM 指令,不包括派生的 ARM 指令)。
表 2.2 ARM 指令及其功能描述
指 令 指令功能描述
ADC 带进位加法指令
ADD 加法指令
AND 逻辑与指令
B 跳转指令
BIC 位清零指令
BL 带返回的跳转指令
BLX 带返回和状态切换的跳转指令
BX 带状态切换的跳转指令
CDP 协处理器数据操作指令
CMN 比较反值指令
tyw藏书
CMP 比较指令
EOR 异或指令
LDC 存储器到协处理器的数据传输指令
LDM 加载多个寄存器指令
LDR 存储器到寄存器的数据传输指令
MCR 从 ARM 寄存器到协处理器寄存器的数据传输指令
MLA 乘加运算指令
MOV 数据传送指令
MRC 从协处理器寄存器到 ARM 寄存器的数据传输指令
MRS 传送 CPSR 或 SPSR 的内容到通用寄存器指令
MSR 传送通用寄存器到 CPSR 或 SPSR 的指令
MUL 32 位乘法指令
MVF 传送值到浮点数寄存器
MVN 数据取反传送指令
ORR 逻辑或指令
RSB 逆向减法指令
RSC 带借位的逆向减法指令
SBC 带借位减法指令
STC 协处理器寄存器写入存储器指令
STM 批量内存字写入指令
STR 寄存器到存储器的数据传输指令
续表
指 令 指令功能描述
SUB 减法指令
SWI 软件中断指令
SWP 交换指令
TEQ 相等测试指令
TST 位测试指令
2.2.2 ARM 指令寻址方式
1.立即数寻址
ARM 指令的立即数寻址是一种特殊的寻址方式,操作数本身就在指令中给出,只要取
tyw藏书
出指令也就取到了操作数。这个操作数被称为立即数。
ADD R0,R0,#1 ;R0←R0 + 1 ADD R0,R0,#0x3A ;R0←R0 + 0x3A
在以上 2 条指令中,第 2 个源操作数即为立即数,实际使用时以“#”符号为前缀。
2.寄存器寻址
寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采 用的一种方式,也是一种执行效率较高的寻址方式。如以下的指令。
ADD R0,R1,R2 ;R0←R1 + R2
该指令的执行效果是将寄存器 R1 和 R2 的内容相加,其结果存放在寄存器 R0 中。
3.寄存器间接寻址
寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器 中。例如以下指令。
ADD R0,R1,[R2] ;R0←R1 + [R2]
LDR R0,[R1] ;R0←[R1]
在第 1 条指令中,以寄存器 R2 的内容作为操作数的地址,然后与 R1 相加,其结果存入 寄存器 R0 中。
第 2 条指令将以 R1 的值为地址的存储器中的内容送到寄存器 R0 中。
4.基址变址寻址
基址变址的寻址方式就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给 出的地址偏移量相加,从而得到一个操作数的有效地址。如下面的几条指令所示。
LDR R0,[R1,#0x0A] ;R0←[R1 + 0x0A]
LDR R0,[R1,#0x0A]! ;R0←[R1 + 0x0A]、R1←R1 + 0x0A
在第 1 条指令中,将寄存器 R1 的内容加上 0x3A 形成操作数的有效地址,将该地址处的 操作数送到寄存器 R0 中。
在第 2 条指令中,将寄存器 R1 的内容加上 0x0A 形成操作数的有效地址,从而取得操作 数存入寄存器 R0 中,然后,R1 的内容自增 0x0A 个字节。
5.多寄存器寻址
采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。这种寻址方式可以用 一条指令完成传送最多 16 个通用寄存器的值。比如下面的指令。
LDMIA R0,{R1,R2,R3,R4} ;R1←[R0]
;R2←[R0 + 4]
tyw藏书
;R3←[R0 + 8]
;R4←[R0 + 12]
该指令的后缀 IA 表示在每次执行完加载/存储操作后,R0 按字长度增加,因此,指令可 将连续存储单元的值传送到 R1~R4。
6.相对寻址
与基址变址寻址方式相类似,相对寻址以程序计数器 PC 的当前值为基地址,指令中的 地址标号作为偏移量,将两者相加之后得到操作数的有效地址。比如下面的程序段完成子程 序的调用和返回,跳转指令 BL 采用了相对寻址方式。
BL NEXT ;跳转到子程序 NEXT 处执行
……
NEXT ……
MOV PC,LR ;从子程序返回
7.堆栈寻址
堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称 作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。
根 据堆栈的 生成方 式,堆栈 又可以 分为递 增堆栈( Ascending Stack) 和 递减堆 栈
(Decending Stack),当堆栈由低地址向高地址生成时,称为递增堆栈;当堆栈由高地址向低 地址生成时,称为递减堆栈。这样就有 4 种类型的堆栈工作方式,ARM 微处理器支持以下 4 种类型的堆栈工作方式。
(1)满递增堆栈:堆栈指针指向最后压入的数据,并且堆栈以递增方式向上生成。
(2)满递减堆栈:堆栈指针指向最后压入的数据,并且堆栈以递减方式向下生成。
(3)空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址 生成。
(4)空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址 生成。
2.2.3 Thumb 指令概述
作为 32 位的嵌入式处理器,ARM 具有 32 位数据总线宽度,但是为了更好地兼容数据 总线宽度为 16 位的应用系统,ARM 体系结构除了支持执行效率很高的 32 位 ARM 指令集以 外,同时支持 16 位的 Thumb 指令集。Thumb 指令集是 ARM 指令集的一个子集,允许指令 编码为 16 位的长度。与等价的 32 位代码相比较,Thumb 指令集在保留 32 代码优势的同时,
可以在很大程度上节省系统的存储空间。当处理器在执行 ARM 程序段时,称 ARM 处理器处 于 ARM 工作状态;当处理器在执行 Thumb 程序段时,称 ARM 处理器处于 Thumb 工作状态。
所有的 Thumb 指令都有对应的 ARM 指令,而且 Thumb 的编程模型也对应于 ARM 的编 程模型,在应用程序的编写过程中,只要遵循一定调用的规则,Thumb 子程序和 ARM 子程
tyw藏书
序就可以互相调用,二者结合应用可以充分发挥各自的特点,取得较好的效果。