简介

ARM汇编语言是针对ARM架构设计的低级编程语言,用于直接操作硬件和编写高效的系统级程序。

寄存器

ARM处理器的寄存器系统在不同的架构版本中有所变化,但下面的内容将基于较常见的32位ARM Cortex-A系列处理器为例,详细介绍ARM寄存器系统的基本构成。

通用寄存器(General Purpose Registers, GPRs)

ARM架构通常提供一组32位宽的通用寄存器,数量在不同的ARM架构版本和工作模式下有所不同,但至少包含R0至R15。在ARM Cortex-A系列处理器中,常常提及32个32位通用寄存器(有时包括程序计数器PC)。

  • R0-R12:这些寄存器在所有处理器模式下都可以直接使用,主要用于存放临时变量、函数参数和返回值等。
  • R13 (SP):堆栈指针寄存器,在不同处理器模式下有不同的实例,用于指示当前栈帧的位置。
  • R14 (LR):链接寄存器,同样在不同模式下有不同的实例,用于存储子程序返回地址。
  • R15 (PC):程序计数器,它指向当前正在执行的指令地址,同时也是下一条要被执行的指令地址。

状态寄存器(Status Registers)

  • CPSR (Current Program Status Register):当前程序状态寄存器,包含了条件码标志、中断禁止位、处理器模式和其他控制位等信息。
  • SPSR (Saved Program Status Register):在发生异常进入新的处理器模式时,CPSR的内容会被复制到相应的SPSR中,以保持异常发生前的状态。

模式相关的寄存器实例

ARM处理器支持多种工作模式,包括用户模式(User)、系统模式(System)、快速中断模式(FIQ)、中断模式(IRQ)、管理模式(Supervisor)、中止模式(Abort)和未定义模式(Undefined)。在不同模式下,部分寄存器会有对应的私有副本,如R13和R14,会在每个模式下有一个单独的实例(例如,用户模式下的R13_USR和R14_USR,FIQ模式下的R13_FIQ和R14_FIQ等)。

特殊用途寄存器(Special Purpose Registers, SPRs)

除了一般的通用寄存器和状态寄存器之外,还有其他特殊用途寄存器,它们的功能各异,例如:

  • 控制寄存器(Control Registers),用于设定和查询处理器的运行控制状态,如中断控制器、系统控制寄存器等。
  • 异常向量表基址寄存器(Vector Table Base Register, VTBR),用于设置异常处理程序的入口地址。

指令

数据传送指令

  • MOV: 直接将源操作数的值传递到目的寄存器,例如:
MOV R0, #10         ; 把立即数10放入R0寄存器
MOV R1, R2          ; 把R2寄存器的值复制到R1寄存器
  • LDR/STR: 分别用于从内存加载数据到寄存器和将寄存器数据存储到内存,例如:
LDR R3, [R4, #8]    ; 从R4+8地址处加载数据到R3寄存器
STR R5, [R6, #12]   ; 将R5寄存器的值存储到R6+12地址处
  • LDM/STM: 同时加载或存储多个寄存器的数据,例如:
LDMIA R7!, {R8-R10}  ; 从R7开始的内存地址连续加载三个字到R8-R10,然后更新R7指向下一个地址
STMDB SP!, {R11-R13} ; 将R11-R13的值存储到SP指向的内存地址,并更新SP向下偏移

算术逻辑运算指令

  • ADD, SUB, MUL, DIV 等用于基本的算术运算,如:
ADD R1, R2, R3      ; R1 = R2 + R3
SUB R4, R5, R6      ; R4 = R5 - R6
MUL R7, R8, R9      ; R7 = R8 * R9
  • AND, ORR, EOR, LSL, LSR, ASR等用于逻辑运算和移位操作,如:
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/BL:无条件跳转,BL还会在跳转前保存下一条指令地址到链接寄存器LR。
B label            ; 无条件跳转到label
BL subroutine      ; 调用子程序并保存返回地址
  • BX/BLX:除了跳转外还能切换指令集状态,如从ARM态切换到Thumb态或反之。
BX R0              ; 切换到R0寄存器指向的地址执行,并根据R0最低位切换指令集
BLX R1             ; 类似BX,但保存返回地址

比较和条件执行指令

  • CMP/CMN/TST/TEQ用于比较操作并影响条件码标志,根据这些标志可以执行条件分支。
CMP R2, #5         ; 比较R2和5,更新条件码
BEQ label          ; 如果结果为零(相等),跳转到label
BNE next           ; 如果结果不为零(不相等),跳转到next
BGT greater        ; 如果结果大于零,跳转到greater

加载/存储指令

  • LDRB/LDRH/LDRSB/LDRSH/STRB/STRH用于处理字节和半字数据,带有符号扩展。
LDRB R0, [R1, #4]  ; 从R1+4地址加载一个字节到R0,并进行零扩展
LDRSH R2, [R3]     ; 从R3地址加载一个半字到R2,并进行符号扩展
STRB R4, [R5, #6]  ; 将R4的最低8位存储到R5+6地址

其他常用指令

  • SWI:软件中断,用于触发操作系统服务或者异常处理。
SWI 0x123456       ; 触发编号为0x123456的软件中断
  • NOP:空操作,用于填充代码、等待周期等。
NOP                ; 执行一个空操作
  • SVC:用于进入特权模式,一般用于系统调用。
SVC 1               ; 执行系统调用编号为1的服务
  • MSR/MRS:修改特殊寄存器或读取特殊寄存器到通用寄存器,例如:
MRS R0, CPSR       ; 读取当前程序状态寄存器(CPSR)的值到R0
MSR CPSR_c, R1      ; 将R1的内容写入到CPSR的条件码字段