此处是一个简单的函数,里面将调用了一个函数add()函数
这里是函数的原型
这里是调用lcd函数产生的汇编语言,翻译过来就是r1=1,r0=cnt(r4=cnt,前文有提及),然后调用add函数,此处BL是指会回到指令的下一行代码。
在add函数里有三个局部变量,会存在栈里面
这是add函数的汇编,左边是地址,会存到flash里面,存储的是机器码,翻译出来就是最右边的汇编码,当运行到这里时,会把地址中的机器码读到cpu里面,执行机器码
这里的r1 r2 r3 lr pc等都是cpu里面的寄存器
这整套汇编指令是一段 **“数据处理 + 现场保护与恢复”** 的完整逻辑,核心是 “安全地完成一次计算并返回”,可以拆成 6 个步骤理解:
步骤 1:备份现场(PUSH {r0, r1, lr}
)
- 把
r0
、r1
(通用寄存器,可能存着重要数据)和lr
(链接寄存器,存着返回地址)里的值,复制一份压到栈(RAM)里。 - 目的:防止后续操作覆盖这些寄存器的值(比如后面要给
r0
、r1
装新数据),先备份到栈里留底。
步骤 2:预留临时空间(SUB sp, sp, #4
)
- 调整栈指针
sp
(让它向下移动 4 字节),在栈上腾出 4 字节的空白区域。 - 目的:给后续的计算结果准备一个 “临时存放点”。
步骤 3:加载数据到寄存器(LDRD r0, r1, [sp, #4]
)
- 从 “栈指针
sp
偏移 4 字节” 的位置(也就是步骤 1 中r0
、r1
备份数据所在的地址),读取 8 字节数据(64 位):- 低 4 字节放入
r0
,高 4 字节放入r1
。
- 低 4 字节放入
- 目的:把之前备份到栈里的数据 “取回来”,放到寄存器中准备计算。
步骤 4:执行计算(ADD r0, r0, r1
)
- 用
r0
和r1
里的值做加法,结果存回r0
。 - 目的:完成核心的数据处理(这里是加法,实际场景可能是其他运算)。
步骤 5:保存计算结果(STR r0, [sp, #0]
)
- 把
r0
里的计算结果(加法结果),写入到步骤 2 预留的 4 字节空白区域(栈上sp
偏移 0 的位置)。 - 目的:临时存储计算结果,方便后续使用(比如返回给调用者)。
步骤 6:恢复现场并返回(POP {r1-r3, pc}
)
- 从栈里读取之前备份的数据,依次恢复到
r1
、r2
、r3
寄存器(还原它们最初的值); - 最后从栈里读取
lr
(返回地址),存入pc
(程序计数器),让 CPU 跳回原来的执行位置。 - 目的:清理现场(回收栈空间),并正确返回调用处,不影响后续程序运行。
整体总结:
这是一段典型的 **“函数内数据处理流程”**,核心逻辑是:
先 “备份重要数据”→ 准备临时空间 → 取数据计算 → 存结果 → 最后 “恢复原始数据并返回”。
整个过程用栈(RAM)作为 “临时仓库”,用寄存器(CPU 内)作为 “快速运算工具”,既保证了计算的高效性,又避免了数据被意外覆盖,最终安全返回