簡體   English   中英

ARM pc寄存器並不總是當前指令的地址加4(拇指狀態)

[英]ARM pc register is not always the address of the current instruction plus 4 (Thumb state)

根據ARM IC。

在Thumb狀態下:

  • 對於B,BL,CBNZ和CBZ指令,PC的值是當前指令的地址加上4個字節。
  • 對於所有使用標簽的其他指令,PC的值是當前指令的地址加上4個字節。

當調試程序時,我發現pc並不總是當前指令的地址加上4個字節,例如以下指令(2)。
有人可以解釋一下嗎? 謝謝。

0x2a003118  ldr r3, [pc, #120]  ; (0x2a003194 <main()+684>)   <---(1)
0x2a00311a  ldr r3, [r4, r3] 
0x2a00311c  mov r0, r3 
0x2a00311e  ldr r3, [pc, #136]  ; (0x2a0031a8 <main()+704>)   <---(2)
0x2a003120  add r3, pc                                        <---(3)
0x2a003122  mov r1, r3 
0x2a003124  bl 0x2a00338c
0x2a003128  mov r3, r0 
0x2a00312a  mov r0, r3 
0x2a00312c  ldr r3, [pc, #108]  ; (0x2a00319c <main()+692>)   <---(4)

================================================== ==========

(1).ldr r3, [pc, #120] ; (0x2a003194 <main()+684>)
    p/x $pc+4+120 
    $1 = 0x2a003194
   ; $pc+4 ,Correct

(2).ldr r3, [pc, #136] ; (0x2a0031a8 <main()+704>) 
    p/x $pc+4+136 
    $2 = 0x2a0031aa
   ; Wrong! it should be 0x2a0031a8($pc+2) instead of 0x2a0031aa($pc+4).

(3).add r3, pc
    p/x $r3+$pc+4  
    $3 = 0x2a025c04
   ; $pc+4 ,Correct

(4).ldr r3, [pc, #108]  ; (0x2a00319c <main()+692>)
    p/x $pc+4+108 
    $4 = 0x2a00319c
   ; $pc+4 ,Correct

在ARM DDI 0487B.a中

T32對PC使用的限制以及將0b1111用作寄存器說明符在T32指令中通常不允許將0b1111用作寄存器說明符。 當允許值為0b1111時,可能有多種含義。 對於寄存器讀取,這些含義包括:

  • 讀取PC值,即當前指令的地址+4。表分支指令TBB和TBH的基址寄存器可以是PC。 這意味着可以在指令之后立即將分支表放置在內存中。

注– ARM拒絕將PC用作STC指令中的基址寄存器。

  • 讀取字對齊的PC值,即當前指令的地址+ 4, 將位[1:0]強制為零。 LDC,LDR,LDRB,LDRD(預索引,無寫回),LDRH,LDRSB和LDRSH指令的基址寄存器可以是字對齊的PC。 這提供了PC相關的數據尋址。 另外,出於相同的目的,ADD和SUB指令的某些編碼允許其源寄存器為0b1111。

您應該在參考資料中尋找類似的內容。

暫無
暫無

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

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