閑聊ARM內核參數傳遞機制

之前一直沒怎么在意這個問題,直到最近搞了個奇奇怪怪的項目,才發現這部分知識得補上來,記錄一下。

ARM有一個標準,叫《Procedure Call Standard for the Arm Architecture》,人話就是ARM架構過程調用標準,它的目標就是為不同編譯器生成的代碼提供了統一的調用規范,使得單獨編譯的C程序和匯編程序能夠相互調用。

文章里詳細說明了寄存器的分類:R0-R3用于參數傳遞(調用者保存寄存器),R4-R11用于保存局部變量(被調用者保存寄存器),解決了函數調用過程中寄存器值可能被意外覆蓋的問題。

同時比較關鍵也是今天主題,就是參數傳遞機制的統一,它規定了函數的前四個參數通過寄存器傳遞,超出部分使用棧傳遞,返回值通過R0返回。這種標準化避免了不同編譯器采用不同傳遞方式導致的兼容性問題。特別提到在64位架構中,寄存器數量增加到31個,可以支持8個參數通過寄存器傳遞。

那我們來看看具體示例,以M4為例。

首先定義函數,分別涉及到傳2個參數,傳5個參數,傳結構體,傳結構體指針,如下:

?然后來看匯編,

(1)AddTest1,僅傳遞2個參數,根據規則當然應該直接用寄存器即可,匯編代碼如下:

代碼首先將參數存放到寄存器R0和R1中, 然后跳到AddTest,該函數的匯編代碼如下:

也符合規范里使用R0作為返回值的要求。

(2)AddTest2,傳遞5個參數,按照規范前4個參數使用寄存器R0-R3,匯編代碼如下:

代碼首先將第5個參數壓到棧里,對應地址0x1ffE4290,然后就其余四個參數放到寄存器R0-R4里,最后跳到函數里執行,具體代碼如下:

首先是把R4壓棧,保護現場,然后使用R4作為中間寄存器來存放棧里的第5個參數,最后分別加R0-R4,最后以R0承接返回值,如下:

(3)我們再來看看直接傳結構體是什么情況,匯編如下:

?這里就需要注意了,首先我們在main里定義了結構體add_type addStruct = {1,2,3},本身就存在棧里,如下:

因此,第一步就是要從棧里把數據取出來,由于該結構體只有三個參數,所以還是用寄存器傳遞的方式,如下:

在函數里就直接使用寄存器進行相加即可,

?那如果是傳遞的結構體超過了4個參數,舉一反三即可。?

(4)如果是傳遞指針?,情況又不太一樣,我們來看匯編。

代碼直接就該結構體對應的棧地址作為參數通過R0傳遞過去,?在該函數內部取棧里取數據,如下:

好了,奇奇怪怪的知識又增加了。了解這個有什么用呢,或許大概MCU里有一套固件API,不想和調用者共用棧,以免泄露信息,知道傳參的邏輯,才能在固件API運行時有正確的參數值。

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

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

相關文章

萬興喵影Filmora AI Video v14.7.03國際高級版,AI視頻剪輯全能工具,一鍵專業級創作?

[軟件名稱]: 萬興喵影Filmora AI Video v14.7.03 [軟件大小]: 199.4 MB [下載通道]: 夸克盤 | 迅雷盤 軟件介紹 🎬《萬興喵影》v14.7.03國際高級版|AI智能剪輯神器,解鎖全功能無水印! ? 核心優勢: ? 1000背景音…

暴力風扇方案介紹

炎炎夏日,當普通風扇只能送來 “溫柔拂面”,暴力風扇卻能吹出 “臺風級” 清涼!想知道這些 “風力狂魔” 是如何煉成的?答案藏在電機、電路和芯片的黃金三角組合里。? 一、電機:暴力風扇的 “心臟起搏器”? 暴力風扇…

pyqt小問題匯總

文章目錄 1、inherit global site-packages2、setGeometry(10,20,30,40)setGeometry(x, y, width, height)1. **x參數**2. **y參數**3. **width參數**4. **height參數** 示例說明與其他方法的對比注意事項示例代碼 1、inherit global site-packages 在pycharm 創建項目時&…

提升JavaScript性能的六大關鍵策略

1、優化代碼結構與算法 避免使用嵌套循環,改用更高效的算法如哈希表或二分查找。減少不必要的計算,緩存重復使用的計算結果。使用時間復雜度更低的算法替代高復雜度操作。優化遞歸調用,避免棧溢出和性能瓶頸。改用迭代或尾遞歸優化。簡化條件…

打造跨平臺應用的全能框架:Dioxus

在如今飛速發展的數字世界中,越來越多的開發者開始尋找能夠滿足跨平臺需求的高效框架。而在這些選擇中,Dioxus這個全棧應用框架脫穎而出。Dioxus是一款為Web、桌面和移動端開發而設計的全棧框架,采用Rust語言,具備跨平臺、一體化的優勢。本文將深入介紹Dioxus的獨特功能,應…

大事件項目記錄5-用戶接口開發-更新用戶頭像

5)更新用戶頭像。 UserController.java: PatchMapping("updateAvatar")public Result updateAvatar(RequestParam String avatarUrl){userService.updateAvatar(avatarUrl);return Result.success();} UserService.java: UserServ…

Spring Cloud 微服務架構模型

下面是一個完整的 springcloud-eureka-demo 示例項目,包含: Eureka Server 注冊中心 Eureka Client 服務提供者(service-provider) Eureka Client 服務消費者(service-consumer) 📁 項目結構…

計算機網絡 網絡層:控制平面

在本章中,包含網絡層的控制平面組件。控制平面作為一種網絡范圍的邏輯,不僅控制沿著從源主機到目的主機的端到端路徑間的路由器如何轉發數據報,而且控制網絡層組件和服務如何配置和管理。5.2節,傳統的計算圖中最低開銷路徑的路由選…

力扣第85題-最大矩形

力扣鏈接:85. 最大矩形 - 力扣(LeetCode) 給定一個僅包含 0 和 1 、大小為 rows x cols 的二維二進制矩陣,找出只包含 1 的最大矩形,并返回其面積。 輸入:matrix [["1","0","1","…

6-創建和查詢

創建&查詢 DDL - 表操作 - 查詢 查詢當前數據庫所有表 查詢庫表之前需要先試用 use 數據庫名 進入數據庫才可以查詢到該數據庫的庫表, 否則將會出現未選擇數據庫的報錯; 如果數據庫中并無數據表, 則會出現 Empty set 的相應結果 SHOW TABLES;切換到 sys 數據庫, 并且查詢庫…

【Java面試】MySQL的聚集索引和非聚集索引的區別?

一、存儲結構的本質差異 物理存儲的哲學沖突 聚集索引的本質是將數據行的物理存儲順序與索引鍵值的邏輯順序強制綁定,這種設計源于計算機科學的局部性原理(Locality Principle)。 為什么選擇B樹? B樹的平衡多路特性(通…

LRU緩存設計與實現詳解

LRU緩存設計與實現詳解 一、LRU緩存核心概念1.1 LRU策略定義1.2 應用場景1.3 核心操作要求 二、數據結構設計:雙向鏈表哈希表2.1 為什么選擇雙向鏈表?2.2 為什么結合哈希表?2.3 節點結構設計(雙向鏈表)2.4 LRU緩存的邏…

RabbitMQ中,basicAck、basicNack和basicReject是三種核心的消息確認機制

channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true); channel.basicReject(message.getMessageProperties().getDeliveryTag(), false); channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); 在RabbitMQ中&#xff0…

UNIAPP入門基礎

一、開發環境準備 1. 安裝 HBuilderX(官方推薦IDE) 下載地址:HBuilderX 官網 版本選擇: App開發版:開箱即用,內置 UniApp 插件 標準版:需手動安裝 UniApp 插件(運行時會提示) 安裝步驟: Windows:雙擊安裝包,勾選“創建桌面快捷方式” macOS:拖拽到 Applications…

前端單點登錄

“前端單點登錄(SSO, Single Sign-On)”是指在多個系統之間共享用戶登錄狀態,使用戶只需登錄一次,就可以在多個子系統中使用同一身份訪問資源,無需重復登錄。 以下是一個典型的前端單點登錄方案的介紹和實現思路&…

DiNA:擴張鄰域注意力 Transformer

摘要 Transformer 正迅速成為跨模態、跨領域和跨任務中應用最廣泛的深度學習架構之一。在計算機視覺領域,除了持續發展的純 transformer 架構,分層 transformer 也因其優越的性能和在現有框架中易于集成而受到廣泛關注。這類模型通常采用局部化的注意力…

對于“隨機種子”的作用的理解

深度學習系統的兩大組成部分 確定性部分(無法通過種子改變): ? 網絡結構:層數、神經元數量、連接方式 ? 學習率:如您所說,這是開發者明確設置的固定值或調度策略 ? 損失函數:MSE、CrossEnt…

C# 委托(調用帶引用參數的委托)

調用帶引用參數的委托 如果委托有引用參數,參數值會根據調用列表中的一個或多個方法的返回值而改變。 在調用委托列表中的下一個方法時,參數的新值(不是初始值)會傳給下一個方法。例如, 如下代碼調用了具有引用參數的…

Cisco FMC events無法加載并且cpu high故障- Cisco bug

FMC故障 日志無法加載,并且CPU high 95% 經確認是bug問題,需要重置1個monetdb的進程 https://bst.cloudapps.cisco.com/bugsearch/bug/CSCwe47671 https://bst.cloudapps.cisco.com/bugsearch/bug/CSCwi64429 2.1 備份FMC配置 2.2 重置進程 大約為2…

HarmonyOS 公共事件機制介紹以及多進程之間的通信實現(9000字詳解)

HarmonyOS 公共事件機制介紹以及多進程之間的通信 CES(Common Event Service,公共事件服務)為應用程序提供訂閱、發布、退訂公共事件的能力 1. 公共事件的介紹 1.1.1公共事件的分類:公共事件從系統的角度可以分為系統公共事件和自定義公共事件 系統公共事件&#x…