簡體   English   中英

ARM Cortex M0 / M3 / M4:為什么PC在Thumb狀態下總是偶數

[英]ARM Cortex M0/M3/M4:Why PC is always Even number in Thumb State

據我所知,ARM Cortex-M CPU始終處於Thumb狀態,這意味着:

程序計數器指示的拇指狀態為奇數(LSB = 1)。 分支到偶數地址將導致異常,因為不允許切換回ARM狀態。

但是,當我使用CortexM0和M4 CPU時, PC始終是均勻的 每次分支時,LR記錄PC + 1,每次返回時,PC都給出LR-1。

例如,如果lr = 0x0000_01D5,

執行

BX lr

然后PC應該是0x0000_01D5,而它給出0x0000_01D4。

這不可能嗎?

任何評論將不勝感激。

Cortex-M4技術參考手冊

2.3.1程序計數器

寄存器R15是程序計數器(PC)。

位[0]始終為0,因此指令始終與字或半字邊界對齊。

PC讀取不應返回奇數地址。 但是,當您寫入PC ,值的LSB將加載到EPSR T位中。 Cortex-M3設備通用用戶指南 - 2.1.3。 核心登記冊

拇指狀態

Cortex-M3處理器僅支持Thumb狀態下的指令執行。 以下可以將T位清除為0:

 instructions BLX, BX and POP{PC} restoration from the stacked xPSR value on an exception return bit[0] of the vector value on an exception entry or reset. 

當T位為0時嘗試執行指令會導致故障或鎖定。 有關更多信息,請參閱鎖定。

換句話說,您可以從PC讀取偶數值,但在正常情況下無法寫入這些值。

我也有這種困惑。 lsbit設置用於BX將使用地址的情況。 當它進入電腦本身時,它會被剝離。 如果你反匯編一些簡單的pc相對尋址,它將演示正在發生的事情。

雖然有4,294,967,296 [2 ^ 32]個存儲單元,但實際數據總線只有8位寬。

對於16位指令,每個指令加載需要2次內存訪問:這是關於“Endian”的參數開始的地方。 無論您采用哪種方式,都會以第一個字節讀取2個字節,地址以0結尾。

[嘆氣]如果ARM數據總線寬度為16 [或32]位,您可能會忘記PC中的位 - 並且指令空間有兩倍[或四倍]。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM