硬件開發2-匯編2(ARMv7-A)- 裸機開發

一、指令

1、b(Branch)

原型:B<c> <label>

作用:實現無條件跳轉,常用于不返回的跳轉場景

特點:僅跳轉到目標地址,不保存返回地址

示例:b reset ????????;跳轉到reset標號處執行

2、bl(Branch with Link)

原型:?BL<label>

作用:硬件自動將返回地址(PC+4?或?PC+2)存入 LR (帶鏈接的跳轉,用于子程序調用,跳轉前將返回地址(PC+4)保存到鏈接寄存器?LR(R14))

特點:子程序執行完畢后可通過?mov pc, lr?或?bx lr?返回調用點

示例:

注意事項:一個嵌套可用,大于兩個嵌套以上,需要搭配棧來使用(用法如下)

3、bx lr

原型:BX{<cond>} <Rm>

作用:將程序計數器(PC)設置為鏈接寄存器(LR/R14)中保存的地址,實現函數返回

特點:BX LR?將 LR 的值加載到 PC,恢復原程序流

示例:

4、stmdb 壓棧

原型:STMDB<c><Rn>{!},<registers>

作用:保護現場/恢復現場(壓棧/彈棧)

? ? ? ? ?壓棧操作,ARM通常默認采用滿遞減棧,棧指針先減后存或先讀后增

參數:

  • <Rn>?是棧頂指針寄存器,通常為棧指針?SP(R13),指向當前棧頂位置
  • !?后綴的作用:
    • 不加!:僅按指令操作存儲數據,不更新基址寄存器(SP?的值不變)
    • 加!?:存儲完成后,自動更新基址寄存器(SP = SP - 4*NN?為寄存器數量)
      • 壓棧保存寄存器,同時更新棧指針
  • <registers>?的存儲規則(入棧出棧的寄存器列表):

    • 存儲順序:寄存器按編號從大到小依次存儲(如?R3R2R1R0

    • 內存地址:基址先遞減,再存儲

使用要點: 棧頂指針寄存器初始化
mov sp, #0x40001000 ?: 報錯非立即數 ? ?
ldr sp,?? ?=0x40001000
魔術棒 -> Target->IRAM1:#0x40000000? ? ?size:0x1000

示例:

5、ldmfd 彈棧

原型:LDMFD{<cond>} SP!, {<registers>}

作用:恢復現場

????????從棧中按低地址到高地址依次加載恢復數據到寄存器,并遞增棧指針(彈棧方向與壓棧相反)

用法:類似stmdb

示例:同上

6、ldr 普通加載數據

原型:LDR<c> <Rt>, <label>

作用:加載非立即數寄存器中(初始化寄存器 、加載常量數據)

特點:

  • 用于加載?32 位立即數(ARM 指令不能直接加載 32 位立即數,ldr =?是一種偽指令)

示例:

????????ldr r0, =0x40001000 ; 將地址 0x40001000 存入 r0

7、ldr 類(*p)操作

原型:

作用:從?內存地址?加載數據到寄存器(類指針操作)

特點:對應的是C語言中的?*p(指針解引用)

示例:

? ?---? ? ? ldr r0, [r1]? ? ? ? ? ? ? ? ? ? ? ? ?; 將 r1 指向的內存數據加載到 r0

? ?---? ? ? ldr r0, [r1, #4]? ? ? ? ? ? ? ? ?? ; r0 = *(r1 + 4)

? ? ? ? ? ? ldr r0, [r1, r2]? ? ? ? ? ? ? ? ? ? ; r0 = *(r1 + r2)

? ? ? ? ? ? ldr r0, [r1, r2, LSL #2]???????; r0 = *(r1 + (r2 << 2))

? ? ? ? ? ? ldr r0, [r1], #4? ? ? ? ? ? ? ? ? ? ; r0 = *r1; r1 += 4 (后索引)

? ? ? ? ? ? ldr r0, [r1, #4]!? ? ? ? ? ? ? ? ? ?; r0 = *(r1 + 4); r1 += 4 (前索引并更新基址)

二、匯編調用C語言

1、流程

(1) 創建main.c

(2) 在main中聲明將要在filename.s文件中將要使用的文件 extern void c_add(void);

(3) 導入 import +文件名; (keil當中要求)導出文件文件用export +文件名

(4) 保護現場 bl函數調用 恢復現場

(5) 解決編譯報錯:

????????asm.axf: Error: L6238E: start.o(reset) contains invalid call from '~PRES8 (The user did not require code to preserve 8-byte aligment of 8-byte data objects)' function to 'REQ8 (Code was permitted to depend on the 8-byte aligment of 8-byte data items)' function c_add. asm.axf: Finished: 0 information, 0 warning and 1 error messages.

解決辦法:在.s文件開頭 寫上

???????????????????棧對齊偽指令:preserve8 用于確保函數調用時棧指針保持 8 字節對齊

(6) 創建工程自動添加了啟動代碼報錯

(7)重設軟件配置? ---(魔術棒)

  • 魔術棒 -> Debug -> Use Simulator->Run to main(取消)
  • 魔術棒 -> Linker -> Use Memory Layout from Taget Dialog(勾選)
  • 魔術棒 -> Taget -> ROM1 -> Start: 0x0 Size:0x2000

(8)函數傳參:基本參數只能傳遞四個超出部分需采用壓棧傳遞

例:

main.c

start.s

2、?ARM的7種異常類型

異常類型觸發條件進入模式優先級
復位(Reset)上電或硬件復位管理模式(SVC)1(最高)
數據中止(Data Abort)非法內存訪問(如缺頁)中止模式(ABT)2
快速中斷(FIQ)高優先級外設中斷(如DMA)FIQ模式3
普通中斷(IRQ)常規外設中斷(如定時器)IRQ模式4
預取中止(Prefetch Abort)指令預取失敗中止模式(ABT)5
軟件中斷(SWI/SVC)SVC?指令觸發(系統調用)管理模式(SVC)6
未定義指令執行未知指令未定義模式(UND)7(最低)

3、ARM匯編調用C函數

(1)前4個參數:依次通過寄存器 R0R1R2R3 傳遞。

(2)超過4個參數:剩余參數按從右向左的順序壓棧(棧內存傳遞)。

(3)返回值:

????????32位整數:通過 R0 返回。

????????64位整數:通過 R0(低32位)和 R1(高32位)返回。

????????浮點數:通過 S0(單精度)或 D0(雙精度)返回

三、ARM 裸機開發環境搭建

? ? ? ? ;標準偽指令

????????preserve8? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ;

????????area reset, code, readonly

????????code32

????????entry

????????

? ? ? ? ;<1>

????????ldr pc, =start_hander ????????????????; 復位異常(Reset)

????????ldr pc, =undefine_hander? ? ? ? ? ?; 未定義指令異常

????????ldr pc, =software_hander? ? ? ? ? ?; 軟件中斷(SWI/SVC)

????????ldr pc, =prefetch_hander? ? ? ? ? ? ; 預取中止異常

????????ldr pc, =data_hander? ? ? ? ? ? ? ? ? ; 數據中止異常

????????nop? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ; 保留位(ARMv5+)

????????ldr pc, =irq_hander? ? ? ? ? ? ? ? ? ? ? ; 普通中斷(IRQ)

????????ldr pc, =fiq_hander? ? ? ? ? ? ? ? ? ? ? ; 快速中斷(FIQ)

undefine_hander

????????b undefine_hander
import software_vector

software_hander

????????stmfd sp!, {r0-r12, lr}? ? ? ? ? ? ? ? ? ? ?; 保存寄存器現場

????????bl software_vector???????????????????????? ; 調用C函數處理SWI

????????ldmfd sp!, {r0-r12, pc}^????????????????? ; 恢復現場并返回(^表示恢復CPSR)

;注意:此處使用^修飾符,表示同時將SPSR恢復到CPSR(用于模式切換)

;默認異常處理均為死循環,實際項目中需替換為具體邏輯

prefetch_hander

????????b prefetch_hander ????????????????????????; 預取中止死循環

data_hander

????????b data_hander ????????????????????????????? ; 數據中止死循環

irq_hander

????????b irq_hander ????????????????????????????????; IRQ死循環

fiq_hander

????????b fiq_hander???????????????????????????????? ; FIQ死循環

? ?

;SWI觸發函數

? ? ? ?export ?asm_swi_fun
asm_swi_fun
swi #7? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ;觸發軟件中斷(編號7)

? ? ? ?bx lr? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ;返回調用者

start_hander ;(主開始位置)

????????ldr sp, =0x40001000???????????????? ; 設置棧指針初始位置<2>

????????import main???????????????????????????????; 聲明外部C入口函數

;切換處理器模式到用戶模式(CPSR.M[4:0] = 0x10),并啟用中斷(清除I-bit)<3>

????????mrs r0, cpsr ??????????????????????????????; 讀取CPSR

????????bic r0, r0, #(0x1F << 0)? ? ? ? ? ?? ; 清除模式位

????????bic r0, r0, #(1 << 7)? ? ? ? ? ? ? ? ?? ; 清除中斷禁止位(I-bit)

????????orr r0, r0, #(0x10 << 0)? ? ? ? ? ? ? ; 設置為用戶模式(0x10)

????????msr cpsr_c, r0? ? ? ? ? ? ? ? ? ? ? ? ? ? ; 寫回CPSR

;重新設置用戶模式

????????ldr sp, =0x40001000 ????????????? ? ? ; 重新設置棧指針

????????sub sp, sp, #1024???????? ? ? ? ? ? ? ? ; 預留棧空間(1KB)

????????b main ???????????????????????????????????????; 跳轉到C的main函數


end

知識點:

1、中斷向量表

位置:必須位于0x00000000地址(或可通過VBAR重定位)

組成:8個32位條目,按固定順序對應不同異常類型

跳轉方式

?????ldr pc, =handler:支持全地址范圍跳轉

? ? ??b handler:僅支持±32MB范圍跳轉

2、棧設置:
在進入用戶模式前,先設置一次棧(ldr sp, =0x40001000),這是為了在切換模式前確保棧有效(因為不同模式有各自的SP寄存器)
切換到用戶模式后,再次設置棧指針并預留空間(sub sp, sp, #1024),避免用戶程序棧溢出破壞其他數據

3、ARM處理器中 CPSR(當前程序狀態寄存器)的模式位

模式值(十六進制)模式名稱英文全稱用途說明
0x10用戶模式User Mode運行普通應用程序的非特權模式,無法直接訪問硬件資源或執行特權指令。
0x11FIQ模式Fast Interrupt Mode處理高速中斷(FIQ),有專用的寄存器(R8-R14_fiq),用于低延遲中斷響應。
0x12IRQ模式Interrupt Mode處理普通中斷(IRQ),比 FIQ 優先級低,用于一般外設中斷。
0x13SVC模式Supervisor Mode操作系統內核模式(如 Linux 的 Kernel Mode),用于處理軟件中斷(SWI/SVC)。
0x17Abort模式Abort Mode當發生內存訪問異常(如缺頁或權限錯誤)時進入此模式。
0x1BUndef模式Undefined Mode當執行未定義指令時觸發,用于模擬浮點指令或擴展指令集。

特權級別:
特權模式(0x11-0x1B):可以訪問所有系統資源和 CPSR 寄存器
非特權模式(0x10):限制訪問硬件和關鍵寄存器

典型應用場景:
用戶程序運行在 User Mode(0x10)
操作系統通過 SVC 指令觸發 SVC Mode(0x13)執行系統調用
硬件中斷自動切換至 IRQ/FIQ Mode(0x12/0x11)

模式切換權限:

????????只有特權模式(如 SVC)才能修改 CPSR 的模式位,用戶模式嘗試修改會觸發異常。

模式自動切換:

????????中斷/異常發生時,處理器會自動切換到對應模式(如 IRQ → 0x12)。

寄存器組差異:

????????某些模式(如 FIQ)有專用寄存器(R8-R14_fiq),可加速中斷處理

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98924.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98924.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98924.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

清源 SCA 社區版更新(V4.2.0)|漏洞前置感知、精準修復、合規清晰,筑牢軟件供應鏈安全防線!

隨著數字化進程加速&#xff0c;軟件供應鏈安全威脅日益復雜&#xff0c;公開漏洞響應滯后、0day 攻擊防不勝防、組件升級編譯失敗、安全與合規風險混雜......這些痛點讓企業安全團隊、運維人員及研發團隊疲于應對。自 2025 年 7 月 1 日安勢清源 SCA 社區版首次正式發布以及在…

氚燃料增殖里程碑:MIT新型BABY包層技術實驗驗證

● 導語 5月20日&#xff0c;麻省理工學院&#xff08;MIT&#xff09;發文稱&#xff0c;BABY實驗首次獲取了氚在裝置內增殖的實測數據&#xff0c;驗證了核心模型&#xff0c;并為未來核聚變電廠的燃料自循環奠定了重要基礎。 原文&#x1f447;&#x1f3fb; https://m…

python+springboot+uniapp微信小程序題庫系統 在線答題 題目分類 錯題本管理 學習記錄查詢系統

目錄技術棧介紹具體實現截圖系統設計研究方法&#xff1a;設計步驟設計流程核心代碼部分展示研究方法詳細視頻演示試驗方案論文大綱源碼獲取/詳細視頻演示技術棧介紹 Django-SpringBoot-php-Node.js-flask 本課題的研究方法和研究步驟基本合理&#xff0c;難度適中&#xff0…

Office轉PDF轉換器v1.0.py

軟件介紹 這是批量將word、Excel、PPT轉換為PDF格式的軟件&#xff0c;不過PPT轉換為PDF需要電腦安裝了office&#xff0c;目前這個我還沒有解決沒有office也可以安裝的方法。 軟件使用 軟件使用是比較簡單的&#xff0c;導入文件/文件夾&#xff0c;在自定義輸出路徑 點擊這…

62_基于深度學習的海洋垃圾檢測識別系統(yolo11、yolov8、yolov5+UI界面+Python項目源碼+模型+標注好的數據集)

目錄 項目介紹&#x1f3af; 功能展示&#x1f31f; 一、環境安裝&#x1f386; 環境配置說明&#x1f4d8; 安裝指南說明&#x1f3a5; 環境安裝教學視頻 &#x1f31f; 二、數據集介紹&#x1f31f; 三、系統環境&#xff08;框架/依賴庫&#xff09;說明&#x1f9f1; 系統環…

深入淺出 全面剖析消息隊列(Kafka,RabbitMQ,RocketMQ 等)

消息隊列 一、概念 消息隊列&#xff08;MQ&#xff09;&#xff1a;一種異步通信機制&#xff0c;通過“消息”的形式讓不同系統或模塊解耦核心思想&#xff1a;發送方&#xff08;生產者Producer&#xff09;只負責發送消息&#xff0c;接收方&#xff08;消費者Consumer&…

Flux Images Generation API 對接說明

本文將介紹一種 Flux Images Generation API 對接說明&#xff0c;它是可以通過輸入自定義參數來生成Flux官方的圖片。 接下來介紹下 Flux Images Generation API 的對接說明。 申請流程 要使用 API&#xff0c;需要先到 Flux Images Generation API 對應頁面申請對應的服務…

CSS布局 - 網格布局 -- 筆記3

目錄網格布局基礎網格網格剖析CSS 提供了一些控制網頁布局的幾個重要工具&#xff0c;這里介紹網格布局。 網格布局 CSS 網格可以定義由行和列組成的二維布局&#xff0c;然后將元素放置到網格中。有些元素可能只占據網格的一個單元&#xff0c;另一些元素則可能占據多行或多…

合約開發完后部署測試

一 編譯npx hardhat compile二 測試npx hardhat test三部署注意部署的時候2.0和3版本有所區別&#xff0c;3.0如下# 部署到本地網絡&#xff08;如已運行 npx hardhat node&#xff09; npx hardhat ignition deploy ./ignition/modules/MyModule.ts --network localhost# 部署…

產品無法正確解析復雜表格和流程圖,有什么替代方案或優化方法?

在真實辦公場景中&#xff0c;文檔內的元素往往不具備標準化和格式化特征&#xff0c;像雙欄表格、無線圖表等復雜元素十分常見。而傳統 OCR 工具在面對這類復雜文檔時&#xff0c;存在明顯的能力短板&#xff1a;它無法準確判斷復雜表格的結構邏輯以及內容的順序邏輯&#xff…

《Html模板》HTML數學題目生成器 - 讓數學練習更簡單(附源碼)

目錄專欄導讀&#x1f9ee; HTML數學題目生成器 - 讓數學練習更簡單項目簡介? 核心功能&#x1f3af; 靈活的運算類型選擇&#x1f4ca; 智能題目生成算法?? 個性化參數設置&#x1f5a8;? 專業打印優化&#x1f3a8; 用戶體驗設計現代化界面交互體驗&#x1f6e0;? 技術實…

Go語言設計模式(七)組合模式

組合模式是指將一組相似對象當做一個單一對象的設計模式.1.組成角色:1.1組件:組合中的對象聲明接口,主要用于訪問和管理其子組件.1.2葉子節點:定義組合中原始對象行為的類.葉子節點表示組合中的葉對象.1.3組合:又稱為容器,存儲子組件并在組件接口中實現與子組件有關的類.1.4客戶…

AI 3D 生成工具知識庫:當前產品格局與測評總結

聚焦于 AI 3D 生成領域的領軍產品、功能比較及實測性能。內容分為產品格局、通用功能、測評系統與基準測試&#xff0c;以及單視圖生成實測結果。所有信息基于腳本分析&#xff0c;并交叉驗證了產品名稱、團隊背景&#xff08;如 VAST AI 的 TripoSR/Meshy 的 Meshy-1、影眸科技…

淘客app的容器化部署與編排:基于Kubernetes的微服務架構實踐

淘客app的容器化部署與編排&#xff1a;基于Kubernetes的微服務架構實踐 大家好&#xff0c;我是阿可&#xff0c;微賺淘客系統及省賺客APP創始人&#xff0c;是個冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在淘客app的業務迭代中&#xff0c;傳統物理機部署面…

當GitHub不再純粹:Python自動化測試的未來是AI還是危機?

全球最大的開源代碼平臺&#xff0c;徹底被卷進了AI洪流&#xff01;作為全球最大的“程序員交友平臺”&#xff08;手動狗頭&#xff09;&#xff0c;GitHub 可以說是每一個開發者又愛又恨的“家”。沒錯&#xff0c;就是那個全球最大、沒有之一的開源代碼托管平臺&#xff01…

Spring Boot + MySQL 創建超級管理員

Spring Boot系統創建超管實現方式1. 數據庫腳本初始化&#xff08;最直接的方式&#xff09;2. Spring Boot 啟動時自動創建&#xff08;代碼級初始化&#xff09;2.1 實體類定義2.2 Repository 接口2.3 初始化組件2.4 配置密碼加密器3. 通過接口手動創建&#xff08;最安全的方…

楊輝三角**

一、題目給定一個非負整數 numRows&#xff0c;生成「楊輝三角」的前 numRows 行。在「楊輝三角」中&#xff0c;每個數是它左上方和右上方的數的和。示例 1:輸入: numRows 5 輸出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2:輸入: numRows 1 輸出: [[1]]提示:1 <…

Vue3 的單文件組件(.vue 文件)中,在 <script>、<template>、<style> 標簽外輸入內容不會導致程序報錯

在 <script>、<template>、<style> 標簽外首行誤輸入內容 vtsvts <script setup lang"ts" name"BaseDocxPreviewDialog"> /*** docx文件預覽模態框組件*/ defineOptions({ name: "BaseDocxPreviewDialog" }); import { …

LVS負載均衡群集和LVS+Keepalived群集

1、群集 1.1群集的含義 由多臺主機構成&#xff0c;但對外只表現為一個整體&#xff0c;只提供一個訪問入口&#xff08;域名與IP地址&#xff09;&#xff0c;相當于一臺大型計算機。 1.2 企業群集分類 負載均衡群集&#xff1a;提高應用系統的響應能力、盡可能處理更多的…

LeetCode力扣-hot100系列(5)

這一篇主要講一講回溯&#xff0c;除了N皇后問題是困難題&#xff0c;不過N皇后知道了咋做也不難。回溯整體上還是好做的&#xff0c;直到套路容易做出來&#xff0c;題目容易理解。回溯[1]全排列問&#xff1a;給定一個不含重復數字的數組 nums &#xff0c;返回其 所有可能的…