此處是一個簡單的函數,里面將調用了一個函數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 內)作為 “快速運算工具”,既保證了計算的高效性,又避免了數據被意外覆蓋,最終安全返回