[英]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。
這不可能嗎?
任何評論將不勝感激。
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.