Регистр компьютера ARM не всегда является адресом текущей инструкции плюс 4 (состояние большого пальца) - PullRequest
0 голосов
/ 14 сентября 2018

По данным 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

1 Ответ

0 голосов
/ 14 сентября 2018

В ARM DDI 0487B.a

T32 ограничения на использование ПК и использование 0b1111 в качестве спецификатора регистра Использование 0b1111 в качестве спецификатора регистра обычно не разрешается в инструкциях T32,Когда допустимо значение 0b1111, возможны различные значения.Для чтения регистров эти значения включают:

  • Считать значение ПК, то есть адрес текущей инструкции + 4. Базовым регистром инструкций ветви TBB и TBH таблицы может быть ПК.Это означает, что таблицы ветвей могут быть помещены в память сразу после инструкции.

Примечание. ARM не рекомендует использовать ПК в качестве базового регистра в инструкции STC.

  • Считать значение ПК с выравниванием слов, то есть адрес текущей инструкции + 4, с битами [1: 0], установленными в ноль. Базовый регистр LDC, LDR,Команды LDRB, LDRD (предварительно проиндексированные, без обратной записи), LDRH, LDRSB и LDRSH могут быть совмещенными в слова ПК.Это обеспечивает относительную к ПК адресацию данных.Кроме того, некоторые кодировки инструкций ADD и SUB позволяют их исходным регистрам иметь значение 0b1111 для той же цели.

Вам следует искать что-то похожее в вашей ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...