ADDS R3,R5,R8
STR R5, [R7]
S后缀紧跟在指令助记符后面
基址寄存器中的地址值 (指令执行后) =指令执行前的值+地址偏移量
而地址表达式要有明确的地址偏移量
!后缀不能用在R15的后面
必须确信这个寄存器有隐性的偏移量
,如:STMDB R1!, {R3,R14}
含义:
位置
使用专门的跳转指令(短跳转,从当前指令向前或向后的32MB
的地址空间的跳转)
带返回
的跳转指令(函数调用)带状态切换
的跳转指令(ARM7不支持)
直接向程序计数器PC写入跳转地址值(长跳转,可以实现在4GB
的地址空间中的任意跳转)
偏移量
,而不是一个绝对地址符号扩展
后再与PC相加。左移两位
:机器字长32位,指令中给出的偏移量是按字(32位)寻址的,而PC寄存器的内容按字节(8位)寻址,也就是说假如给出的偏移量是0x0100,那么对应按字节寻址的地址就应该是0x0400,即按字寻址的偏移量的4倍,也就是左移2位,才能与PC内容相加。B{条件} 目标地址
BL{条件} 目标地址
在寄存器R14中保存PC的当前内容(下一条指令)
,因此,可以通过将R14(LR) 的内容重新加载到PC中
,来返回到跳转指令之后的那个指令处执行。BX{条件}
BLX 目标地址
BLX 目标地址
指令从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态由ARM状态切换到Thumb状态
,该指令同时将PC的当前内容保存到寄存器R14中
。BLX{条件}
BLX{条件}
指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM指令,也可以是Thumb指令。目标地址处的指令类型由寄存器的bit[0]决定
。MOV PC, R14
BX R14
STMFD R13!, {,R14}
时,可以用指令LDMFD R13!, {,PC}
返回<操作>{
}{S} Rd, Rn, Operand2
MOV{条件}{S} 目的寄存器,源操作数
当PC作为目标寄存器且指令中S位被置位时
,指令在执行跳转操作的同时,将当前处理器模式的SPSR内容复制到CPSR中。MOVS PC, LR
可以实现从某些异常中断中返回MOV R1,R0 ;将寄存器R0的值传送到寄存器R1
MOV PC,R14 ;将寄存器R14的值传送到PC,常用于子程序返回
MOV R1,R0,LSL#3 ;将寄存器R0的值左移3位后传送到R1
MOV R1,#123 ;将立即数123传送到R1
MVN{条件}{S} 目的寄存器,源操作数
CMP{条件} 操作数1,操作数2
比较
,同时更新CPSR中条件标志位的值
。减法
运算,但不存储结果
,只更改条件标志位。CMP R1,R0 ;将寄存器R1的值与寄存器R0的值相减,并根据结果设置CPSR的标志位
CMP R1,#100 ;将寄存器R1的值与立即数100相减,并根据结果设置CPSR的标志位
CMN{条件} 操作数1,操作数2
CMN R1,R0 ;将寄存器R1的值与寄存器R0的值相 加,并根据结果设置CPSR的标志位
CMN R1,#100 ;将寄存器R1的值与立即数100相 加,并根据结果设置CPSR的标志位
TST{条件} 操作数1,操作数2
进行按位与运算
,并根据运算结果更新CPSR中条件标志位的值。TST指令用于测试寄存器中某些位是1还是0
TST R1,#%1 ;用于测试在寄存器R1中是否设置了最低 位(%表示二进制数)
TST R1,#0xfe ;将寄存器R1的值与立即数0xfe按位 与,并根据结果设置CPSR的标志位
TEQ{条件} 操作数1,操作数2
ADD{条件}{S} 目的寄存器,操作数1,操作数2
操作数2可以是一个寄存器,被移位的寄存器,或一个立即数
。ADD R0,R1,R2 ; R0 = R1 + R2
ADD R0,R1,#256 ; R0 = R1 + 256
ADDS R0,R2,R3,LSL#1 ; R0 = R2 + (R3 << 1)
ADC{条件}{S} 目的寄存器,操作数1,操作数2
再加上CPSR中的C条件标志位的值
,并将结果存放到目的寄存器中。做比32位大的数的加法,注意不要忘记设置S后缀来更改进位标志。
ADC指令和ADD指令联合使用可以实现64位、128位的加法操作
完成两个128位数的加法
,第一个数由高到低存放在寄存器R7~R4,第二个数由高到低存放在寄存器R11~R8,运算结果由高到低存放在寄存器R3~R0ADDS R0,R4,R8 ; 加低端的字
ADCS R1,R5,R9 ; 加第二个字,带进位
ADCS R2,R6,R10 ; 加第三个字,带进位
ADC R3,R7,R11 ; 加第四个字,带进位
SUB{条件}{S} 目的寄存器,操作数1,操作数2
SUB R0,R1,R2 ; R0 = R1 - R2
SUB R0,R1,#256 ; R0 = R1 - 256
SUBS R0,R2,R3,LSL#1 ; R0 = R2 - (R3 << 1)
SBC{条件}{S} 目的寄存器,操作数1,操作数2
CPSR中的C条件标志位的反码
,并将结果存放到目的寄存器中。表示借位
,这样就可以做大于32位的减法,注意不要忘记设置S后缀来更改进位标志。SBC R0,R1,R2 ;R0 = R1 - R2 - !C,并根据结果设置CPSR的进位标志位
RSB{条件}{S} 目的寄存器,操作数1,操作数2
逆向减法指令
,用于把操作数2减去操作数1,并将结果存放到目的寄存器中。RSB R0,R1,R2 ; R0 = R2 – R1
RSB R0,R1,#256 ; R0 = 256 – R1
RSBS R0,R2,R3,LSL#1 ; R0 = (R3 << 1) - R2
RSC{条件}{S} 目的寄存器,操作数1,操作数2
再减去CPSR中的C条件标志位的反码
,并将结果存放到目的寄存器中。注意不要忘记设置S后缀来更改进位标志。
RSC R0,R1,R2 ; R0 = R2 – R1 - !C
AND{条件}{S} 目的寄存器,操作数1,操作数2
逻辑与运算
,并把结果放置到目的寄存器中。屏蔽操作数1的某些位。
设置一个掩码值,AND指令可以提取寄存器中某些位的值
AND R0,R0,#3 ; 该指令保持R0的0、1位,其余位 清零。
ORR{条件}{S} 目的寄存器,操作数1,操作数2
逻辑或
运算,并把结果放置到目的寄存器中。设置寄存器中某些位的值为1
ORR R0,R0,#3 ; 该指令设置R0的0、1位,其余位保持不变。
EOR{条件}{S} 目的寄存器,操作数1,操作数2
逻辑异或运算
,并把结果放置到目的寄存器中。取反
EOR R0,R0,#3 ; 该指令反转R0的0、1位,其余位保持不变。
BIC{条件}{S} 目的寄存器,操作数1,操作数2
清除操作数1的某些位
,并把结果放置到目的寄存器中。如果在掩码中设置了某一位,则清除这一位,未设置的掩码位保持不变。
将寄存器中某些位的值设置成0
BIC R0,R0,#%1011 ; 该指令清除 R0 中的位 0、1、和3,其余的位保持不变。
分为运算结果为32位和运算结果为64位
两类,与前面的数据处理指令不同
指令中的所有操作数、目的寄存器必须为通用寄存器,不能对操作数使用立即数或被移位的寄存器
目的寄存器和操作数1必须是不同的寄存器。
MUL{条件}{S} 目的寄存器,操作数1,操作数2
均为32位的有符号数或无符号数。
结果仅保存了64位的低32位
MUL R0,R1,R2 ;R0 = R1 × R2
MULS R0,R1,R2 ;R0 = R1 × R2,同时设置CPSR中的相关条件标志位
MLA{条件}{S} 目的寄存器, 操作数1,操作数2,操作数3
再将乘积加上操作数3
,并把结果放置到目的寄存器中,同时可以根据运算结果设置CPSR中相应的条件标志位。有符号数或无符号数。
MLA R0,R1,R2,R3 ;R0 = R1 × R2 + R3
MLAS R0,R1,R2,R3 ;R0 = R1 × R2 + R3,同时设置CPSR中的相关条件标志位
SMULL{条件}{S} 目的寄存器Low,目的寄存器低High,操作数1,操作数2
并把结果的低32位放置到目的寄存器Low中,结果的高32位放置到目的寄存器High中
,同时可以根据运算结果设置CPSR中相应的条件标志位。有符号数。
SMULL R0,R1,R2,R3
;R0 = (R2 × R3)的低32位
;R1 = (R2 × R3)的高32位
SMLAL{条件}{S} 目的寄存器Low,目的寄存器低High,操作数1,操作数2
并把结果的低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,结果的高32位同目的寄存器High中的值相加后又放置到目的寄存器High中
,同时可以根据运算结果设置CPSR中相应的条件标志位。有符号数。
SMLAL R0,R1,R2,R3
;R0 = (R2 × R3)的低32位 + R0
;R1 = (R2 × R3)的高32位 + R1 + C
UMULL{条件}{S} 目的寄存器Low,目的寄存器低High,操作数1,操作数2
32位的无符号数。
UMLAL{条件}{S} 目的寄存器Low,目的寄存器低 High,操作数1,操作数2
32位的无符号数。