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

ARM 192浏览
 

本章介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所示,第161111保留,暂时不能使用。
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 R0←R01
ADD R0R0,#0x3f R0←R00x3f
在以上两条指令中,第二个源操作数即立即数,要求以于以十六制表示的立即数,要求在后加上“0x”“&”
3.2.2寄存器
寄存器址就是利用寄存器中的数操作数,这种寻址方式是各理器常采用的一方式,也是一种执行效率高的址方式。以下指令:
ADD R0R1R2 R0←R1R2
指令的行效果是将寄存器R1R2的内容相加,其果存放在寄存器R0中。
3.2.2寄存器
寄存器址就是以寄存器中的操作数的地址,而操作数本身存放在存器中。示例以下指令:
ADD R0R1[R2] R0←R1[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]R1←R14
LDR R0[R1] ,#4 R0←[R1]R1←R14
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 指令
— BL 返回的跳指令
— BLX 返回和状的跳指令
— BX 的跳指令
1 B指令
B指令的格式
B{条件} 地址
B指令是最简单的跳指令。一旦遇到一个 B 指令,ARM 理器将立即跳定的目地址,从那里继续执行。注意存在跳指令中的实际值是相当前PC的一个偏移量,而不是一个绝对地址,它的汇编器来算(参考址方式中的对寻址)。它是 24 位有符号数,左移两位后有符号 32 位,表示的有效偏移 26 (前后32MB的地址空)。以下指令:
B Label ;程序无条件跳Label处执
CMP R1,#0 ;当CPSR寄存器中的Z条件置位,程序跳Label处执
BEQ Label
2 BL指令
BL指令的格式
BL{条件} 地址
BL 是另一个跳指令,但跳之前,会在寄存器R14中保存PC的当前内容,因此,可以通R14 的内容重新加PC中,来返回到跳指令之后的那个指令处执行。指令是实现子程序用的一个基本但常用的手段。以下指令:
BL Label ;当程序无条件跳Label处执,同将当前的PC保存到R14
3 BLX指令
BLX指令的格式
BLX 地址
BLX指令从ARM指令集跳到指令中所指定的目地址,并将理器的工作状ARMThumb指令同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中条件志位的
指令示例:
MOV R1R0 ;将寄存器R0值传送到寄存器R1
MOV PCR14 ;将寄存器R14值传送到PC,常用于子程序返回
MOV R1R0LSL3 ;将寄存器R0左移3位后送到R1
2 MVN指令
MVN指令的格式
MVN{条件}{S} 目的寄存器,源操作数
MVN指令可完成从另一个寄存器、被移位的寄存器、或将一个立即数加到目的寄存器。与MOV指令不同之是在送之前按位被取反了,即把一个被取反的值传送到目的寄存器中。其中S决定指令的操作是否影响CPSR中条件志位的,当没有S指令不更新CPSR中条件志位的
指令示例:
MVN R0,#0 ;将立即数0取反送到寄存器R0中,完成后R0=-1
3 CMP指令
CMP指令的格式
CMP{条件} 操作数1,操作数2
CMP指令用于把一个寄存器的内容和另一个寄存器的内容或立即数行比,同更新CPSR中条件志位的指令行一次减法运算,但不存储结果,只更改条件志位。志位表示的是操作数1与操作数2(大、小、相等),示例,当操作数1大于操作操作数2此后的有GT 的指令将可以行。
指令示例:
CMP R1R0 ;将寄存器R1与寄存器R0相减,并根据CPSR志位
CMP R1,#100 ;将寄存器R1与立即数100相减,并根据CPSR志位
4 CMN指令
CMN指令的格式
CMN{条件} 操作数1,操作数2
CMN指令用于把一个寄存器的内容和另一个寄存器的内容或立即数取反后行比,同更新CPSR中条件志位的指令实际完成操作数1和操作数2相加,并根据果更改条件志位。
指令示例:
CMN R1R0 ;将寄存器R1与寄存器R0相加,并根据CPSR志位
CMN R1,#100 ;将寄存器R1与立即数100相加,并根据CPSR志位
5 TST指令
TST指令的格式
TST{条件} 操作数1,操作数2
TST指令用于把一个寄存器的内容和另一个寄存器的内容或立即数行按位的与运算,并根据运算果更新CPSR中条件志位的。操作数1是要测试的数据,而操作数2是一个位掩指令一般用来检测是否置了特定的位。
指令示例:
TST R1,#%1 ;用于测试在寄存器R1中是否置了最低位(%表示二制数)
TST R1,#0xffe ;将寄存器R1与立即数0xffe按位与,并根据CPSR志位
6 TEQ指令
TEQ指令的格式
TEQ{条件} 操作数1,操作数2
TEQ指令用于把一个寄存器的内容和另一个寄存器的内容或立即数行按位的异或运算,并根据运算果更新CPSR中条件志位的指令通常用于比操作数1和操作数2是否相等。
指令示例:
TEQ R1R2 ;将寄存器R1与寄存器R2按位异或,并根据CPSR志位
7 ADD指令
ADD指令的格式
ADD{条件}{S} 目的寄存器,操作数1,操作数2
ADD指令用于把两个操作数相加,并将果存放到目的寄存器中。操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。
指令示例:
ADD R0R1R2 R0 = R1 + R2
ADD R0R1#256 R0 = R1 + 256
ADD R0R2R3LSL#1 R0 = R2 + (R3 << 1)
8 ADC指令
ADC指令的格式
ADC{条件}{S} 目的寄存器,操作数1,操作数2
ADC指令用于把两个操作数相加,再加上CPSR中的C条件志位的,并将果存放到目的寄存器中。它使用一个志位,这样就可以做比32位大的数的加法,注意不要忘记设S来更改志。操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。
以下指令序列完成两个128位数的加法,第一个数由高到低存放在寄存器R7R4,第二个数由高到低存放在寄存器R11R8,运算果由高到低存放在寄存器R3R0
ADDS R0R4R8 加低端的字
ADCS R1R5R9 加第二个字,带进
ADCS R2R6R10 加第三个字,带进
ADC R3R7R11 加第四个字,带进
9 SUB指令
SUB指令的格式
SUB{条件}{S} 目的寄存器,操作数1,操作数2
SUB指令用于把操作数1减去操作数2,并将果存放到目的寄存器中。操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。指令可用于有符号数或无符号数的减法运算。
指令示例:
SUB R0R1R2 R0 = R1 - R2
SUB R0R1#256 R0 = R1 - 256
SUB R0R2R3LSL#1 R0 = R2 - (R3 << 1)
10SBC指令
SBC指令的格式
SBC{条件}{S} 目的寄存器,操作数1,操作数2
SBC指令用于把操作数1减去操作数2,再减去CPSR中的C条件志位的反,并将果存放到目的寄存器中。操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。指令使用志来表示借位,这样就可以做大于32位的减法,注意不要忘记设S来更改志。指令可用于有符号数或无符号数的减法运算。
指令示例:
SUBS R0R1R2 R0 = R1 - R2 - C,并根据CPSR志位
11RSB指令
RSB指令的格式
RSB{条件}{S} 目的寄存器,操作数1,操作数2
RSB指令称逆向减法指令,用于把操作数2减去操作数1,并将果存放到目的寄存器中。操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。指令可用于有符号数或无符号数的减法运算。
指令示例:
RSB R0R1R2 R0 = R2 – R1
RSB R0R1#256 R0 = 256 – R1
RSB R0R2R3LSL#1 R0 = (R3 << 1) - R2
12RSC指令
RSC指令的格式
RSC{条件}{S} 目的寄存器,操作数1,操作数2
RSC指令用于把操作数2减去操作数1,再减去CPSR中的C条件志位的反,并将果存放到目的寄存器中。操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。指令使用志来表示借位,这样就可以做大于32位的减法,注意不要忘记设S来更改志。指令可用于有符号数或无符号数的减法运算。
指令示例:
RSC R0R1R2 R0 = R2 – R1 - C
13AND指令
AND指令的格式
AND{条件}{S} 目的寄存器,操作数1,操作数2
AND指令用于在两个操作数上逻辑与运算,并把果放置到目的寄存器中。操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。指令常用于屏蔽操作数1的某些位。
指令示例:
AND R0R0,#3 指令保持R001位,其余位清零。
14ORR指令
ORR指令的格式
ORR{条件}{S} 目的寄存器,操作数1,操作数2
ORR指令用于在两个操作数上逻辑或运算,并把果放置到目的寄存器中。操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。指令常用置操作数1的某些位。
指令示例:
ORR R0R0,#3 指令R001位,其余位保持不
15EOR指令
EOR指令的格式
EOR{条件}{S} 目的寄存器,操作数1,操作数2
EOR指令用于在两个操作数上逻辑异或运算,并把果放置到目的寄存器中。操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。指令常用于反操作数1的某些位。
指令示例:
EOR R0R0,#3 指令反R001位,其余位保持不
16BIC指令
BIC指令的格式
BIC{条件}{S} 目的寄存器,操作数1,操作数2
BIC指令用于清除操作数1的某些位,并把果放置到目的寄存器中。操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。操作数232位的掩,如果在掩置了某一位,清除一位。未置的掩位保持不
指令示例:
BIC R0R0,#%1011 指令清除 R0 中的位 01、和 3,其余的位保持不

3.3.3乘法指令与乘加指令
ARM理器支持的乘法指令与乘加指令共有6条,可分运算32位和运算64位两,与前面的数据理指令不同,指令中的所有操作数、目的寄存器必须为通用寄存器,不能操作数使用立即数或被移位的寄存器,同,目的寄存器和操作数1是不同的寄存器。
乘法指令与乘加指令共有以下6条:
— MUL 32位乘法指令
— MLA 32位乘加指令
— SMULL 64位有符号数乘法指令
— SMLAL 64位有符号数乘加指令
— UMULL 64位无符号数乘法指令
— UMLAL 64位无符号数乘加指令
1 MUL指令
MUL指令的格式
MUL{条件}{S} 目的寄存器,操作数1,操作数2
MUL指令完成将操作数1与操作数2的乘法运算,并把果放置到目的寄存器中,同可以根据运算CPSR中相的条件志位。其中,操作数1和操作数232位的有符号数或无符号数。
指令示例:
MUL R0R1R2 R0 = R1 × R2
MULS R0R1R2 R0 = R1 × R2,同时设CPSR中的相条件志位
2 MLA指令
MLA指令的格式
MLA{条件}{S} 目的寄存器,操作数1,操作数2,操作数3
MLA指令完成将操作数1与操作数2的乘法运算,再将乘加上操作数3,并把果放置到目的寄存器中,同可以根据运算CPSR中相的条件志位。其中,操作数1和操作数232位的有符号数或无符号数。
指令示例:
MLA R0R1R2R3 R0 = R1 × R2 + R3
MLAS R0R1R2R3 R0 = R1 × R2 + R3,同时设CPSR中的相条件志位
3 SMULL指令
SMULL指令的格式
SMULL{条件}{S} 目的寄存器Low,目的寄存器低High,操作数1,操作数2
SMULL指令完成将操作数1与操作数2的乘法运算,并把果的低32位放置到目的寄存器Low中,果的高32位放置到目的寄存器High中,同可以根据运算CPSR中相的条件志位。其中,操作数1和操作数232位的有符号数。
指令示例:
SMULL R0R1R2R3 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和操作数232位的有符号数。
于目的寄存器Low,在指令行前存放64位加数的低32位,指令行后存放果的低32位。
于目的寄存器High,在指令行前存放64位加数的高32位,指令行后存放果的高32位。
指令示例:
SMLAL R0R1R2R3 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和操作数232位的无符号数。
指令示例:
UMULL R0R1R2R3 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和操作数232位的无符号数。
于目的寄存器Low,在指令行前存放64位加数的低32位,指令行后存放果的低32位。
于目的寄存器High,在指令行前存放64位加数的高32位,指令行后存放果的高32位。
指令示例:
UMLAL R0R1R2R3 R0 = R2 × R3)的低32 R0
R1 = R2 × R3)的高32 R1
3.3.4
程序状寄存器访问指令
ARM理器支持程序状寄存器访问指令,用于在程序状寄存器和通用寄存器之间传送数据,程序状寄存器访问指令包括以下两条:
— MRS 程序状寄存器到通用寄存器的数据送指令
— MSR 通用寄存器到程序状寄存器的数据送指令
1 MRS指令
MRS指令的格式
MRS{条件} 通用寄存器,程序状寄存器(CPSRSPSR
MRS指令用于将程序状寄存器的内容送到通用寄存器中。指令一般用在以下几情况:
当需要改程序状寄存器的内容,可用MRS将程序状寄存器的内容入通用寄存器,修改后再写回程序状寄存器。
当在异常理或程切换时,需要保存程序状寄存器的,可先用指令出程序状寄存器的,然后保存。
指令示例:
MRS R0CPSR CPSR的内容到R0
MRS R0SPSR SPSR的内容到R0
2 MSR指令
MSR指令的格式
MSR{条件} 程序状寄存器(CPSRSPSR_<>,操作数
MSR指令用于将操作数的内容送到程序状寄存器的特定域中。其中,操作数可以通用寄存器或立即数。<>用于置程序状寄存器中需要操作的位,32位的程序状寄存器可分4个域:
[3124]条件志位域,用f表示;
[2316]位域,用s表示;
[158]为扩展位域,用x表示;
[70]控制位域,用c表示;
指令通常用于恢或改程序状寄存器的内容,在使用,一般要在MSR指令中指明将要操作的域。
指令示例:
MSR CPSRR0 R0的内容到CPSR
MSR SPSRR0 R0的内容到SPSR
MSR CPSR_cR0 R0的内容到SPSR,但仅仅修改CPSR中的控制位域

3.3.5/指令
ARM理器支持加/指令用于在寄存器和存器之间传送数据,加指令用于将存器中的数据送到寄存器,存指令完成相反的操作。常用的加指令如下:
— LDR 字数据加指令
— LDRB 数据加指令
— LDRH 半字数据加指令
— STR 字数据存指令
— STRB 数据存指令
— STRH 半字数据存指令
1LDR指令
LDR指令的格式
LDR{条件} 目的寄存器,<器地址>
LDR指令用于从存器中将一个32位的字数据送到目的寄存器中。指令通常用于从存器中32位的字数据到通用寄存器,然后数据理。当程序数器PC目的寄存器,指令从存器中取的字数据被当作目的地址,从而可以实现程序流程的跳指令在程序设计中比常用,且址方式灵活多请读真掌握。
指令示例:
LDR R0[R1] ;将存器地址R1的字数据入寄存器R0
LDR R0[R1R2] ;将存器地址R1+R2的字数据入寄存器R0
LDR R0[R1,#8] ;将存器地址R1+8的字数据入寄存器R0
LDR R0[R1R2] ;将存器地址R1+R2的字数据入寄存器R0,并将新地址R1R2写入R1
LDR R0[R1,#8] ;将存器地址R1+8的字数据入寄存器R0,并将新地址R18写入R1
LDR R0[R1]R2 ;将存器地址R1的字数据入寄存器R0,并将新地址R1R2写入R1
LDR R0[R1R2LSL2];将存器地址R1R2×4的字数据入寄存器R0,并将新地址R1R2×4写入R1
LDR R0[R1]R2LSL2 ;将存器地址R1的字数据入寄存器R0,并将新地址R1R2×4写入R1
2LDRB指令
LDRB指令的格式
LDR{条件}B 目的寄存器,<器地址>
LDRB指令用于从存器中将一个8位的字数据送到目的寄存器中,同将寄存器的高24位清零。指令通常用于从存器中8位的字数据到通用寄存器,然后数据理。当程序数器PC目的寄存器,指令从存器中取的字数据被当作目的地址,从而可以实现程序流程的跳
指令示例:
LDRB R0[R1] ;将存器地址R1的字数据入寄存器R0,并将R0的高24位清零。
LDRB R0[R1,#8] ;将存器地址R18的字数据入寄存器R0,并将R0的高24位清零。
3LDRH指令
LDRH指令的格式
LDR{条件}H 目的寄存器,<器地址>
LDRH指令用于从存器中将一个16位的半字数据送到目的寄存器中,同将寄存器的高16位清零。指令通常用于从存器中16位的半字数据到通用寄存器,然后数据理。当程序数器PC目的寄存器,指令从存器中取的字数据被当作目的地址,从而可以实现程序流程的跳
指令示例:
LDRH R0[R1] ;将存器地址R1的半字数据入寄存器R0,并将R0的高16位清零。
LDRH R0[R1,#8] ;将存器地址R18的半字数据入寄存器R0,并将R0的高16位清零。
LDRH R0[R1R2] ;将存器地址R1R2的半字数据入寄存器R0,并将R0的高16位清零。
4STR指令
STR指令的格式
STR{条件} 源寄存器,<器地址>
STR指令用于从源寄存器中将一个32位的字数据送到存器中。指令在程序设计中比常用,且址方式灵活多,使用方式可参考指令LDR
指令示例:
STR R0[R1],#8 ;将R0中的字数据写入以R1地址的存器中,并将新地址R18写入R1
STR R0[R1,#8] ;将R0中的字数据写入以R18地址的存器中。
5STRB指令
STRB指令的格式
STR{条件}B 源寄存器,<器地址>
STRB指令用于从源寄存器中将一个8位的字数据送到存器中。数据源寄存器中的8位。
指令示例:
STRB R0[R1] ;将寄存器R0中的字数据写入以R1地址的存器中。
STRB R0[R1,#8] ;将寄存器R0中的字数据写入以R18地址的存器中。
6STRH指令
STRH指令的格式
STR{条件}H 源寄存器,<器地址>
STRH指令用于从源寄存器中将一个16位的半字数据送到存器中。半字数据源寄存器中的低16位。
指令示例:
STRH R0[R1] ;将寄存器R0中的半字数据写入以R1地址的存器中。
STRH R0[R1,#8] ;将寄存器R0中的半字数据写入以R18地址的存器中。
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,寄存器列表可以R0R15的任意合。
{},当指令LDM且寄存器列表中包含R15缀时表示:除了正常的数据送之外,SPSR制到CPSR。同缀还表示入或出的是用模式下的寄存器,而不是当前模式下的寄存器。
指令示例:
STMFD R13!{R0R4-R12LR} ;将寄存器列表中的寄存器(R0R4R12LR)存入堆
LDMFD R13!{R0R4-R12PC} ;将堆内容恢到寄存器(R0R4R12LR)。

3.3.7数据交指令
ARM理器所支持数据交指令能在存器和寄存器之数据。数据交指令有如下两条:
— SWP 字数据交指令
— SWPB 数据交指令
1SWP指令
SWP指令的格式
SWP{条件} 目的寄存器,源寄存器1[源寄存器2]
SWP指令用于将源寄存器2所指向的存器中的字数据送到目的寄存器中,同将源寄存器1中的字数据送到源寄存器2所指向的存器中。然,当源寄存器1和目的寄存器同一个寄存器,指令交换该寄存器和存器的内容。
指令示例:
SWP R0R1[R2] ;将R2所指向的存器中的字数据送到R0,同R1中的字数据送到R2所指向的存储单元。
SWP R0R0[R1] 指令完成将R1所指向的存器中的字数据与R0中的字数据交
2SWPB指令
SWPB指令的格式
SWP{条件}B 目的寄存器,源寄存器1[源寄存器2]
SWPB指令用于将源寄存器2所指向的存器中的字数据送到目的寄存器中,目的寄存器的高24清零,同将源寄存器1中的字数据送到源寄存器2所指向的存器中。然,当源寄存器1和目的寄存器同一个寄存器,指令交换该寄存器和存器的内容。
指令示例:
SWPB R0R1[R2] ;将R2所指向的存器中的字数据送到R0R0的高24位清零,同R1中的低8位数据送到R2所指向的存储单元。
SWPB R0R0[R1] 指令完成将R1所指向的存器中的字数据与R0中的低8位数据交
3.3.8
移位指令(操作)
ARM理器内嵌的桶型移位器(Barrel Shifter),支持数据的各移位操作,移位操作在ARM指令集中不作为单独的指令使用,它只能作指令格式中是一个字段,在汇编语言中表示指令中的选项。示例,数据理指令的第二个操作数寄存器,就可以加入移位操作选项对行各移位操作。移位操作包括如下6种类型,ASLLSL是等价的,可以自由互
— LSL 逻辑左移
— ASL 左移
— LSR 逻辑右移
— ASR 右移
— ROR 右移
— RRX 带扩展的循右移
1LSL(或ASL)操作
LSL(或ASL)操作的格式
通用寄存器,LSL(或ASL操作数
LSL(或ASL)可完成通用寄存器中的内容逻辑(或算)的左移操作,按操作数所指定的数量向左移位,低位用零来填充。其中,操作数可以是通用寄存器,也可以是立即数(031)。
操作示例:
MOV R0, R1, LSL#2 ;将R1中的内容左移两位后送到R0中。
2LSR操作
LSR操作的格式
通用寄存器,LSR 操作数
LSR可完成通用寄存器中的内容行右移的操作,按操作数所指定的数量向右移位,左端用零来填充。其中,操作数可以是通用寄存器,也可以是立即数(031)。
操作示例:
MOV R0, R1, LSR#2 ;将R1中的内容右移两位后送到R0中,左端用零来填充。
3ASR操作
ASR操作的格式
通用寄存器,ASR 操作数
ASR可完成通用寄存器中的内容行右移的操作,按操作数所指定的数量向右移位,左端用第31位的来填充。其中,操作数可以是通用寄存器,也可以是立即数(031)。
操作示例:
MOV R0, R1, ASR#2 ;将R1中的内容右移两位后送到R0中,左端用第31位的来填充。
4ROR操作
ROR操作的格式
通用寄存器,ROR 操作数
ROR可完成通用寄存器中的内容行循右移的操作,按操作数所指定的数量向右循移位,左端用右端移出的位来填充。其中,操作数可以是通用寄存器,也可以是立即数(031)。然,当32位的循右移操作,通用寄存器中的不改
操作示例:
MOV R0, R1, ROR#2 ;将R1中的内容循右移两位后送到R0中。
5RRX操作
RRX操作的格式
通用寄存器,RRX 操作数
RRX可完成通用寄存器中的内容带扩展的循右移的操作,按操作数所指定的数量向右循移位,左端用志位C来填充。其中,操作数可以是通用寄存器,也可以是立即数(031)。
操作示例:
MOV R0, R1, RRX#2 ;将R1中的内容带扩展的循右移两位后送到R0中。

3.3.9协处理器指令
ARM理器可支持多达16协处理器,用于各种协处理操作,在程序行的程中,协处理器只针对自身的协处理指令,忽略ARM理器和其他协处理器的指令。
ARM协处理器指令主要用于ARM理器初始化ARM协处理器的数据理操作,以及在ARM理器的寄存器和协处理器的寄存器之间传送数据,和在ARM协处理器的寄存器和存器之间传送数据。ARM协处理器指令包括以下5条:
— CDP 协处理器数操作指令
— LDC 协处理器数据加指令
— STC 协处理器数据存指令
— MCR ARM理器寄存器到协处理器寄存器的数据送指令
— MRC 协处理器寄存器到ARM理器寄存器的数据送指令
1CDP指令
CDP指令的格式
CDP{条件} 协处理器编码协处理器操作1,目的寄存器,源寄存器1,源寄存器2协处理器操作2
CDP指令用于ARM理器通知ARM协处理器行特定的操作,协处理器不能成功完成特定的操作,则产生未定指令异常。其中协处理器操作1协处理器操作2为协处理器将要行的操作,目的寄存器和源寄存器均为协处理器的寄存器,指令不ARM理器的寄存器和存器。
指令示例:
CDP P32C12C10C34 指令完成协处理器P3的初始化
2LDC指令
LDC指令的格式
LDC{条件}{L} 协处理器编码,目的寄存器,[源寄存器]
LDC指令用于将源寄存器所指向的存器中的字数据送到目的寄存器中,若协处理器不能成功完成送操作,则产生未定指令异常。其中,{L}选项表示指令为长读取操作,如用于双精度数据的传输
指令示例:
LDC P3C4[R0] ;将ARM理器的寄存器R0所指向的存器中的字数据送到协处理器P3的寄存器C4中。
3STC指令
STC指令的格式
STC{条件}{L} 协处理器编码,源寄存器,[目的寄存器]
STC指令用于将源寄存器中的字数据送到目的寄存器所指向的存器中,若协处理器不能成功完成送操作,则产生未定指令异常。其中,{L}选项表示指令为长读取操作,如用于双精度数据的传输
指令示例:
STC P3C4[R0] ;将协处理器P3的寄存器C4中的字数据送到ARM理器的寄存器R0所指向的存器中。
4MCR指令
MCR指令的格式
MCR{条件} 协处理器编码协处理器操作1,源寄存器,目的寄存器1,目的寄存器2协处理器操作2
MCR指令用于将ARM理器寄存器中的数据送到协处理器寄存器中,协处理器不能成功完成操作,则产生未定指令异常。其中协处理器操作1协处理器操作2为协处理器将要行的操作,源寄存器ARM理器的寄存器,目的寄存器1和目的寄存器2为协处理器的寄存器。
指令示例:
MCR P33R0C4C56 指令将ARM理器寄存器R0中的数据送到协处理器P3的寄存器C4C5中。
5MRC指令
MRC指令的格式
MRC{条件} 协处理器编码协处理器操作1,目的寄存器,源寄存器1,源寄存器2协处理器操作2
MRC指令用于将协处理器寄存器中的数据送到ARM理器寄存器中,协处理器不能成功完成操作,则产生未定指令异常。其中协处理器操作1协处理器操作2为协处理器将要行的操作,目的寄存器ARM理器的寄存器,源寄存器1和源寄存器2为协处理器的寄存器。
指令示例:
MRC P33R0C4C56 指令将协处理器P3的寄存器中的数据送到ARM理器寄存器中。

3.3.10异常生指令
ARM理器所支持的异常指令有如下两条:
— SWI 件中断指令
— BKPT 断点中断指令
1SWI指令
SWI指令的格式
SWI{条件} 24位的立即数
SWI指令用于件中断,以便用程序能用操作系的系例程。操作系SWI的异常理程序中提供相的系,指令中24位的立即数指定用程序用系例程的型,相参数通通用寄存器传递,当指令中24位的立即数被忽略,用程序用系例程的型由通用寄存器R0的内容决定,同,参数通其他通用寄存器传递
指令示例:
SWI 0x02 指令用操作系统编号位02的系例程。
2BKPT指令
BKPT指令的格式
BKPT 16位的立即数
BKPT指令件断点中断,可用于程序的调试
3.4 Thumb
指令及
兼容数据总线宽16位的用系ARM体系构除了支持行效率很高的32ARM指令集以外,同支持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所需的存间约为ARM60%~70
— Thumb使用的指令数比ARM30%~40
若使用32位的存器,ARMThumb40
若使用16位的存器,ThumbARM40%~50
ARM相比,使用Thumb,存器的功耗会降低30
然,ARM指令集和Thumb指令集各有其点,若的性能有高要求,使用32位的存ARM指令集,若的成本及功耗有高要求,则应使用16位的存Thumb指令集。当然,若两者合使用,充分发挥其各自的点,会取得更好的效果。

3.5 本章小
本章系的介ARM指令集中的基本指令,以及各指令的合及方法,由基本指令可以派生出一些新的指令,但使用方法与基本指令似。与常的如X86体系构的汇编指令相比ARM指令系是从指令集本身,是从址方式上,都相对复杂一些。
Thumb指令集作ARM指令集的一个子集,其使用方法与ARM指令集似,在此未作详细的描述,但并不意味着Thumb指令集不如ARM指令集重要,事上,他各自有其自己的