综合资讯 技术文章 原文阅读 在线商城 下载专区 DATASHEET 技术论坛 商务频道

电子技术 | 技术资料 | 嵌入式系统 | 单片机专题 | DSP专题
EDA/PLD专题 | 电源技术专题 | 电子制作专题 | 其他综合 | 芯片选型

所在的位置:首页在线阅读嵌入式系统ARM应用系统开发详解正文
 
第3章 ARM微处理器的指令系统

本章介绍ARM指令集、Thumb指令集,以及各类指令对应的寻址方式,通过对本章的阅读,希望读者能了解ARM微处理器所支持的指令集及具体的使用方法。

本章的主要内容有:

  ARM指令集、Thumb指令集概述。

  ARM指令集的分类与具体应用。

  Thumb指令集简介及应用场合。

3.1  ARM微处理器的指令集概述

3.1.1  ARM微处理器的指令的分类与格式

ARM微处理器的指令集是加载/存储型的,也即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,而对系统存储器的访问则需要通过专门的加载/存储指令来完成。

ARM微处理器的指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产生指令六大类,具体的指令及功能如表3-1所示(表中指令为基本ARM指令,不包括派生的ARM指令)。

3-1   ARM指令及功能描述

助记符

指令功能描述

ADC

带进位加法指令

ADD

加法指令

AND

逻辑与指令

B

跳转指令

BIC

位清零指令

BL

带返回的跳转指令

BLX

带返回和状态切换的跳转指令

BX

带状态切换的跳转指令

CDP

协处理器数据操作指令

CMN

比较反值指令

CMP

比较指令

EOR

异或指令

LDC

存储器到协处理器的数据传输指令

LDM

加载多个寄存器指令

LDR

存储器到寄存器的数据传输指令

MCR

ARM寄存器到协处理器寄存器的数据传输指令

MLA

乘加运算指令

MOV

数据传送指令

MRC

从协处理器寄存器到ARM寄存器的数据传输指令

MRS

传送CPSRSPSR的内容到通用寄存器指令

MSR

传送通用寄存器到CPSRSPSR的指令

MUL

32位乘法指令

MLA

32位乘加指令

MVN

数据取反传送指令

ORR

逻辑或指令

RSB

逆向减法指令

RSC

带借位的逆向减法指令

SBC

带借位减法指令

STC

协处理器寄存器写入存储器指令

STM

批量内存字写入指令

STR

寄存器到存储器的数据传输指令

SUB

减法指令

SWI

软件中断指令

SWP

交换指令

TEQ

相等测试指令

TST

位测试指令

3.1.2  指令的条件域

当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行。当指令的执行条件满足时,指令被执行,否则指令被忽略。

每一条ARM指令包含4位的条件码,位于指令的最高4[31:28]。条件码共有16种,每种条件码可用两个字符表示,这两个字符可以添加在指令助记符的后面和指令同时使用。例如,跳转指令B可以加上后缀EQ变为BEQ表示“相等则跳转”,即当CPSR中的Z标志置位时发生跳转。

16种条件标志码中,只有15种可以使用,如表3-2所示,第16种(1111)为系统保留,暂时不能使用。

3-2        指令的条件码

条件码

助记符后缀

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

忽略

无条件执行

3.2  ARM指令的寻址方式

       所谓寻址方式就是处理器根据指令中给出的地址信息来寻找物理地址的方式。目前ARM指令系统支持如下几种常见的寻址方式。

3.2.1  立即寻址

       立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。例如以下指令:

ADD R0R0,#1          R0R01

ADD R0R0,#0x3f       R0R00x3f

       在以上两条指令中,第二个源操作数即为立即数,要求以“#”为前缀,对于以十六进制表示的立即数,还要求在“#”后加上“0x”或“&”。

3.2.2  寄存器寻址

       寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。以下指令:

ADD R0R1R2           R0R1R2

       该指令的执行效果是将寄存器R1R2的内容相加,其结果存放在寄存器R0中。

3.2.2  寄存器间接寻址

       寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令:

ADD R0R1[R2]         R0R1[R2]

LDR  R0[R1]               R0[R1]

STR  R0[R1]               [R1]R0

在第一条指令中,以寄存器R2的值作为操作数的地址,在存储器中取得一个操作数后与R1相加,结果存入寄存器R0中。

第二条指令将以R1的值为地址的存储器中的数据传送到R0中。

第三条指令将R0的值传送到以R1的值为地址的存储器中。

3.2.3  基址变址寻址

       基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。采用变址寻址方式的指令常见有以下几种形式,如下所示:

LDR R0[R1,#4]            R0[R14]

LDR R0[R1,#4]          R0[R14]R1R14

LDR R0[R1] ,#4           R0[R1]R1R14

LDR R0[R1R2]             R0[R1R2]

在第一条指令中,将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作数存入寄存器R0中。

在第二条指令中,将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增4个字节。

在第三条指令中,以寄存器R1的内容作为操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增4个字节。

在第四条指令中,将寄存器R1的内容加上寄存器R2的内容形成操作数的有效地址,从而取得操作数存入寄存器R0中。

3.2.4  多寄存器寻址

采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。这种寻址方式可以用一条指令完成传送最多16个通用寄存器的值。以下指令:

LDMIA R0{R1R2R3R4}       R1[R0]

                                R2[R04]

                                     R3[R08]

                                     R4[R012]

该指令的后缀IA表示在每次执行完加载/存储操作后,R0按字长度增加,因此,指令可将连续存储单元的值传送到R1R4

3.2.5  相对寻址

与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式:

BL  NEXT                    ;跳转到子程序NEXT处执行

……                        

NEXT

……                            

MOV  PCLR                      ;从子程序返回

3.2.6  堆栈寻址

堆栈是一种数据结构,按先进后出(First In Last OutFILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。

当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack),而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(Empty Stack)。

同时,根据堆栈的生成方式,又可以分为递增堆栈(Ascending  Stack)和递减堆栈(Decending Stack),当堆栈由低地址向高地址生成时,称为递增堆栈,当堆栈由高地址向低地址生成时,称为递减堆栈。这样就有四种类型的堆栈工作方式,ARM微处理器支持这四种类型的堆栈工作方式,即:

    满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生成。

    满递减堆栈:堆栈指针指向最后压入的数据,且由高地址向低地址生成。

    空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。

    空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。

3.3  ARM指令集

本节对ARM指令集的六大类指令进行详细的描述。

3.3.1  跳转指令

       跳转指令用于实现程序流程的跳转,在ARM程序中有两种方法可以实现程序流程的跳转:

       使用专门的跳转指令。

       直接向程序计数器PC写入跳转地址值。

通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用

MOV   LRPC

等类似指令,可以保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用。

       ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括以下4条指令:

           B