一、多寄存器寻址
例:LDMIA R0!, {R1-R4}
R1 <- [R0]
R2 <- [R0 + 4]
R3 <- [R0 + 8]
R4 <- [R0 + 12]
该指令的后缀IA表示在每次执行完加载/存储操作后,R0按字长度增加,因此指令可以将连续存储单元的值传送到R1到R4中。
摘自:《汇编语言程序设计——基于ARM体系结构(第2版)》P72
二、进栈出栈操作
ARM分别采用LDMFD和STMFD指令来支持POP操作(出栈)和PUSH操作(进栈),R13作为堆栈指针。堆栈寻址的例子如下:
STMFD R13!, {R0-R4}
LDMFD R13!, {R0-R4}
第一条指令将R0-R4中的数据压入堆栈,R13为堆栈指针;第二条指令将数据出栈,恢复R0-R4原先的值。
摘自:《汇编语言程序设计——基于ARM体系结构(第2版)》P73
三、BIC位清除指令
汇编格式:BIC{<cond>}{S} Rd, Rn, operand2
operand2可以看做一个32位的掩码,如果在掩码中设置了某一位,则清除Rn中相应的位。
摘自:《汇编语言程序设计——基于ARM体系结构(第2版)》P84
四、比较指令
比较指令根据结果更新CPSR中的标志位,但不影响其他的寄存器。对于比较指令,不需要使用S后缀就可以改变标志位的值。
摘自:《汇编语言程序设计——基于ARM体系结构(第2版)》P84
4.1 CMP比较指令
该指令实质上是进行一次减法运算,但不存储结果,只更改条件标志位。
摘自:《汇编语言程序设计——基于ARM体系结构(第2版)》P85
4.2 CMN反值比较指令
该指令实际上是将操作数Rn和操作数operand2相加,并根据结果更改条件标志位。
摘自:《汇编语言程序设计——基于ARM体系结构(第2版)》P85
五、乘法指令
与前面的数据处理指令不同,指令中的源操作数、目的寄存器必须为通用寄存器,不能对操作数使用立即数或被位移的寄存器。同时,目的寄存器Rd和操作数Rm必须是不同的寄存器。
乘法指令和乘加指令共有以下6条:
MUL、MLA、SMULL、SMLAL、UMULL、UMLAL。
有S后缀时执行结果影响CPSR中条件标志位N和Z值,在ARMv4及以前版本中,标志C和V不可靠,在ARMv5及其以后版本中不影响C和V标志(6条乘法和乘加指令对于S位的规定相同)。
摘自:《汇编语言程序设计——基于ARM体系结构(第2版)》P86