По данным ARM IC.
В состоянии Thumb:
- Для команд B, BL, CBNZ и CBZ значение ПК - это адрес текущей инструкции плюс 4 байта.
- Для всех других инструкций, использующих метки, значением ПК является адрес текущей инструкции плюс 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