精简指令集的最大特点是所有指令占用相同的存储空间。ARM处理器支持ARM和Thumb两种指令集;ARM指令集工作在32位模式下,指令长度都是32b;Thumb指令集工作在16位模式下,指令长度都是16b。
ARM指令集按照功能可以分为算术运算指令、逻辑运算指令、分支指令、软件中断指令和程序数据指令等。
(1)ADD指令:普通的加法运算
ADD{条件} {S} , ,
ADD指令把两个操作数op_1和op_2相加,结果存放到目的寄存器dest中,操作数op_1和op_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)
(2)ADC指令:带进位的加法运算
ADC{条件} {S} , ,
ADC指令把两个操作数op_1和op_2相加,结果存放到目的寄存器dest中。ADC指令使用一个进位标志,可以进行大于32位的加法操作。
;64位数结果:存放在寄存器R0和R1
;两个32位数:存放在寄存器R2和R3
ADCS R0, R2, R3 ;带进位加,结果存放在R0和R1寄存器
(3)SUB指令:用于普通的减法运算
SUB{条件} {S} , ,
ADD指令把两个操作数op_1和op_2相减,结果存放到目的寄存器dest中,操作数op_1和op_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)
(4)SBC指令:用于带借位的减法运算
SBC{条件} {S} , ,
SBC指令作用适用于两个操作数的减法,结果存放到目的寄存器。SBC指令支持带借位标志,所以可以支持大于32位数的减法操作。
(1)AND指令:两个操作数的逻辑与
AND{条件} {S} , ,
AND指令在两个操作数op_1和op_2之间做逻辑与操作,结果存放到目的寄存器dest中。
AND R0, R0, #3 ;R0的第0和第1位保持不变,其它位清零
(2)EOR指令:对两个操作数做异或运算。
EOR{条件} {S} , ,
EOR R0, R0, #3 ;R0的第0位和第1位被反转
(3)MOV指令:两个操作数之间复制数据
MOV{条件} {S} ,
MOV R0, R0 ;R0 = R0
MOV R0, R0, LSL#3 ;R0 = R0 << 3
B指令:可以根据设置的条件跳转到指定的代码地址
B{条件} <地址>
数据传送指令用于CPU和存储器之间的数据传送,是ARM处理器唯一能与外部存储器交换数据的一类指令。
单一数据传送指令用于向内存装载和存储一个字节或者一个字长的数据。
LDR{条件} Rd, <地址> ;从内存中的数据装载到Rd寄存器
STR{条件} Rd, <地址> ;将Rd寄存器的数据存储到内存
LDR{条件}B Rd, <地址>
STR{条件}B Rd, <地址>
STR和LDR指令可以在内存和寄存器之间装载或存储一个或多个字节的数据,并且提供了灵活的寻址方式。Rd是要操作的数值,地址可以是基址寄存器Rbase和变址寄存器Rindex指定的地址。在条件后加入标志B代表一次传送1字节的数据。
STR Rd, {Rbase} ;存储Rd到Rbase所包含的有效地址
STR Rd, {Rbase, Rindex} ;存储Rd到Rbase+Rindex所合成的有效地址
STR Rd, {Rbase, #index} ;存储Rd到Rbase+index所合成的有效地址
多数据传送指令用于向内存装载和存储多个字节或字的数据。
xxM{条件}{类型} Rn{!}, <寄存器列表>{^}
其中,xx可以是LD,表示装载,也可以是ST,表示存储。
LDM(load Multiple),STM(store Multiple)
LDMED LDMIB ;装载前增加地址,相当于++p
LDMFD LDMIA ;装载后增加地址,相当于p++
LDMEA LDMDB ;装载前减小地址
LDMFA LDMDA ;装载后减小地址
STMFA STMIB ;存储前增加地址
STMEA STMIA ;存储后增加地址
STMFD STMDB ;存储前减小地址
STMED STMDA ;存储后减小地址
IA:(Increase After)
IB:(Increase Before)
DA:(Decrease After)
DB:(Decrease Before)
FA - Full Ascending 满递增堆栈
FD - Full Descending 满递减堆栈
ED - Empty Descending 空递减堆栈
EA - Empty Ascending 空递增堆栈