搞定ARM指令集(二)
2022-07-26 来源:csdn
一、ARM 微处理器的指令的分类与格式
ARM微处理器的指令集是加载/存储型的,也即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,而对系统存储器的访问则需要通过专门的加载/存储指令来完成。ARM微处理器的指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产生指令六大类。下面是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 位测试指令
--------------------------------------------------------------------------------------------------------------------------
二、指令的条件域
当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行。当指令的执行条件满足时,指令被执行,否则指令被忽略。
每一条ARM指令包含4位的条件码,位于指令的最高4位[31:28]。条件码共有16种,每种条件码可用两个字符表示,这两个字符可以添加在指令助记符的后面和指令同时使用。16种条件标志码中只有15种可以使用,标志码1111 保留不用。
条件码 助记符后缀 标 志 含 义
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 忽略 无条件执行
-------------------------------------------------------------------------------------------------------------------------
三、ARM 指令的寻址方式
1、立即寻址 操作数在指令中直接给出
ADD R0,R0,#1 ;R0←R0+1
ADD R0,R0,#0x3f ;R0←R0+0x3f
2、寄存器寻址 操作数在寄存器
ADD R0,R1,R2 ;R0←R1+R2
3、寄存器间接寻址 操作数的地址在寄存器
ADD R0,R1,[R2] ;R0←R1+[R2]
LDR R0,[R1] ;R0←[R1]
STR R0,[R1] ;[R1]←R0
4、基址变址寻址 操作数地址 = 基址寄存器 + 指令中给出的地址偏移
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]
5、多寄存器寻址 类似寄存器寻址,此处是多个寄存器而已
LDMIA R0,{R1,R2,R3,R4} ;R1←[R0]
;R2←[R0+4]
;R3←[R0+8]
;R4←[R0+12]
6、相对寻址 目标地址 = pc 当前值 + 指令给出的标号偏移地址
BL NEXT ;跳转到子程序NEXT 处执行
......
NEXT
......
MOV PC,LR ;从子程序返回
7、堆栈寻址
ARM 微处理器支持这四种类型的堆栈工作方式。
- 满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生成。
- 满递减堆栈:堆栈指针指向最后压入的数据,且由高地址向低地址生成。
- 空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。
- 空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。
-----------------------------------------------------------------------------------------------------------------------
四、ARM 指令集
1、跳转指令
— 使用专门的跳转指令。 32MB 地址空间
— 直接向程序计数器PC 写入跳转地址值。 4GB 地址空间
— B 跳转指令
— BL 带返回的跳转指令
— BLX 带返回和状态切换的跳转指令
— BX 带状态切换的跳转指令
B{条件} 目标地址 其他的类似
2、数据处理指令
数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令等。
数据传送指令用于在寄存器和存储器之间进行数据的双向传输。
算术逻辑运算指令完成常用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR 中的相应条件标志位。
比较指令不保存运算结果,只更新CPSR 中相应的条件标志位。
数据处理指令包括:
— MOV 数据传送指令 MOV{条件}{S} 目的寄存器,源操作数
MOV R1,R0 ;将寄存器R0 的值传送到寄存器R1
MOV PC,R14 ;将寄存器R14 的值传送到PC,常用于子程序返回
MOV R1,R0,LSL#3 ;将寄存器R0 的值左移3 位后传送到R1
— MVN 数据取反传送指令 MVN{条件}{S} 目的寄存器,源操作数
MVN R0,#0 ;将立即数0 取反传送到寄存器R0 中,完成后R0=-1
— CMP 比较指令 CMP{条件} 操作数1,操作数2
CMP R1,R0 ;将寄存器R1 的值与寄存器R0 的值相减,并根据结果设置CPSR 的标志位
CMP R1,#100 ;将寄存器R1 的值与立即数100 相减,并根据结果设置CPSR 的标志位
— CMN 反值比较指令 CMN{条件} 操作数1,操作数2
CMN R1,R0 ;将寄存器R1 的值与寄存器R0 的值相加,并根据结果设置CPSR 的标志位
CMN R1,#100 ;将寄存器R1 的值与立即数100 相加,并根据结果设置CPSR 的标志位
— TST 位测试指令 TST{条件} 操作数1,操作数2
TST R1,#%1 ;用于测试在寄存器R1 中是否设置了最低位(%表示二进制数)
TST R1,#0xffe ;将寄存器R1 的值与立即数0xffe 按位与,并根据结果设置CPSR 的标志位
— TEQ 相等测试指令 TEQ{条件} 操作数1,操作数2
TEQ R1,R2 ;将寄存器R1 的值与寄存器R2 的值按位异或,并根据结果设置CPSR 的标志位
— ADD 加法指令 ADD{条件}{S} 目的寄存器,操作数1,操作数2
ADD R0,R1,R2 ; R0 = R1 + R2
ADD R0,R1,#256 ; R0 = R1 + 256
ADD R0,R2,R3,LSL#1 ; R0 = R2 + (R3 << 1)
— ADC 带进位加法指令 ADC{条件}{S} 目的寄存器,操作数1,操作数2
ADDS R0,R4,R8 ; 加低端的字
ADCS R1,R5,R9 ; 加第二个字,带进位
ADCS R2,R6,R10 ; 加第三个字,带进位
ADC R3,R7,R11 ; 加第四个字,带进位
— SUB 减法指令 SUB{条件}{S} 目的寄存器,操作数1,操作数2
SUB R0,R1,R2 ; R0 = R1 - R2
SUB R0,R1,#256 ; R0 = R1 - 256
SUB R0,R2,R3,LSL#1 ; R0 = R2 - (R3 << 1)
— SBC 带借位减法指令 SBC{条件}{S} 目的寄存器,操作数1,操作数2
SUBS R0,R1,R2 ; R0 = R1 - R2 - !C,并根据结果设置CPSR 的进位标志位
— RSB 逆向减法指令 RSC{条件}{S} 目的寄存器,操作数1,操作数2
RSB R0,R1,R2 ; R0 = R2 – R1
RSB R0,R1,#256 ; R0 = 256 – R1
RSB R0,R2,R3,LSL#1 ; R0 = (R3 << 1) - R2
— RSC 带借位的逆向减法指令 RSC{条件}{S} 目的寄存器,操作数1,操作数2
RSC R0,R1,R2 ; R0 = R2 – R1 - !C
— AND 逻辑与指令 AND{条件}{S} 目的寄存器,操作数1,操作数2
AND R0,R0,#3 ; 该指令保持R0 的0、1 位,其余位清零。
— ORR 逻辑或指令 ORR{条件}{S} 目的寄存器,操作数1,操作数2
ORR R0,R0,#3 ; 该指令设置R0 的0、1 位,其余位保持不变
— EOR 逻辑异或指令 EOR{条件}{S} 目的寄存器,操作数1,操作数2
EOR R0,R0,#3 ; 该指令反转R0 的0、1 位,其余位保持不变。
— BIC 位清除指令 BIC{条件}{S} 目的寄存器,操作数1,操作数2
BIC R0,R0,#%1011 ; 该指令清除 R0 中的位 0、1、和 3,其余的位保持不变。
3、乘法指令与乘加指令
ARM 微处理器支持的乘法指令与乘加指令共有6 条,可分为运算结果为32 位和运算结果为64位两类,与前面的数据处理指令不同,指令中的所有操作数、目的寄存器必须为通用寄存器,不能对操作数使用立即数或被移位的寄存器,同时,目的寄存器和操作数1 必须是不同的寄存器。
乘法指令与乘加指令共有以下6 条:
— MUL 32 位乘法指令 MUL{条件}{S} 目的寄存器,操作数1,操作数2
MUL R0,R1,R2 ;R0 = R1 × R2
MULS R0,R1,R2 ;R0 = R1 × R2,同时设置CPSR 中的相关条件标志位
— MLA 32 位乘加指令 MLA{条件}{S} 目的寄存器,操作数1,操作数2,操作数3
MLA R0,R1,R2,R3 ;R0 = R1 × R2 + R3
MLAS R0,R1,R2,R3 ;R0 = R1 × R2 + R3,同时设置CPSR 中的相关条件标志位
— SMULL 64 位有符号数乘法指令 SMULL{条件}{S} 目的寄存器Low,目的寄存器低High,操作数1,操作数2
SMULL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32 位
;R1 = (R2 × R3)的高32 位
— SMLAL 64 位有符号数乘加指令 SMLAL{条件}{S} 目的寄存器Low,目的寄存器低High,操作数1,操作数2
SMLAL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32 位 + R0
;R1 = (R2 × R3)的高32 位 + R1
— UMULL 64 位无符号数乘法指令 UMULL{条件}{S} 目的寄存器Low,目的寄存器低High,操作数1,操作数2
UMULL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32 位
;R1 = (R2 × R3)的高32 位
— UMLAL 64 位无符号数乘加指令 UMLAL{条件}{S} 目的寄存器Low,目的寄存器低High,操作数1,操作数2
UMLAL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32 位 + R0
;R1 = (R2 × R3)的高32 位 + R1
4、程序状态寄存器访问指令
ARM 微处理器支持程序状态寄存器访问指令,用于在程序状态寄存器和通用寄存器之间传送数据,程序状态寄存器访问指令包括以下两条:
— MRS 程序状态寄存器到通用寄存器的数据传送指令 MRS{条件} 通用寄存器,程序状态寄存器(CPSR 或SPSR)
MRS R0,CPSR ;传送CPSR 的内容到R0
MRS R0,SPSR ;传送SPSR 的内容到R0
— MSR 通用寄存器到程序状态寄存器的数据传送指令 MSR{条件} 程序状态寄存器(CPSR 或SPSR)_<域>,操作数
MSR CPSR,R0 ;传送R0 的内容到CPSR
MSR SPSR,R0 ;传送R0 的内容到SPSR
MSR CPSR_c,R0 ;传送R0 的内容到SPSR,但仅仅修改CPSR 中的控制位域
5、加载/存储指令
ARM 微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。常用的加载存储指令如下:
— LDR 字数据加载指令 LDR{条件} 目的寄存器,<存储器地址>
LDR R0,[R1] ;将存储器地址为R1 的字数据读入寄存器R0。
LDR R0,[R1,R2] ;将存储器地址为R1+R2 的字数据读入寄存器R0。
LDR R0,[R1,#8] ;将存储器地址为R1+8 的字数据读入寄存器R0。
LDR R0,[R1,R2] ! ;将存储器地址为R1+R2 的字数据读入寄存器R0,并将新地址R1+R2 写入R1。
LDR R0,[R1,#8] ! ;将存储器地址为R1+8 的字数据读入寄存器R0,并将新地址R1+8 写入R1。
LDR R0,[R1],R2 ;将存储器地址为R1 的字数据读入寄存器R0,并将新地址R1+R2 写入R1。
LDR R0,[R1,R2,LSL#2]! ;将存储器地址为R1+R2×4 的字数据读入寄存器R0,并将新地址R1+R2×4 写入R1。
LDR R0,[R1],R2,LSL#2 ;将存储器地址为R1 的字数据读入寄存器R0,并将新地址R1+R2×4 写入R1。
— LDRB 字节数据加载指令 LDR{条件}B 目的寄存器,<存储器地址>
LDRB R0,[R1] ;将存储器地址为R1 的字节数据读入寄存器R0,并将R0 的高24 位清零。
LDRB R0,[R1,#8] ;将存储器地址为R1+8 的字节数据读入寄存器R0,并将R0 的高24 位清零。
— LDRH 半字数据加载指令 LDR{条件}H 目的寄存器,<存储器地址>
LDRH R0,[R1] ;将存储器地址为R1 的半字数据读入寄存器R0,并将R0 的高16 位清零。
LDRH R0,[R1,#8] ;将存储器地址为R1+8 的半字数据读入寄存器R0,并将R0 的高16 位清零。
LDRH R0,[R1,R2] ;将存储器地址为R1+R2 的半字数据读入寄存器R0,并将R0 的高16 位清零。
— STR 字数据存储指令 STR{条件} 源寄存器,<存储器地址>
STR R0,[R1],#8 ;将R0 中的字数据写入以R1 为地址的存储器中,并将新地址R1+8 写入R1。
STR R0,[R1,#8] ;将R0 中的字数据写入以R1+8 为地址的存储器中。
— STRB 字节数据存储指令 STR{条件}B 源寄存器,<存储器地址>
STRB R0,[R1] ;将寄存器R0 中的字节数据写入以R1 为地址的存储器中。
STRB R0,[R1,#8] ;将寄存器R0 中的字节数据写入以R1+8 为地址的存储器中。
— STRH 半字数据存储指令 STR{条件}H 源寄存器,<存储器地址>
STRH R0,[R1] ;将寄存器R0 中的半字数据写入以R1 为地址的存储器中。
STRH R0,[R1,#8] ;将寄存器R0 中的半字数据写入以R1+8 为地址的存储器中。
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。同时,该后缀还表示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。
STMFD R13!,{R0,R4-R12,LR} ;将寄存器列表中的寄存器(R0,R4 到R12,LR)存入堆栈。
LDMFD R13!,{R0,R4-R12,PC} ;将堆栈内容恢复到寄存器(R0,R4 到R12,LR)。
7、数据交换指令
ARM 微处理器所支持数据交换指令能在存储器和寄存器之间交换数据。数据交换指令有如下两条:
— SWP 字数据交换指令 SWP{条件} 目的寄存器,源寄存器1,[源寄存器2]
SWP R0,R1,[R2] ;将R2 所指向的存储器中的字数据传送到R0,同时将R1 中的字数据传送到R2 所指向的存储单元。
SWP R0,R0,[R1] ;该指令完成将R1 所指向的存储器中的字数据与R0 中的字数据交换。— SWPB 字节数据交换指令 SWP{条件}B 目的寄存器,源寄存器1,[源寄存器2]
SWPB R0,R1,[R2] ;将R2 所指向的存储器中的字节数据传送到R0,R0 的高24 位清零,同时将R1 中的低8 位数据传送到R2 所指向的存储单元。
SWPB R0,R0,[R1] ;该指令完成将R1 所指向的存储器中的字节数据与R0 中的低8 位数据交换。
8、移位指令
ARM 微处理器内嵌的桶型移位器(Barrel Shifter),支持数据的各种移位操作,移位操作在ARM 指令集中不作为单独的指令使用,它只能作为指令格式中是一个字段,在汇编语言中表示为指令中的选项。例如,数据处理指令的第二个操作数为寄存器时,就可以加入移位操作选项对它进行各种移位操作。移位操作包括如下6 种类型,ASL 和LSL 是等价的,可以自由互换:
— LSL 逻辑左移 通用寄存器,LSL(或ASL) 操作数
MOV R0, R1, LSL#2 ;将R1 中的内容左移两位后传送到R0 中。
— LSR 逻辑右移 通用寄存器,LSR 操作数
MOV R0, R1, LSR#2 ;将R1 中的内容右移两位后传送到R0 中,左端用零来填充
— ASR 算术右移 通用寄存器,ASR 操作数
MOV R0, R1, ASR#2 ;将R1 中的内容右移两位后传送到R0 中,左端用第31 位的值来填充
— ASL 算术左移 通用寄存器,ASR 操作数
MOV R0, R1, ASL#2 ;将R1 中的内容右移两位后传送到R0 中,右端用第2 位的值来填充
— ROR 循环右移 通用寄存器,ROR 操作数
MOV R0, R1, ROR#2 ;将R1 中的内容循环右移两位后传送到R0 中。
— RRX 带扩展的循环右移 通用寄存器,RRX 操作数
MOV R0, R1, RRX#2 ;将R1 中的内容进行带扩展的循环右移两位后传送到R0 中。
9、协处理器指令
ARM 微处理器可支持多达16 个协处理器,用于各种协处理操作,在程序执行的过程中,每个协处理器只执行针对自身的协处理指令,忽略ARM 处理器和其他协处理器的指令。
ARM 的协处理器指令主要用于ARM 处理器初始化ARM 协处理器的数据处理操作,以及在ARM 处理器的寄存器和协处理器的寄存器之间传送数据,和在ARM 协处理器的寄存器和存储器之
间传送数据。
ARM 协处理器指令包括以下5 条:
— CDP 协处理器数操作指令
— LDC 协处理器数据加载指令
— STC 协处理器数据存储指令
— MCR ARM 处理器寄存器到协处理器寄存器的数据传送指令
— MRC 协处理器寄存器到ARM 处理器寄存器的数据传送指令
---CDP 指令
CDP 指令的格式为:
CDP{条件} 协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2。
CDP 指令用于ARM 处理器通知ARM 协处理器执行特定的操作,若协处理器不能成功完成特定的操
作,则产生未定义指令异常。其中协处理器操作码1 和协处理器操作码2 为协处理器将要执行的操
作,目的寄存器和源寄存器均为协处理器的寄存器,指令不涉及ARM 处理器的寄存器和存储器。
指令示例:
CDP P3,2,C12,C10,C3,4 ;该指令完成协处理器P3 的初始化
---LDC 指令
LDC 指令的格式为:
LDC{条件}{L} 协处理器编码,目的寄存器,[源寄存器]
LDC 指令用于将源寄存器所指向的存储器中的字数据传送到目的寄存器中,若协处理器不能成功完成传送操作,则产生未定义指令异常。其中,{L}选项表示指令为长读取操作,如用于双精度数据的传输。
指令示例:
LDC P3,C4,[R0] ;将ARM 处理器的寄存器R0 所指向的存储器中的字数据传送到协处理器P3 的寄存器C4 中。
---STC 指令
STC 指令的格式为:
STC{条件}{L} 协处理器编码,源寄存器,[目的寄存器]
STC 指令用于将源寄存器中的字数据传送到目的寄存器所指向的存储器中,若协处理器不能成功完成传送操作,则产生未定义指令异常。其中,{L}选项表示指令为长读取操作,如用于双精度数据的传输。
指令示例:
STC P3,C4,[R0] ;将协处理器P3 的寄存器C4 中的字数据传送到ARM 处理器的寄存器R0 所指向的存储器中。
---MCR 指令
MCR 指令的格式为:
MCR{条件} 协处理器编码,协处理器操作码1,源寄存器,目的寄存器1,目的寄存器2,协处理器操作码2。
MCR 指令用于将ARM 处理器寄存器中的数据传送到协处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常。其中协处理器操作码1 和协处理器操作码2 为协处理器将要执行的操作,源寄存器为ARM 处理器的寄存器,目的寄存器1 和目的寄存器2 均为协处理器的寄存器。
指令示例:
MCR P3,3,R0,C4,C5,6 ;该指令将ARM 处理器寄存器R0 中的数据传送到协处理器P3 的寄存器C4 和C5 中。
---MRC 指令
MRC 指令的格式为:
MRC{条件} 协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2。
MRC 指令用于将协处理器寄存器中的数据传送到ARM 处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常。其中协处理器操作码1 和协处理器操作码2 为协处理器将要执行的操作,目的寄存器为ARM 处理器的寄存器,源寄存器1 和源寄存器2 均为协处理器的寄存器。
指令示例:
MRC P3,3,R0,C4,C5,6 ;该指令将协处理器P3 的寄存器中的数据传送到ARM 处理器寄存器
10、异常产生指令
ARM 微处理器所支持的异常指令有如下两条:
— SWI 软件中断指令
— BKPT 断点中断指令
---SWI 指令
SWI 指令的格式为:
SWI{条件} 24 位的立即数
SWI 指令用于产生软件中断,以便用户程序能调用操作系统的系统例程。操作系统在SWI 的异常处理程序中提供相应的系统服务,指令中24 位的立即数指定用户程序调用系统例程的类型,相关参数通过通用寄存器传递,当指令中24 位的立即数被忽略时,用户程序调用系统例程的类型由通用寄存器R0 的内容决定,同时,参数通过其他通用寄存器传递。
指令示例:
SWI 0x02 ;该指令调用操作系统编号位02 的系统例程。
---BKPT 指令
BKPT 指令的格式为:
BKPT 16 位的立即数
BKPT 指令产生软件断点中断,可用于程序的调试。
---------------------------------------------------------------------------------------------------------------------------
五、Thumb 指令及应用
为兼容数据总线宽度为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指令集。当然,若两者结合使用,充分发挥其各自的优点,会取得更好的效果。