对汇编的初理解 - 详解

此处是一个简单的函数,里面将调用了一个函数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}

  • r0r1(通用寄存器,可能存着重要数据)和 lr(链接寄存器,存着返回地址)里的值,复制一份压到栈(RAM)里
  • 目的:防止后续操作覆盖这些寄存器的值(比如后面要给 r0r1 装新数据),先备份到栈里留底。

步骤 2:预留临时空间(SUB sp, sp, #4

  • 调整栈指针 sp(让它向下移动 4 字节),在栈上腾出 4 字节的空白区域
  • 目的:给后续的计算结果准备一个 “临时存放点”。

步骤 3:加载数据到寄存器(LDRD r0, r1, [sp, #4]

  • 从 “栈指针 sp 偏移 4 字节” 的位置(也就是步骤 1 中 r0r1 备份数据所在的地址),读取 8 字节数据(64 位):
    • 低 4 字节放入 r0,高 4 字节放入 r1
  • 目的:把之前备份到栈里的数据 “取回来”,放到寄存器中准备计算。

步骤 4:执行计算(ADD r0, r0, r1

  • r0r1 里的值做加法,结果存回 r0
  • 其他运算)。就是目的:完毕核心的数据处理(这里是加法,实际场景可能

步骤 5:保存计算结果(STR r0, [sp, #0]

  • r0 里的计算结果(加法结果),写入到步骤 2 预留的 4 字节空白区域(栈上 sp 偏移 0 的位置)。
  • 目的:临时存储计算结果,方便后续使用(比如返回给调用者)。

步骤 6:恢复现场并返回(POP {r1-r3, pc}

  • 从栈里读取之前备份的数据,依次恢复到 r1r2r3 寄存器(还原它们最初的值);
  • 最后从栈里读取 lr(返回地址),存入 pc(程序计数器),让 CPU 跳回原来的执行位置。
  • 目的:清理现场(回收栈空间),并正确返回调用处,不影响后续程序运行。

整体总结:

这是一段典型的 **“函数内数据处理流程”**,核心逻辑是:
先 “备份主要内容”→ 准备临时空间 → 取数据计算 → 存结果 → 最后 “恢复原始数据并返回”。
整个过程用栈(RAM)作为 “临时仓库”,用寄存器(CPU 内)作为 “飞快运算工具”,既保证了计算的高效性,又避免了材料被意外覆盖,最终安全返回

posted @ 2025-09-17 10:28  wzzkaifa  阅读(9)  评论(0)    收藏  举报