根据ARM IC。
在拇指状态:
对于 B、BL、CBNZ 和 CBZ 指令,PC 的值是当前指令的地址加上 4 个字节。
对于所有其他使用标签的指令,PC 的值是当前指令的地址加上 4 个字节。
在调试程序时,我发现 pc 并不总是当前指令的地址加上 4 个字节,例如下面的指令(2)。
有人可以给出一些解释吗?谢谢。
0x2a003118 ldr r3, [pc, #120] ; (0x2a003194
0x2a00311a ldr r3, [r4, r3]
0x2a00311c mov r0, r3
0x2a00311e ldr r3, [pc, #136] ; (0x2a0031a8
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
==================================================== ==========
(1).ldr r3, [pc, #120] ; (0x2a003194
p/x $pc+4+120
$1 = 0x2a003194
; $pc+4 ,Correct
(2).ldr r3, [pc, #136] ; (0x2a0031a8
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
p/x $pc+4+108
$4 = 0x2a00319c
; $pc+4 ,Correct