根据ARM IC。
在Thumb状态:
调试程序时,我发现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
答案 0 :(得分:0)
在ARM DDI 0487B.a中
T32限制使用PC,并将0b1111用作寄存器 说明符通常不使用0b1111作为寄存器说明符 在T32指令中允许。当允许值为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 相同的目的。
您应该在参考文献中查找类似的内容。