Cortex-M3/M4是嵌入式开发中最主流的ARM内核,广泛应用于STM32等微控制器。其汇编语言遵循RISC架构"精简高效"的设计理念。本文从核心寄存器到常用指令,再到实战示例,层层递进讲解ARM汇编的核心逻辑。
一、核心寄存器(汇编的"操作对象")
Cortex-M3/M4的寄存器是汇编指令的直接操作对象,无需记忆所有寄存器,仅需掌握以下高频核心寄存器,即可覆盖绝大多数嵌入式开发场景。
1. 通用寄存器
寄存器别名 / 功能核心用途R0-R7低寄存器暂存运算数据、传递函数前4个参数、存储内存地址(配合LDR/STR访问RAM/ROM)R13SP(栈指针)指向栈顶,管理函数调用时的上下文保存与恢复。Cortex-M默认采用满递减栈模型R14LR(链接寄存器)保存函数调用后的返回地址(BL指令自动存入)。R15PC(程序计数器)指向当前执行的指令地址,修改PC可实现跳转。Cortex-M始终处于Thumb状态,故PC的BIT0必须为1。2. 程序状态寄存器
程序状态寄存器(xPSR)由APSR(应用状态寄存器)、IPSR(中断程序状态寄存器)和EPSR(执行程序状态寄存器)三个部分组合而成,其中APSR需重点关注,其4个标志位是"条件指令"的核心判断依据:
- N(负标志):运算结果为负(最高位为1)时N=1,否则为0;用于判断有符号数的正负。
- Z(零标志):运算结果为0时Z=1,否则为0;常用于循环结束判断(如计数到0)、相等比较(如CMP R0, R1后用BEQ跳转)。
- C(进位/借位标志):加法有进位或减法无借位时C=1,否则为0;用于多字节运算(如64位数据加法)。
- V(溢出标志):有符号数运算超出32位范围时V=1,否则为0;用于检测有符号数运算错误(如0x7FFFFFFF + 1会溢出)。
二、ARM常用汇编指令
Cortex-M3/M4架构遵循Load-Store原则,即数据处理指令只操作寄存器,与内存的数据交换必须通过LDR(从内存加载数据到寄存器)和STR(将寄存器数据存储到内存)指令完成。
1. 数据处理指令(CPU内部寄存器运算)
仅操作通用寄存器,不直接访问内存,是实现"加减、比较、位操作"等逻辑的核心。
(1)MOV:数据传送指令
核心作用:实现数据在寄存器间的传递,或立即数到寄存器的加载。
语法:MOV{S}{cond} Rd, Op2
- {S}:可选,指令执行后更新APSR标志(如MOVS R0, #0会设置Z=1)。
- {cond}:可选,条件执行后缀(如MOVNE R0, #0xFF表示"若Z=0(前序运算结果非0),则执行")。
- Op2:可以是立即数或另一个寄存器,并可包含移位操作(如R3, LSL #2)。
示例:
[code]MOV R0, #0x20000000 ; R0 = 0x20000000(加载RAM基地址)MOVS R1, #0 ; R1 = 0,同时更新APSR的Z标志(Z=1)MOV R2, R3, LSL #2 ; R2 = R3 |