晋江+网站建设+推广,wordpress弹幕主题,it人才外包,软件库合集资料网站一、核心寄存器#xff08;汇编的操作对象#xff09;
Cortex-M3/M4的寄存器是汇编指令的直接操作对象#xff0c;无需记忆所有寄存器#xff0c;仅需掌握以下高频核心寄存器#xff0c;即可覆盖绝大多数嵌入式开发场景。 1. 通用寄存器
寄存器 别名 / 功能…一、核心寄存器汇编的操作对象Cortex-M3/M4的寄存器是汇编指令的直接操作对象无需记忆所有寄存器仅需掌握以下高频核心寄存器即可覆盖绝大多数嵌入式开发场景。1. 通用寄存器寄存器 别名 / 功能 核心用途R0-R7 低寄存器 暂存运算数据、传递函数前4个参数、存储内存地址配合LDR/STR访问RAM/ROMR13 SP栈指针 指向栈顶管理函数调用时的上下文保存与恢复。Cortex-M默认采用满递减栈模型R14 LR链接寄存器 保存函数调用后的返回地址BL指令自动存入。R15 PC程序计数器 指向当前执行的指令地址修改PC可实现跳转。Cortex-M始终处于Thumb状态故PC的BIT0必须为1。2. 程序状态寄存器程序状态寄存器xPSR由APSR应用状态寄存器、IPSR中断程序状态寄存器和EPSR执行程序状态寄存器三个部分组合而成其中APSR需重点关注其4个标志位是条件指令的核心判断依据N负标志运算结果为负最高位为1时N1否则为0用于判断有符号数的正负。Z零标志运算结果为0时Z1否则为0常用于循环结束判断如计数到0、相等比较如CMP R0, R1后用BEQ跳转。C进位/借位标志加法有进位或减法无借位时C1否则为0用于多字节运算如64位数据加法。V溢出标志有符号数运算超出32位范围时V1否则为0用于检测有符号数运算错误如0x7FFFFFFF 1会溢出。二、ARM常用汇编指令Cortex-M3/M4架构遵循Load-Store原则即数据处理指令只操作寄存器与内存的数据交换必须通过LDR从内存加载数据到寄存器和STR将寄存器数据存储到内存指令完成。1. 数据处理指令CPU内部寄存器运算仅操作通用寄存器不直接访问内存是实现加减、比较、位操作等逻辑的核心。1MOV数据传送指令核心作用实现数据在寄存器间的传递或立即数到寄存器的加载。语法MOV{S}{cond} Rd, Op2{S}可选指令执行后更新APSR标志如MOVS R0, #0会设置Z1。{cond}可选条件执行后缀如MOVNE R0, #0xFF表示若Z0前序运算结果非0则执行。Op2可以是立即数或另一个寄存器并可包含移位操作如R3, LSL #2。示例MOV R0, #0x20000000 ; R0 0x20000000加载RAM基地址MOVS R1, #0 ; R1 0同时更新APSR的Z标志Z1MOV R2, R3, LSL #2 ; R2 R3 2将R3的值左移2位后存入R22ADD/SUB加减指令核心作用实现寄存器或立即数的加减运算。语法ADD加法ADD{S}{cond} Rd, Rn, Op2Rd Rn Op2SUB减法SUB{S}{cond} Rd, Rn, Op2Rd Rn - Op2示例; ADD示例ADD R0, R1, #5 ; R0 R1 5ADDS R2, R3, R4 ; R2 R3 R4同时更新APSR; SUB示例SUB R0, R1, #10 ; R0 R1 - 10SUBS R5, R5, #1 ; R5自减1循环计数器并更新标志位3CMP比较指令核心作用隐性计算Rn - Op2不保存结果仅更新APSR标志为后续条件跳转做准备。语法CMP{cond} Rn, Op2示例CMP R0, #100 ; 比较R0与100BEQ LoopEnd ; 若Z1R0100跳转到LoopEndBNE LoopContinue ; 若Z0R0≠100跳转到LoopContinue2. 内存访问指令1LDR读内存指令核心作用将内存中的数据读取到寄存器。语法LDR{type}{cond} Rd, [Rn {, #offset}]{type}可选指定数据类型B无符号字节、H无符号半字、默认字。寻址方式偏移寻址[Rn, #4]地址 Rn 4Rn不变。前索引[Rn, #4]!地址 Rn 4然后更新Rn Rn 4。后索引[Rn], #4地址 Rn然后更新Rn Rn 4。示例LDR R0, [R1] ; 读R1指向的4字节数据到R0LDRB R2, [R1, #1] ; 读R11地址的1字节到R2LDRH R3, [R1], #2 ; 读R1指向的2字节到R3然后R1 R1 22STR写内存指令核心作用将寄存器中的数据写入内存。语法与LDR一致Rd为源寄存器。示例STR R0, [R1] ; 将R0的4字节数据写入R1指向的地址STRH R2, [R1, #4]! ; 将R2的2字节数据写入R14然后R1 R1 43PUSH/POP栈操作指令核心作用批量保存/恢复寄存器到栈是函数调用时保护上下文的标准且推荐的方式。它们是STMFD SP!和LDMFD SP!的别名专用于栈操作更简洁直观。语法入栈保存寄存器PUSH {reglist}出栈恢复寄存器POP {reglist}示例; 函数入口保存R4-R6需保护的寄存器和LR返回地址PUSH {R4-R6, LR} ; 入栈SP相应递减; 函数体 ... 可安全使用R4-R6; 函数出口恢复寄存器并返回POP {R4-R6, PC} ; 出栈恢复R4-R6并将LR的值直接弹出到PC实现返回3. 跳转与函数调用指令程序流控制1B无条件/条件跳转核心作用直接修改PC值跳转到指定标号适用于循环、分支判断。语法B{cond} Label示例B MainLoop ; 无条件跳转到MainLoopCMP R0, #0BNE ErrorHandler ; 若R0≠0跳转到ErrorHandler2BL函数调用指令核心作用跳转前自动将返回地址下一条指令地址存入LR用于函数调用。语法BL{cond} Label示例BL Delay ; 调用Delay函数LR 返回地址MOV R1, #1 ; Delay返回后从此处继续执行Delay:MOV R0, #100000DelayLoop:SUBS R0, R0, #1BNE DelayLoopBX LR ; 使用 BX LR 返回调用处3伪指令LDR val加载任意32位数值到寄存器。LDR R0, 0x12345678 ; 加载非立即数LDR R1, 0x10 ; 编译器可能优化为 MOV R1, #0x10ADR获取标号的相对地址短距离。ADR R0, DataBuf ; 将DataBuf的地址加载到R0DataBuf DCD 0x00, 0x01, 0x02三、完整示例程序以下示例覆盖栈操作、函数调用、内存读写、数据校验四大核心场景并使用推荐的PUSH/POP指令。; 程序说明Cortex-M3/M4汇编实战示例; 核心功能1.栈保存寄存器 2.调用延时函数 3.读写RAM数据 4.校验数据一致性 5.循环执行AREA ARM_Demo, CODE, READONLYENTRYTHUMB ; 明确指定使用Thumb指令集ALIGN 4; --------------------------; 主函数程序核心逻辑入口; --------------------------Main; 1.栈操作在函数入口保存可能被使用的寄存器及返回地址遵守调用规范PUSH {R0-R2, LR} ; 使用PUSH保存寄存器; 2.内存读写向RAM地址0x20000000写入数据再读取校验MOV R0, #0x20000000 ; R0 RAM基地址LDR R1, 0x12345678 ; R1 待写入数据STR R1, [R0] ; 写操作将数据写入内存LDR R2, [R0] ; 读操作从内存读取数据; 3.数据校验比较写入值R1与读取值R2CMP R1, R2BEQ Data_OK ; 若数据一致跳转MOV R3, #0x00 ; 数据不一致R3 0x00错误标志B Call_DelayData_OKMOV R3, #0xFF ; 数据一致R3 0xFF成功标志; 4.调用延时函数Call_DelayBL Delay_Func ; 调用延时函数; 5.恢复寄存器并返回从栈中恢复R0-R2并通过将LR弹出至PC来返回到调用者实现循环POP {R0-R2, PC} ; 使用POP恢复寄存器并返回; --------------------------; 延时函数简单递减延时; --------------------------Delay_FuncPUSH {R0, LR} ; 延时函数也保护它用到的寄存器和LRLDR R0, 500000Delay_LoopSUBS R0, R0, #1BNE Delay_LoopPOP {R0, PC} ; 恢复R0并通过弹出LR到PC来返回ALIGN 4END执行效果入栈后SP相应递减。写内存后查看0x20000000地址值为0x12345678。校验后APSR的Z标志为1R3被设为0xFF。全速运行程序在Main和Delay_Func间循环R3始终保持0xFF。四、总结Cortex-M3/M4汇编的核心逻辑可提炼为三句话操作对象是寄存器核心寄存器仅需掌握R0-R7数据、SP/LR/PC控制和APSR条件标志。内存访问靠Load/Store遵循RISC原则仅LDR/STR指令与内存交互。函数上下文保护使用推荐的PUSH/POP指令。程序流靠PC控制跳转用B函数调用用BL依赖LR返回推荐用BX LR或POP {PC}。