您的位置 首页 新品

ARM使用系统开发详解:第3章 ARM微处理器的指令系统

3.1ARM微处理器的指令集概述3.1.1ARM微处理器的指令的分类与格式助记符指令功能描述ADC带进位加法指令ADD加法指令AND逻辑与指令B跳转指令BI…

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

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

助记符

指令功用描绘

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

位测验指令

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.2ARM指令的寻址办法

所谓寻址办法便是处理器依据指令中给出的地址信息来寻觅物理地址的办法。现在ARM指令体系支撑如下几种常见的寻址办法。

3.2.1当即寻址

当即寻址也叫当即数寻址,这是一种特别的寻址办法,操作数自身就在指令中给出,只需取出指令也就取到了操作数。这个操作数被称为当即数,对应的寻址办法也就叫做当即寻址。例如以下指令:

ADDR0,R0,#1;R0←R0+1

ADDR0,R0,#0x3f;R0←R0+0x3f

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

3.2.2寄存器寻址

寄存器寻址便是运用寄存器中的数值作为操作数,这种寻址办法是各类微处理器常常选用的一种办法,也是一种碑文功率较高的寻址办法。以下指令:

ADDR0,R1,R2;R0←R1+R2

该指令的碑文作用是将寄存器R1和R2的内容相加,其成果寄存在寄存器R0中。

3.2.2寄存器直接寻址

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

ADD R0,R1,[R2];R0←R1+[R2]

LDRR0,[R1];R0←[R1]

STRR0,[R1];[R1]←R0

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

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

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

3.2.3基址变址寻址

基址变址寻址便是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,然后得到一个操作数的有用地址。变址寻址办法常用于拜访某基地址邻近的地址单元。选用变址寻址办法的指令常见有以下几种办法,如下所示:

LDR R0,[R1,#4];R0←[R1+4]

LDR R0,[R1,#4]!;R0←[R1+4]、R1←R1+4

LDR R0,[R1],#4;R0←[R1]、R1←R1+4

LDR R0,[R1,R2];R0←[R1+R2]

在榜首条指令中,将寄存器R1的内容加上4构成操作数的有用地址,然后获得操作数存入寄存器R0中。

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

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

在第四条指令中,将寄存器R1的内容加上寄存器R2的内容构成操作数的有用地址,然后获得操作数存入寄存器R0中。

3.2.4多寄存器寻址

选用多寄存器寻址办法,一条指令能够完结多个寄存器值的传送。这种寻址办法能够用一条指令完结传送最多16个通用寄存器的值。以下指令:

LDMIA R0,{R1,R2,R3,R4};R1←[R0]

;R2←[R0+4]

;R3←[R0+8]

;R4←[R0+12]

该指令的后缀IA一共在每次碑文完加载/存储操作后,R0按字长度添加,因而,指令可将接连存储单元的值传送到R1~R4。

3.2.5相对寻址

与基址变址寻址办法相相似,相对寻址以程序计数器PC的当时值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有用地址。以下程序段完结子程序的调用和回来,跳转指令BL选用了相对寻址办法:

BLNEXT;跳转到子程序NEXT处碑文

……

NEXT

……

MOVPC,LR;从子程序回来

3.2.6仓库寻址

仓库是一种数据结构,按先进后出(First In Last Out,FILO)的办法作业,运用一个称作仓库指针的专用寄存器指示当时的操作方位,仓库指针总是指向栈顶。

当仓库指针指向最终压入仓库的数据时,称为满仓库(Full Stack),而当仓库指针指向下一个酿制放入数据的空方位时,称为空仓库(Empty Stack)。

一起,依据仓库的生成办法,又能够分为递加仓库(AscendingStack)和递减仓库(Decending Stack),当仓库由低地址向高地址生成时,称为递加仓库,当仓库由高地址向低地址生成时,称为递减仓库。这样就有四种类型的仓库作业办法,ARM微处理器支撑这四种类型的仓库作业办法,即:

-满递加仓库:仓库指针指向最终压入的数据,且由低地址向高地址生成。

-满递减仓库:仓库指针指向最终压入的数据,且由高地址向低地址生成。

-空递加仓库:仓库指针指向下一个酿制放入数据的空方位,且由低地址向高地址生成。

-空递减仓库:仓库指针指向下一个酿制放入数据的空方位,且由高地址向低地址生成。

3.3ARM指令集

本节对ARM指令集的六大类指令进行具体的描绘。

3.3.1跳转指令

跳转指令用于完结程序流程的跳转,在ARM程序中有两种办法能够完结程序流程的跳转:

—运用专门的跳转指令。

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

经过向程序计数器PC写入跳转地址值,能够完结在4GB的地址空间中的恣意跳转,在跳转之前结合运用

MOVLR,PC

等相似指令,能够保存将来的回来地址值,然后完结在4GB接连的线性地址空间的子程序调用。

ARM指令拘押的跳转指令能够完结从当时指令向前或向后的32MB的地址空间的跳转,包含以下4条指令:

—B跳转指令

—BL带回来的跳转指令

—BLX带回来和状况切换的跳转指令

—BX带状况切换的跳转指令

1、B指令

B指令的格局为:

B{条件}方针地址

B指令是最简略的跳转指令。一旦遇到一个B指令,ARM处理器将当即跳转到给定的方针地址,从那里持续碑文。留意存储在跳转指令中的实践值是相对当时PC值的一个偏移量,而不是一个肯定地址,它的值由汇编器来核算(参阅寻址办法中的相对寻址)。它是24位有符号数,左移两位后有符号扩展为32位,一共的有用偏移为26位(前后32MB的地址空间)。以下指令:

BLabel;程序无条件跳转到标号Label处碑文

CMPR1,#0;当CPSR寄存器中的Z条件码置位时,程序跳转到标号Label处碑文

BEQLabel

2、BL指令

BL指令的格局为:

BL{条件}方针地址

BL是另一个跳转指令,但跳转之前,会在寄存器R14中保存PC的当时内容,因而,能够经过将R14的内容从头加载到PC中,来回来到跳转指令之后的那个指令处碑文。该指令是完结子程序调用的一个根本但常用的手法。以下指令:

BLLabel;当程序无条件跳转到标号Label处碑文时,一起将当时的PC值保存到R14中

3、BLX指令

BLX指令的格局为:

BLX方针地址

BLX指令从ARM指令集跳转到指令中所指定的方针地址,并将处理器的作业状况有ARM状况切换到Thumb状况,该指令一起将PC的当时内容保存到寄存器R14中。因而,当子程序运用Thumb指令集,而调用者运用ARM指令集时,能够经过BLX指令完结子程序的调用和处理器作业状况的切换。一起,子程序的回来能够经过将寄存器R14值到PC中来完结。

4、BX指令

BX指令的格局为:

BX{条件}方针地址

BX指令跳转到指令中所指定的方针地址,方针地址处的指令既能够是ARM指令,也能够是Thumb指令。

3.3.2数据处理指令

数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令等。

数据传送指令用于在寄存器和存储器之间进行数据的双向传输。

算术逻辑运算指令完结常用的算术与逻辑的运算,该类指令不光将运算成果保存在意图寄存器中,一起更新CPSR中的相应条件标志位。

比较指令不保存运算成果,只更新CPSR中相应的条件标志位。

数据处理指令包含:

—MOV数据传送指令

—MVN数据取反传送指令

—CMP比较指令

—CMN反值比较指令

—TST位测验指令

—TEQ持平测验指令

—ADD加法指令

—ADC带进位加法指令

—SUB减法指令

—SBC带借位减法指令

—RSB逆向减法指令

—RSC带借位的逆向减法指令

—AND逻辑与指令

—ORR逻辑或指令

—EOR逻辑异或指令

—BIC位铲除指令

1、MOV指令

MOV指令的格局为:

MOV{条件}{S}意图寄存器,源操作数

MOV指令可完结从另一个寄存器、被移位的寄存器或将一个当即数加载到意图寄存器。其间S选项决议指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。

指令示例:

MOVR1,R0;将寄存器R0的值传送到寄存器R1

MOVPC,R14;将寄存器R14的值传送到PC,常用于子程序回来

MOVR1,R0,LSL#3;将寄存器R0的值左移3位后传送到R1

2、MVN指令

MVN指令的格局为:

MVN{条件}{S}意图寄存器,源操作数

MVN指令可完结从另一个寄存器、被移位的寄存器、或将一个当即数加载到意图寄存器。与MOV指令不同之处是在传送之前按位被取反了,即把一个被取反的值传送到意图寄存器中。其间S决议指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。

指令示例:

MVNR0,#0;将当即数0取反传送到寄存器R0中,完结后R0=-1

3、CMP指令

CMP指令的格局为:

CMP{条件}操作数1,操作数2

CMP指令用于把一个寄存器的内容和另一个寄存器的内容或当即数进行比较,一起更新CPSR中条件标志位的值。该指令进行一次减法运算,但不存储成果,只更改条件标志位。标志位一共的是操作数1与操作数2的联系(大、小、持平),例如,当操作数1大于操作操作数2,则尔后的有GT后缀的指令将能够碑文。

指令示例:

CMPR1,R0;将寄存器R1的值与寄存器R0的值相减,并依据成果设置CPSR的标志位

CMPR1,#100;将寄存器R1的值与当即数100相减,并依据成果设置CPSR的标志位

4、CMN指令

CMN指令的格局为:

CMN{条件}操作数1,操作数2

CMN指令用于把一个寄存器的内容和另一个寄存器的内容或当即数取反后进行比较,一起更新CPSR中条件标志位的值。该指令实践完结操作数1和操作数2相加,并依据成果更改条件标志位。

指令示例:

CMNR1,R0;将寄存器R1的值与寄存器R0的值相加,并依据成果设置CPSR的标志位

CMNR1,#100;将寄存器R1的值与当即数100相加,并依据成果设置CPSR的标志位

5、TST指令

TST指令的格局为:

TST{条件}操作数1,操作数2

TST指令用于把一个寄存器的内容和另一个寄存器的内容或当即数进行按位的与运算,并依据运算成果更新CPSR中条件标志位的值。操作数1是要测验的数据,而操作数2是一个位掩码,该指令一般用来检测是否设置了特定的位。

指令示例:

TSTR1,#%1;用于测验在寄存器R1中是否设置了最低位(%一共二进制数

TSTR1,#0xffe;将寄存器R1的值与当即数0xffe按位与,并依据成果设置CPSR的标志位

6、TEQ指令

TEQ指令的格局为:

TEQ{条件}操作数1,操作数2

TEQ指令用于把一个寄存器的内容和另一个寄存器的内容或当即数进行按位的异或运算,并依据运算成果更新CPSR中条件标志位的值。该指令一般用于比较操作数1和操作数2是否持平。

指令示例:

TEQR1,R2;将寄存器R1的值与寄存器R2的值按位异或,并依据成果设置CPSR的标志位

7、ADD指令

ADD指令的格局为:

ADD{条件}{S}意图寄存器,操作数1,操作数2

ADD指令用于把两个操作数相加,并将成果寄存到意图寄存器中。操作数1应是一个寄存器,操作数2能够是一个寄存器,被移位的寄存器,或一个当即数。

指令示例:

ADDR0,R1,R2;R0 = R1 + R2

ADDR0,R1,#256;R0 = R1 + 256

ADDR0,R2,R3,LSL#1;R0 = R2 + (R3 << 1)

8、ADC指令

ADC指令的格局为:

ADC{条件}{S}意图寄存器,操作数1,操作数2

ADC指令用于把两个操作数相加,再加上CPSR中的C条件标志位的值,并将成果寄存到意图寄存器中。它运用一个进位标志位,这样就能够做比32位大的数的加法,留意不要忘掉设置S后缀来更改进位标志。操作数1应是一个寄存器,操作数2能够是一个寄存器,被移位的寄存器,或一个当即数。

以下指令序列完结两个128位数的加法,榜首个数由高到低寄存在寄存器R7~R4,第二个数由高到低寄存在寄存器R11~R8,运算成果由高到低寄存在寄存器R3~R0:

ADDSR0,R4,R8;加低端的字

ADCSR1,R5,R9;加第二个字,带进位

ADCSR2,R6,R10;加第三个字,带进位

ADCR3,R7,R11;加第四个字,带进位

9、SUB指令

SUB指令的格局为:

SUB{条件}{S}意图寄存器,操作数1,操作数2

SUB指令用于把操作数1减去操作数2,并将成果寄存到意图寄存器中。操作数1应是一个寄存器,操作数2能够是一个寄存器,被移位的寄存器,或一个当即数。该指令可用于有符号数或无符号数的减法运算。

指令示例:

SUBR0,R1,R2;R0 = R1 – R2

SUBR0,R1,#256;R0 = R1 – 256

SUBR0,R2,R3,LSL#1;R0 = R2 – (R3 << 1)

10、SBC指令

SBC指令的格局为:

SBC{条件}{S}意图寄存器,操作数1,操作数2

SBC指令用于把操作数1减去操作数2,再减去CPSR中的C条件标志位的反码,并将成果寄存到意图寄存器中。操作数1应是一个寄存器,操作数2能够是一个寄存器,被移位的寄存器,或一个当即数。该指令运用进位标志来一共借位,这样就能够做大于32位的减法,留意不要忘掉设置S后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。

指令示例:

SUBSR0,R1,R2;R0 = R1 – R2 -!C,并依据成果设置CPSR的进位标志位

11、RSB指令

RSB指令的格局为:

RSB{条件}{S}意图寄存器,操作数1,操作数2

RSB指令称为逆向减法指令,用于把操作数2减去操作数1,并将成果寄存到意图寄存器中。操作数1应是一个寄存器,操作数2能够是一个寄存器,被移位的寄存器,或一个当即数。该指令可用于有符号数或无符号数的减法运算。

指令示例:

RSBR0,R1,R2;R0 = R2 – R1

RSBR0,R1,#256;R0 = 256 – R1

RSBR0,R2,R3,LSL#1;R0 = (R3 << 1) - R2

12、RSC指令

RSC指令的格局为:

RSC{条件}{S}意图寄存器,操作数1,操作数2

RSC指令用于把操作数2减去操作数1,再减去CPSR中的C条件标志位的反码,并将成果寄存到意图寄存器中。操作数1应是一个寄存器,操作数2能够是一个寄存器,被移位的寄存器,或一个当即数。该指令运用进位标志来一共借位,这样就能够做大于32位的减法,留意不要忘掉设置S后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。

指令示例:

RSCR0,R1,R2;R0 = R2 – R1 -!C

13、AND指令

AND指令的格局为:

AND{条件}{S}意图寄存器,操作数1,操作数2

AND指令用于在两个操作数上进行逻辑与运算,并把成果放置到意图寄存器中。操作数1应是一个寄存器,操作数2能够是一个寄存器,被移位的寄存器,或一个当即数。该指令常用于屏蔽操作数1的某些位。

指令示例:

ANDR0,R0,#3;该指令坚持R0的0、1位,其他位清零。

14、ORR指令

ORR指令的格局为:

ORR{条件}{S}意图寄存器,操作数1,操作数2

ORR指令用于在两个操作数上进行逻辑或运算,并把成果放置到意图寄存器中。操作数1应是一个寄存器,操作数2能够是一个寄存器,被移位的寄存器,或一个当即数。该指令常用于设置操作数1的某些位。

指令示例:

ORRR0,R0,#3;该指令设置R0的0、1位,其他位坚持不变。

15、EOR指令

EOR指令的格局为:

EOR{条件}{S}意图寄存器,操作数1,操作数2

EOR指令用于在两个操作数上进行逻辑异或运算,并把成果放置到意图寄存器中。操作数1应是一个寄存器,操作数2能够是一个寄存器,被移位的寄存器,或一个当即数。该指令常用于回转操作数1的某些位。

指令示例:

EORR0,R0,#3;该指令回转R0的0、1位,其他位坚持不变。

16、BIC指令

BIC指令的格局为:

BIC{条件}{S}意图寄存器,操作数1,操作数2

BIC指令用于铲除操作数1的某些位,并把成果放置到意图寄存器中。操作数1应是一个寄存器,操作数2能够是一个寄存器,被移位的寄存器,或一个当即数。操作数2为32位的掩码,如果在掩码中设置了某一位,则铲除这一位。未设置的掩码位坚持不变。

指令示例:

BICR0,R0,#%1011;该指令铲除R0中的位0、1、和3,其他的位坚持不变。

3.3.3乘法指令与乘加指令

ARM微处理器支撑的乘法指令与乘加指令共有6条,可分为运算成果为32位和运算成果为64位两类,与前面的数据处理指令不同,指令中的一切操作数、意图寄存器有必要为通用寄存器,不能对操作数运用当即数或被移位的寄存器,一起,意图寄存器和操作数1有必要是不同的寄存器。

乘法指令与乘加指令共有以下6条:

—MUL32位乘法指令

—MLA32位乘加指令

—SMULL64位有符号数乘法指令

—SMLAL64位有符号数乘加指令

—UMULL64位无符号数乘法指令

—UMLAL64位无符号数乘加指令

1、MUL指令

MUL指令的格局为:

MUL{条件}{S}意图寄存器,操作数1,操作数2

MUL指令完结将操作数1与操作数2的乘法运算,并把成果放置到意图寄存器中,一起能够依据运算成果设置CPSR中相应的条件标志位。其间,操作数1和操作数2均为32位的有符号数或无符号数。

指令示例:

MULR0,R1,R2;R0 = R1×R2

MULSR0,R1,R2;R0 = R1×R2,一起设置CPSR中的相关条件标志位

2、MLA指令

MLA指令的格局为:

MLA{条件}{S}意图寄存器,操作数1,操作数2,操作数3

MLA指令完结将操作数1与操作数2的乘法运算,再将乘积加上操作数3,并把成果放置到意图寄存器中,一起能够依据运算成果设置CPSR中相应的条件标志位。其间,操作数1和操作数2均为32位的有符号数或无符号数。

指令示例:

MLAR0,R1,R2,R3;R0 = R1×R2 + R3

MLASR0,R1,R2,R3;R0 = R1×R2 + R3,一起设置CPSR中的相关条件标志位

3、SMULL指令

SMULL指令的格局为:

SMULL{条件}{S}意图寄存器Low,意图寄存器低High,操作数1,操作数2

SMULL指令完结将操作数1与操作数2的乘法运算,并把成果的低32位放置到意图寄存器Low中,成果的高32位放置到意图寄存器High中,一起能够依据运算成果设置CPSR中相应的条件标志位。其间,操作数1和操作数2均为32位的有符号数。

指令示例:

SMULLR0,R1,R2,R3;R0 =(R2×R3)的低32位

;R1 =(R2×R3)的高32位

4、SMLAL指令

SMLAL指令的格局为:

SMLAL{条件}{S}意图寄存器Low,意图寄存器低High,操作数1,操作数2

SMLAL指令完结将操作数1与操作数2的乘法运算,并把成果的低32位同意图寄存器Low中的值相加后又放置到意图寄存器Low中,成果的高32位同意图寄存器High中的值相加后又放置到意图寄存器High中,一起能够依据运算成果设置CPSR中相应的条件标志位。其间,操作数1和操作数2均为32位的有符号数。

关于意图寄存器Low,在指令碑文前寄存64位加数的低32位,指令碑文后寄存成果的低32位。

关于意图寄存器High,在指令碑文前寄存64位加数的高32位,指令碑文后寄存成果的高32位。

指令示例:

SMLALR0,R1,R2,R3;R0 =(R2×R3)的低32位+R0

;R1 =(R2×R3)的高32位+R1

5、UMULL指令

UMULL指令的格局为:

UMULL{条件}{S}意图寄存器Low,意图寄存器低High,操作数1,操作数2

UMULL指令完结将操作数1与操作数2的乘法运算,并把成果的低32位放置到意图寄存器Low中,成果的高32位放置到意图寄存器High中,一起能够依据运算成果设置CPSR中相应的条件标志位。其间,操作数1和操作数2均为32位的无符号数。

指令示例:

UMULLR0,R1,R2,R3;R0 =(R2×R3)的低32位

;R1 =(R2×R3)的高32位

6、UMLAL指令

UMLAL指令的格局为:

UMLAL{条件}{S}意图寄存器Low,意图寄存器低High,操作数1,操作数2

UMLAL指令完结将操作数1与操作数2的乘法运算,并把成果的低32位同意图寄存器Low中的值相加后又放置到意图寄存器Low中,成果的高32位同意图寄存器High中的值相加后又放置到意图寄存器High中,一起能够依据运算成果设置CPSR中相应的条件标志位。其间,操作数1和操作数2均为32位的无符号数。

关于意图寄存器Low,在指令碑文前寄存64位加数的低32位,指令碑文后寄存成果的低32位。

关于意图寄存器High,在指令碑文前寄存64位加数的高32位,指令碑文后寄存成果的高32位。

指令示例:

UMLALR0,R1,R2,R3;R0 =(R2×R3)的低32位+R0

;R1 =(R2×R3)的高32位+R1

3.3.4程序状况寄存器拜访指令

ARM微处理器支撑程序状况寄存器拜访指令,用于在程序状况寄存器和通用寄存器之间传送数据,程序状况寄存器拜访指令包含以下两条:

—MRS程序状况寄存器到通用寄存器的数据传送指令

—MSR通用寄存器到程序状况寄存器的数据传送指令

1、MRS指令

MRS指令的格局为:

MRS{条件}通用寄存器,程序状况寄存器(CPSR或SPSR)

MRS指令用于将程序状况寄存器的内容传送到通用寄存器中。该指令一般用在以下几种状况:

-当需求改动程序状况寄存器的内容时,可用MRS将程序状况寄存器的内容读入通用寄存器,修正后再写回程序状况寄存器。

-当在反常处理或进程切换时,需求保存程序状况寄存器的值,可先用该指令读出程序状况寄存器的值,然后保存。

指令示例:

MRSR0,CPSR;传送CPSR的内容到R0

MRSR0,SPSR;传送SPSR的内容到R0

2、MSR指令

MSR指令的格局为:

MSR{条件}程序状况寄存器(CPSR或SPSR)_<域>,操作数

MSR指令用于将操作数的内容传送到程序状况寄存器的特定域中。其间,操作数能够为通用寄存器或当即数。<域>用于设置程序状况寄存器中需求操作的位,32位的程序状况寄存器可分为4个域:

位[31:24]为条件标志位域,用f一共;

位[23:16]为状况位域,用s一共;

位[15:8]为扩展位域,用x一共;

位[7:0]为操控位域,用c一共;

该指令一般用于康复或改动程序状况寄存器的内容,在运用时,一般要在MSR指令中指明酿制操作的域。

指令示例:

MSRCPSR,R0;传送R0的内容到CPSR

MSRSPSR,R0;传送R0的内容到SPSR

MSRCPSR_c,R0;传送R0的内容到SPSR,但只是修正CPSR中的操控位域

3.3.5加载/存储指令

ARM微处理器支撑加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则完结相反的操作。常用的加载存储指令如下:

—LDR字数据加载指令

—LDRB字节数据加载指令

—LDRH半字数据加载指令

—STR字数据存储指令

—STRB字节数据存储指令

—STRH半字数据存储指令

1、LDR指令

LDR指令的格局为:

LDR{条件}意图寄存器,<存储器地址>

LDR指令用于从存储器中将一个32位的字数据传送到意图寄存器中。该指令一般用于从存储器中读取32位的字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为意图寄存器时,指令从存储器中读取的字数据被当作意图地址,然后能够完结程序流程的跳转。该指令在程序设计中比较常用,且寻址办法灵活多样,请读者仔细把握。

指令示例:

LDRR0,[R1];将存储器地址为R1的字数据读入寄存器R0。

LDRR0,[R1,R2];将存储器地址为R1+R2的字数据读入寄存器R0。

LDRR0,[R1,#8];将存储器地址为R1+8的字数据读入寄存器R0。

LDRR0,[R1,R2]!;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1。

LDRR0,[R1,#8]!;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1。

LDRR0,[R1],R2;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2写入R1。

LDRR0,[R1,R2,LSL#2]!;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。

LDRR0,[R1],R2,LSL#2;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。

2、LDRB指令

LDRB指令的格局为:

LDR{条件}B意图寄存器,<存储器地址>

LDRB指令用于从存储器中将一个8位的字节数据传送到意图寄存器中,一起将寄存器的高24位清零。该指令一般用于从存储器中读取8位的字节数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为意图寄存器时,指令从存储器中读取的字数据被当作意图地址,然后能够完结程序流程的跳转。

指令示例:

LDRBR0,[R1];将存储器地址为R1的字节数据读入寄存器R0,并将R0的高24位清零。

LDRBR0,[R1,#8];将存储器地址为R1+8的字节数据读入寄存器R0,并将R0的高24位清零。

3、LDRH指令

LDRH指令的格局为:

LDR{条件}H意图寄存器,<存储器地址>

LDRH指令用于从存储器中将一个16位的半字数据传送到意图寄存器中,一起将寄存器的高16位清零。该指令一般用于从存储器中读取16位的半字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为意图寄存器时,指令从存储器中读取的字数据被当作意图地址,然后能够完结程序流程的跳转。

指令示例:

LDRHR0,[R1];将存储器地址为R1的半字数据读入寄存器R0,并将R0的高16位清零。

LDRHR0,[R1,#8];将存储器地址为R1+8的半字数据读入寄存器R0,并将R0的高16位清零。

LDRHR0,[R1,R2];将存储器地址为R1+R2的半字数据读入寄存器R0,并将R0的高16位清零。

4、STR指令

STR指令的格局为:

STR{条件}源寄存器,<存储器地址>

STR指令用于从源寄存器中将一个32位的字数据传送到存储器中。该指令在程序设计中比较常用,且寻址办法灵活多样,运用办法可参阅指令LDR。

指令示例:

STRR0,[R1],#8;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。

STRR0,[R1,#8];将R0中的字数据写入以R1+8为地址的存储器中。

5、STRB指令

STRB指令的格局为:

STR{条件}B源寄存器,<存储器地址>

STRB指令用于从源寄存器中将一个8位的字节数据传送到存储器中。该字节数据为源寄存器中的低8位。

指令示例:

STRBR0,[R1];将寄存器R0中的字节数据写入以R1为地址的存储器中。

STRBR0,[R1,#8];将寄存器R0中的字节数据写入以R1+8为地址的存储器中。

6、STRH指令

STRH指令的格局为:

STR{条件}H源寄存器,<存储器地址>

STRH指令用于从源寄存器中将一个16位的半字数据传送到存储器中。该半字数据为源寄存器中的低16位。

指令示例:

STRHR0,[R1];将寄存器R0中的半字数据写入以R1为地址的存储器中。

STRHR0,[R1,#8];将寄存器R0中的半字数据写入以R1+8为地址的存储器中。

3.3.6批量数据加载/存储指令

ARM微处理器所支撑批量数据加载/存储指令能够一次在一片接连的存储器单元和多个寄存器之间传送数据,批量加载指令用于将一片接连的存储器中的数据传送到多个寄存器,批量数据存储指令则完结相反的操作。常用的加载存储指令如下:

—LDM批量数据加载指令

—STM批量数据存储指令

LDM(或STM)指令

LDM(或STM)指令的格局为:

LDM(或STM){条件}{类型}基址寄存器{!},寄存器列表{∧}

LDM(或STM)指令用于从由基址寄存器所指示的一片接连存储器到寄存器列表所指示的多个寄存器之间传送数据,该指令的常见用处是将多个寄存器的内容入栈或出栈。其间,{类型}为以下几种状况:

IA每次传送后地址加1;

IB每次传送前地址加1;

DA每次传送后地址减1;

DB每次传送前地址减1;

FD满递减仓库;

ED空递减仓库;

FA满递加仓库;

EA空递加仓库;

{!}为可选后缀,若选用该后缀,则当数据传送结束之后,将最终的地址写入基址寄存器,不然基址寄存器的内容不改动。

基址寄存器不答应为R15,寄存器列表能够为R0~R15的恣意组合。

{∧}为可选后缀,当指令为LDM且寄存器列表中包含R15,选用该后缀时一共:除了正常的数据传送之外,还将SPSR到CPSR。一起,该后缀还一共传入或传出的是用户形式下的寄存器,而不是当时形式下的寄存器。

指令示例:

STMFDR13!,{R0,R4-R12,LR};将寄存器列表中的寄存器(R0,R4到R12,LR)存入仓库。

LDMFDR13!,{R0,R4-R12,PC};将仓库内容康复到寄存器(R0,R4到R12,LR)。

3.3.7数据交流指令

ARM微处理器所支撑数据交流指令能在存储器和寄存器之间交流数据。数据交流指令有如下两条:

—SWP字数据交流指令

—SWPB字节数据交流指令

1、SWP指令

SWP指令的格局为:

SWP{条件}意图寄存器,源寄存器1,[源寄存器2]

SWP指令用于将源寄存器2所指向的存储器中的字数据传送到意图寄存器中,一起将源寄存器1中的字数据传送到源寄存器2所指向的存储器中。明显,当源寄存器1和意图寄存器为同一个寄存器时,指令交流该寄存器和存储器的内容。

指令示例:

SWPR0,R1,[R2];将R2所指向的存储器中的字数据传送到R0,一起将R1中的字数据传送到R2所指向的存储单元。

SWPR0,R0,[R1];该指令完结将R1所指向的存储器中的字数据与R0中的字数据交流。

2、SWPB指令

SWPB指令的格局为:

SWP{条件}B意图寄存器,源寄存器1,[源寄存器2]

SWPB指令用于将源寄存器2所指向的存储器中的字节数据传送到意图寄存器中,意图寄存器的高24清零,一起将源寄存器1中的字节数据传送到源寄存器2所指向的存储器中。明显,当源寄存器1和意图寄存器为同一个寄存器时,指令交流该寄存器和存储器的内容。

指令示例:

SWPBR0,R1,[R2];将R2所指向的存储器中的字节数据传送到R0,R0的高24位清零,一起将R1中的低8位数据传送到R2所指向的存储单元。

SWPBR0,R0,[R1];该指令完结将R1所指向的存储器中的字节数据与R0中的低8位数据交流。

3.3.8移位指令(操作)

ARM微处理器内嵌的桶型移位器(Barrel Shifter),支撑数据的各种移位操作,移位操作在ARM指令拘押不作为独自的指令运用,它只能作为指令格局中是一个字段,在汇编语言中一共为指令中的选项。例如,数据处理指令的第二个操作数为寄存器时,就能够参加移位操作选项对它进行各种移位操作。移位操作包含如下6种类型,ASL和LSL是等价的,能够自在交换:

—LSL逻辑左移

—ASL算术左移

—LSR逻辑右移

—ASR算术右移

—ROR循环右移

—RRX带扩展的循环右移

1、LSL(或ASL)操作

LSL(或ASL)操作的格局为:

通用寄存器,LSL(或ASL)操作数

LSL(或ASL)可完结对通用寄存器中的内容进行逻辑(或算术)的左移操作,按操作数所指定的数量向左移位,低位用零来填充。其间,操作数能够是通用寄存器,也能够是当即数(0~31)。

操作示例:

MOVR0, R1, LSL#2;将R1中的内容左移两位后传送到R0中。

2、LSR操作

LSR操作的格局为:

通用寄存器,LSR操作数

LSR可完结对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,左端用零来填充。其间,操作数能够是通用寄存器,也能够是当即数(0~31)。

操作示例:

MOVR0, R1, LSR#2;将R1中的内容右移两位后传送到R0中,左端用零来填充。

3、ASR操作

ASR操作的格局为:

通用寄存器,ASR操作数

ASR可完结对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,左端用第31位的值来填充。其间,操作数能够是通用寄存器,也能够是当即数(0~31)。

操作示例:

MOVR0, R1, ASR#2;将R1中的内容右移两位后传送到R0中,左端用第31位的值来填充。

4、ROR操作

ROR操作的格局为:

通用寄存器,ROR操作数

ROR可完结对通用寄存器中的内容进行循环右移的操作,按操作数所指定的数量向右循环移位,左端用右端移出的位来填充。其间,操作数能够是通用寄存器,也能够是当即数(0~31)。明显,当进行32位的循环右移操作时,通用寄存器中的值不改动。

操作示例:

MOVR0, R1, ROR#2;将R1中的内容循环右移两位后传送到R0中。

5、RRX操作

RRX操作的格局为:

通用寄存器,RRX操作数

RRX可完结对通用寄存器中的内容进行带扩展的循环右移的操作,按操作数所指定的数量向右循环移位,左端用进位标志位C来填充。其间,操作数能够是通用寄存器,也能够是当即数(0~31)。

操作示例:

MOVR0, R1, RRX#2;将R1中的内容进行带扩展的循环右移两位后传送到R0中。

3.3.9协处理器指令

ARM微处理器可支撑多达16个协处理器,用于各种协处理操作,在程序碑文的过程中,每个协处理器只碑文针对自身的协处理指令,疏忽ARM处理器和其他协处理器的指令。

ARM的协处理器指令首要用于ARM处理器初始化ARM协处理器的数据处理操作,以及在ARM处理器的寄存器和协处理器的寄存器之间传送数据,和在ARM协处理器的寄存器和存储器之间传送数据。ARM协处理器指令包含以下5条:

—CDP协处理器数操作指令

—LDC协处理器数据加载指令

—STC协处理器数据存储指令

—MCRARM处理器寄存器到协处理器寄存器的数据传送指令

—MRC协处理器寄存器到ARM处理器寄存器的数据传送指令

1、CDP指令

CDP指令的格局为:

CDP{条件}协处理器编码,协处理器操作码1,意图寄存器,源寄存器1,源寄存器2,协处理器操作码2。

CDP指令用于ARM处理器告诉ARM协处理器碑文特定的操作,若协处理器不能成功完结特定的操作,则发生未定义指令反常。其间协处理器操作码1和协处理器操作码2为协处理器酿制碑文的操作,意图寄存器和源寄存器均为协处理器的寄存器,指令不触及ARM处理器的寄存器和存储器。

指令示例:

CDPP3,2,C12,C10,C3,4;该指令完结协处理器P3的初始化

2、LDC指令

LDC指令的格局为:

LDC{条件}{L}协处理器编码,意图寄存器,[源寄存器]

LDC指令用于将源寄存器所指向的存储器中的字数据传送到意图寄存器中,若协处理器不能成功完结传送操作,则发生未定义指令反常。其间,{L}选项一共指令为长读取操作,如用于双精度数据的传输。

指令示例:

LDCP3,C4,[R0];将ARM处理器的寄存器R0所指向的存储器中的字数据传送到协处理器P3的寄存器C4中。

3、STC指令

STC指令的格局为:

STC{条件}{L}协处理器编码,源寄存器,[意图寄存器]

STC指令用于将源寄存器中的字数据传送到意图寄存器所指向的存储器中,若协处理器不能成功完结传送操作,则发生未定义指令反常。其间,{L}选项一共指令为长读取操作,如用于双精度数据的传输。

指令示例:

STCP3,C4,[R0];将协处理器P3的寄存器C4中的字数据传送到ARM处理器的寄存器R0所指向的存储器中。

4、MCR指令

MCR指令的格局为:

MCR{条件}协处理器编码,协处理器操作码1,源寄存器,意图寄存器1,意图寄存器2,协处理器操作码2。

MCR指令用于将ARM处理器寄存器中的数据传送到协处理器寄存器中,若协处理器不能成功完结操作,则发生未定义指令反常。其间协处理器操作码1和协处理器操作码2为协处理器酿制碑文的操作,源寄存器为ARM处理器的寄存器,意图寄存器1和意图寄存器2均为协处理器的寄存器。

指令示例:

MCRP3,3,R0,C4,C5,6;该指令将ARM处理器寄存器R0中的数据传送到协处理器P3的寄存器C4和C5中。

5、MRC指令

MRC指令的格局为:

MRC{条件}协处理器编码,协处理器操作码1,意图寄存器,源寄存器1,源寄存器2,协处理器操作码2。

MRC指令用于将协处理器寄存器中的数据传送到ARM处理器寄存器中,若协处理器不能成功完结操作,则发生未定义指令反常。其间协处理器操作码1和协处理器操作码2为协处理器酿制碑文的操作,意图寄存器为ARM处理器的寄存器,源寄存器1和源寄存器2均为协处理器的寄存器。

指令示例:

MRCP3,3,R0,C4,C5,6;该指令将协处理器P3的寄存器中的数据传送到ARM处理器寄存器中。

3.3.10反常发生指令

ARM微处理器所支撑的反常指令有如下两条:

—SWI软件中止指令

—BKPT断点中止指令

1、SWI指令

SWI指令的格局为:

SWI{条件} 24位的当即数

SWI指令用于发生软件中止,以便用户程序能调用操作体系的体系例程。操作体系在SWI的反常处理程序中供给相应的体系服务,指令中24位的当即数指定用户程序调用体系例程的类型,相关参数经过通用寄存器传递,当指令中24位的当即数被疏忽时,用户程序调用体系例程的类型由通用寄存器R0的内容决议,一起,参数经过其他通用寄存器传递。

指令示例:

SWI0x02;该指令调用操作体系编号位02的体系例程。

2、BKPT指令

BKPT指令的格局为:

BKPT16位的当即数

BKPT指令发生软件断点中止,可用于程序的调试。

3.4Thumb指令及运用

为兼容数据总线宽度为16位的运用体系,ARM体系结构除了支撑碑文功率很高的32位ARM指令集以外,一起支撑16位的Thumb指令集。Thumb指令集是ARM指令集的一个子集,答应指令编码为16位的长度。与等价的32位代码相比较,Thumb指令集在保存32代码优势的一起,大大的节省了体系的存储空间。

一切的Thumb指令都有对应的ARM指令,并且Thumb的编程模型也对应于ARM的编程模型,在运用程序的编写过程中,只需遵从必定调用的规矩,Thumb子程序和ARM子程序就能够相互调用。当处理器在碑文ARM程序段时,称ARM处理器处于ARM作业状况,当处理器在碑文Thumb程序段时,称ARM处理器处于Thumb作业状况。

与ARM指令集相比较,Thumb指令拘押的数据处理指令的操作数仍然是32位,指令地址也为32位,但Thumb指令集为完结16位的指令长度,放弃了ARM指令集的一些特性,如大多数的Thumb指令是无条件碑文的,而简直一切的ARM指令都是有条件碑文的;大多数的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指令集。当然,若两者结合运用,充分发挥其各自的长处,会获得更好的作用。

3.5本章末节

本章体系的介绍了ARM指令拘押的根本指令,以及各指令的运用场合及办法,由根本指令还能够派生出一些新的指令,但运用办法与根本指令相似。与常见的如X86体系结构的汇编指令相比较,ARM指令体系无论是从指令集自身,仍是从寻址办法上,都相对杂乱一些。

Thumb指令集作为ARM指令集的一个子集,其运用办法与ARM指令集相似,在此未作具体的描绘,但这并不意味着Thumb指令集不如ARM指令集重要,事实上,他们各自有其自己的运用场合。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/264012.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部