<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Arm64程序調用通用寄存器的使用方法

麥辣雞腿堡 ? 來源:人人極客社區 ? 作者:業余程序員plus ? 2023-07-28 11:28 ? 次閱讀

下面是Arm64程序調用標準規定的通用寄存器的使用方法。

參數寄存器(X0-X7) 函數參數數量小于等于8個時,使用X0-X7傳遞,大于8個時,多余的使用棧傳遞,函數返回時返回值保存在X0中。

調用者保存的臨時寄存器(X9-X15)調用者若使用到了X9-X15寄存器,在調用子函數之前,需要將X9-X15寄存器保存到自己的棧中,子函數使用這些寄存器的時候不需要保存和恢復。

被調用者保存的寄存器(X19-X29) 被調用者若使用到這些寄存器,需要將其保存到自己的棧中,返回時從棧中恢復。

特殊用途的寄存器

X8是間接結果寄存器。用于傳遞間接結果的地址位置,例如,函數返回一個大結構。

X16-X17過程內調用暫存寄存器。。

X18平臺寄存器。

X29是棧幀(FP)寄存器。保存了調用函數的棧幀地址。

X30保存了返回地址(LR)。函數返回后跳轉到該地址處運行。

圖片

實例下圖是內核Oops時打印出的信息。第一張圖片是寄存器信息,pc寄存器和sp寄存器對?;厮萦兄匾饔?。第二張圖是內核線程irq/231-dwc3棧數據的二進制轉儲,?;厮菥褪窃谶@些二進制數據中找到棧幀,從而找到調用的函數地址。

圖片圖片

下圖是內核?;厮莸慕Y果,發生異常函數的地址保存在異常棧中,不在內核線程irq/231-dwc3棧中。

圖片

發生異常的函數可以根據pc寄存器得到,該函數是?;厮莸牡谝粋€函數。sp寄存器指向了第一個棧幀中的FP1寄存器,即0xffffffc0ee823b80地址,FP1向高地址偏移8字節得到LR1寄存器,即0xffffff80087369e4地址,該地址位于dwc3_ep0_stall_and_restart函數內,該函數是?;厮莸牡诙€函數。FP1指向了第二個棧幀的FP2,根據棧幀找到LR2,依次類推。所有的棧幀最終如下圖所示,總共找到7個棧幀,因此irq/231-dwc3內核線程發生異常時總共有8個函數調用,和內核輸出的函數調用關系一致。需要注意的是,代碼里調用了該函數,但在?;厮葜袥]有找到符號,肯定是編譯器優化,將該函數內聯了,是否內聯可以通過反匯編確認。

圖片

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11011

    瀏覽量

    206919
  • 程序
    +關注

    關注

    114

    文章

    3630

    瀏覽量

    79660
收藏 人收藏

    評論

    相關推薦

    ARM寄存器的總結

    ARM處理共有37個寄存器: 1) 31個通用寄存器,包括程序計數
    發表于 07-19 21:20

    ARM狀態下的通用寄存器有哪些

    ARM狀態下的通用寄存器有哪些?ARM狀態下的程序計數有哪些呢?
    發表于 10-21 06:47

    介紹一種利用Arm64架構的System counter來實現提供TSC的方法

    了不小的挑戰。為此,本文分享Arm64架構下如何獲取TSC的方法,以方便大家移植使用。首先,System counter是Arm64下獨立于CPU core的計數,在系統上電時,會給
    發表于 06-02 17:12

    淺析openat系統調用arm64下的實現及使用原理

    open_test --static//反匯編objdump -D open_test > open_arm_asmopen_arm_asm可以看到將寄存器x8設置為系統調用號0x38
    發表于 06-02 17:48

    arm64和x86服務上運行的耗時來發現Docker在arm64架構下的性能問題

    ;上。Docker network子命令通過"exec"來調用外部的“iptables”程序來為容器配置網絡數據包處理規則。在調用這個接口的時候,arm64機器總是比x86機器花費
    發表于 07-12 15:48

    ARM寄存器詳解

    ARM有37個寄存器,其中31個通用寄存器,6個狀態寄存器。   這里尤其要注意區別的是ARM
    發表于 07-10 10:04 ?2692次閱讀

    arm程序狀態寄存器訪問指令

    arm程序狀態寄存器訪問指令
    發表于 01-04 13:11 ?0次下載

    IA64 應用程序寄存器

    IA64 應用程序寄存器
    發表于 01-04 13:11 ?0次下載

    淺談ARM寄存器組織

    是32位的,但目前只使用了其中的12位。除了這6個狀態寄存器外,其余的31個寄存器又稱為通用寄存器。 ARM處理器共有7種不同的處理器模式,
    發表于 10-18 13:26 ?1次下載
    淺談<b class='flag-5'>ARM</b><b class='flag-5'>寄存器</b>組織

    寄存器操作方法_對寄存器操作的通用方法總結

    本文主要詳解寄存器操作方法以及對寄存器操作的通用方法總結,具體的跟隨小編來了解一下。
    的頭像 發表于 05-22 15:53 ?2.1w次閱讀

    ARM64ARM32 的Linux程序區別在哪里

    arm64ARM64。我在示例中使用了AArch64寄存器,但我所描述的許多問題也發生在ARMv8-A 32位執行狀態。
    的頭像 發表于 08-09 09:51 ?2.6w次閱讀
    <b class='flag-5'>ARM64</b>與<b class='flag-5'>ARM</b>32 的Linux<b class='flag-5'>程序</b>區別在哪里

    零基礎學ARM程序狀態寄存器訪問指令解析

    一、程序狀態寄存器訪問指令ARM微處理器支持程序狀態寄存器訪問指令,用于在程序狀態
    的頭像 發表于 12-24 13:36 ?2520次閱讀

    AArch64寄存器介紹

    作為 RISC 架構,AArch64 提供了大量的通用寄存器。除通用寄存器之外,本節還會介紹特殊寄存器
    的頭像 發表于 08-24 09:57 ?5023次閱讀

    ARM通用寄存器及狀態寄存器詳解

    筆者來聊聊ARM通用寄存器以及狀態寄存器的認識與理解。
    的頭像 發表于 01-06 14:58 ?5164次閱讀

    arm三個寄存器在gdb調試時的作用

    ARM寄存器(r0、r1和r2)的作用非常重要。 1. R0寄存器: R0寄存器ARM處理器中的一個
    的頭像 發表于 01-31 10:44 ?300次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>