ARM汇编语言是针对ARM架构设计的低级编程语言,用于直接操作硬件和编写高效的系统级程序。
ARM处理器的寄存器系统在不同的架构版本中有所变化,但下面的内容将基于较常见的32位ARM Cortex-A系列处理器为例,详细介绍ARM寄存器系统的基本构成。
ARM架构通常提供一组32位宽的通用寄存器,数量在不同的ARM架构版本和工作模式下有所不同,但至少包含R0至R15。在ARM Cortex-A系列处理器中,常常提及32个32位通用寄存器(有时包括程序计数器PC)。
ARM处理器支持多种工作模式,包括用户模式(User)、系统模式(System)、快速中断模式(FIQ)、中断模式(IRQ)、管理模式(Supervisor)、中止模式(Abort)和未定义模式(Undefined)。在不同模式下,部分寄存器会有对应的私有副本,如R13和R14,会在每个模式下有一个单独的实例(例如,用户模式下的R13_USR和R14_USR,FIQ模式下的R13_FIQ和R14_FIQ等)。
除了一般的通用寄存器和状态寄存器之外,还有其他特殊用途寄存器,它们的功能各异,例如:
MOV R0, #10 ; 把立即数10放入R0寄存器
MOV R1, R2 ; 把R2寄存器的值复制到R1寄存器
LDR R3, [R4, #8] ; 从R4+8地址处加载数据到R3寄存器
STR R5, [R6, #12] ; 将R5寄存器的值存储到R6+12地址处
LDMIA R7!, {R8-R10} ; 从R7开始的内存地址连续加载三个字到R8-R10,然后更新R7指向下一个地址
STMDB SP!, {R11-R13} ; 将R11-R13的值存储到SP指向的内存地址,并更新SP向下偏移
ADD R1, R2, R3 ; R1 = R2 + R3
SUB R4, R5, R6 ; R4 = R5 - R6
MUL R7, R8, R9 ; R7 = R8 * R9
AND R10, R11, #0xFF ; R10 = R11 & 0xFF
ORR R12, R13, R14 ; R12 = R13 | R14
EOR R15, R1, R2 ; R15 = R1 ^ R2
LSL R0, R1, #3 ; R0 = R1 << 3
ASR R3, R4, #2 ; R3 = R4 >> 2 (算术右移,保留符号位)
B label ; 无条件跳转到label
BL subroutine ; 调用子程序并保存返回地址
BX R0 ; 切换到R0寄存器指向的地址执行,并根据R0最低位切换指令集
BLX R1 ; 类似BX,但保存返回地址
CMP R2, #5 ; 比较R2和5,更新条件码
BEQ label ; 如果结果为零(相等),跳转到label
BNE next ; 如果结果不为零(不相等),跳转到next
BGT greater ; 如果结果大于零,跳转到greater
LDRB R0, [R1, #4] ; 从R1+4地址加载一个字节到R0,并进行零扩展
LDRSH R2, [R3] ; 从R3地址加载一个半字到R2,并进行符号扩展
STRB R4, [R5, #6] ; 将R4的最低8位存储到R5+6地址
SWI 0x123456 ; 触发编号为0x123456的软件中断
NOP ; 执行一个空操作
SVC 1 ; 执行系统调用编号为1的服务
MRS R0, CPSR ; 读取当前程序状态寄存器(CPSR)的值到R0
MSR CPSR_c, R1 ; 将R1的内容写入到CPSR的条件码字段