主頁 > 軟體工程 > 了解帶有pc偏移量的Cortex-M組裝LDR

了解帶有pc偏移量的Cortex-M組裝LDR

2021-12-28 20:09:34 軟體工程

我在看這段C代碼的反匯編代碼:

#define GPIO_PORTF_DATA_R       (*((volatile unsigned long *)0x400253FC))
int main(void){    
    // Initialization code
    while(1) {
        SW1 = GPIO_PORTF_DATA_R&0x10;  // Read PF4 into SW1
        // Other code
        SW2 = GPIO_PORTF_DATA_R&0x01;
    }
}

SW1=的程式集是(抱歉不能復制代碼):

https://imgur.com/dnPHZrd

以下是我的問題:

  • 在第一行,PC = 0x00000A56,PC 92 = 0x00000AB2,它不等于 0x00000AB4,顯示的數字。為什么?

我對 SO 進行了一些研究,發現 PC 實際上指向要執行的 Next Next 指令。

pc 用于讀取時,ARM 模式下有 8 位元組的偏移量,Thumb 模式下有 4 位元組的偏移量。

然而 0x00000AB4 - 0x00000A56 = 0x5E = 94,它既不匹配 92 8 也不匹配 92 4。我哪里錯了?

參考

ldr [pc, #value] 的奇怪行為

為什么ARM PC暫存器指向下一條要執行的指令之后的指令?

LDR Rd,-Label vs LDR Rd,[PC Offset]

uj5u.com熱心網友回復:

來自 ARM 檔案

Operation 
  address = (PC[31:2] << 2)   (immed_8 * 4) 
  Rd = Memory[address, 4]

pc 是 0xA56 4 因為前面有兩條指令,這是拇指所以 4 個位元組。

(0xA5A>>2)<<2   (0x17*4)
or
(0x00000A5A&0xFFFFFFFC)   (0x17<<2)
0xA58 92=0xA64

這是一個 LDR,因此理想情況下它是基于字的地址。由于拇指指令可以位于非字對齊的地址上,因此您當然首先要添加兩條指令(thumb2 使這變得復雜,但為拇指添加了四個)。然后將偏移量的低兩位 (LDR) 歸零,因此需要將其轉換為位元組,乘以四。如果您考慮編碼的每個部分,這會使編碼更有意義。在 arm 模式下,PC 已經是字對齊的,因此不需要 step(在 arm 模式下,您有更多的位用于立即數,因此它是基于位元組而不是基于字的),這使得 arm 和拇指之間的偏移編碼可能會造成混淆。

各種檔案將以不同的方式顯示數學,但它仍然是相同的數學。PC 是唯一令人困惑的部分,尤其是拇指。對于 ARM,您在前面添加 8,兩個,對于拇指,它基本上是 4,因為執行無法判斷是否有拇指 2 到來,如果他們嘗試這樣做,它會破壞很多事情。因此,請為前面的兩個添加 4,以供拇指使用。由于thumb 被壓縮,因此它們不使用位元組偏移量,而是使用4 倍范圍的字偏移量。同樣,這個和/或其他指令只能向前看,不能向后看,所以無符號偏移量。這就是為什么在拇指中組裝東西時會出現對齊錯誤的原因,而手臂中的東西只是未對齊(并且根據架構和設定,你會得到什么)。Thumb 不能為這樣的指令編碼任何地址。

為了理解指令編碼,特別是基于 pc 的尋址,最好回到早期的 ARM ARM(在 armv5 之前,但如果不是,則獲得 armv5 一個)以及 armv6-m 和 armv7-m 和完整大小的 armv7-ar。并查看每個的偽代碼。較舊的通常具有最好的偽代碼,但有時它們會忽略地址低位的掩碼。沒有檔案是完美的,它們和其他所有檔案一樣都有錯誤。當然,與您使用的內核相關的架構是芯片供應商使用的 IP 的官方檔案(甚至到 TRM 的特定版本,因為這些可能以不兼容的方式從一個版本到另一個版本)。但是,如果該檔案不是很清楚,您有時可以從其他人那里得到一些想法,經過檢查,這些想法具有兼容的說明和架構特征。

uj5u.com熱心網友回復:

您錯過了 Thumb 模式規則的關鍵部分,在您鏈接的一個問題中參考(為什么 ARM PC 暫存器指向下一個要執行的指令之后的指令?):

對于所有其他使用標簽的指令,PC 的值是當前指令的地址加上 4 個位元組,結果的 bit[1] 清零以使其字對齊。

  • (0xA56 4) & -4=0xA58是 PC 相關事物在執行期間相對于的位置ldr r0, [PC, #92]

  • ((0xA56 4) & -4) 92= 0xab4,反匯編程式計算的位置。

  • 它等同于 do 0xA56 & -4= 0xa54then 4 92,因為 4不修改位 #1; 您可以考慮在添加之前或之后清除它 4但是你不能在加上 PC 相對偏移后清除該位;對于其他指令,如ldrb. (拇指模式ldr以字為單位編碼偏移量以更好地利用有限的位數,因此縮放的偏移量以及最終的加載地址始終清除位 [1:0]。)

(感謝 Raymond Chen 發現這一點;我最初也錯過了!)

另請注意,您的除錯器在斷點處停止時會向您顯示 PC 值,但這是您停止的指令的地址。(因為這就是 ARM 例外的作業方式,我假設,保存要回傳的實際指令,而不是一些偏移量。)指令執行期間,與 PC 相關的東西遵循不同的規則。并且除錯器不會“烹飪”這個值來顯示在其執行期間PC什么

該規則不是“相對于這條指令的結束/下一條指令的開始”。 說明該規則在這種情況下碰巧得到正確答案的答案和評論,但在其他 Thumb 情況下會得到錯誤答案,例如在LDR Rd,-Label vs LDR Rd,[PC Offset]中發生 PC 相對加載指令從 4 位元組對齊的地址開始,因此 PC 的第 1 位已被清除。

您的 LDR 位于0xA56設定位 #1 的地址,因此向下舍入會產生影響。并且您的ldr指令使用了 2 位元組編碼,而不是像您可能需要更大偏移量的 Thumb2 32 位指令。這兩件事都意味著向下舍入 4 恰好是下一條指令的地址,而不是 2 條指令之后或這條指令的中間。

uj5u.com熱心網友回復:

由于程式計數器指向下一條指令,當它在地址處執行LDR時0x00000A56,程式計數器將保存下一條指令的地址,即0x00000A58

0x0A58 0x5C (decimal 92) == 0x00000AB4

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/395669.html

標籤:C 部件 手臂 拇指 相对寻址

上一篇:我可以看到螢屏顯示上的nums遞減,為什么它不會打破回圈?使用nasm的x86程式集

下一篇:.ascii與.word的ARM位元組序和位元組順序

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more