Странное поведение ldr [ПК, #value]

Я отлаживал некоторый код C++ (WinCE 6 на платформе ARM), и я нахожу некоторое поведение странным:

    4277220C    mov         r3, #0x93, 30
    42772210    str         r3, [sp]
    42772214    ldr         r3, [pc, #0x69C]
    42772218    ldr         r2, [pc, #0x694]
    4277221C    mov         r1, #0
    42772220    ldr         r0, [pc, #0x688]

Строка 42772214 ldr r3, [pc, #0x69C] используется для получения некоторой константы от раздела.DATA, по крайней мере, я думаю так.

Что является странным, что согласно коду r2 должен быть заполнен памятью от адреса pc=0x42772214 + 0x69C = 0x427728B0, но согласно содержанию памяти это загружается из 0x427728B8 (8 байтов +), это происходит для других ldr использований также.

Это - отказ отладчика или мое понимание ldr/pc? Другая проблема, которую я не получаю - почему доступ к разделу .data относительно выполненного кода? Я нахожу его немного странным.

И еще одна проблема: я не могу найти синтаксис 1-й команды mov (любой мог указать на меня optype спецификация для Ползунка (1C2)),

Извините за светское описание, но я просто ознакомляю с блоками.

11
задан XAder 20 January 2010 в 16:21
поделиться

1 ответ

Это правильно. Когда PC используется для чтения, существует 8-байтовое смещение в режиме ARM и 4-байтовое смещение в режиме большого пальца.

С рукава рук:

Когда инструкция считывает ПК, чтение значения зависит от того, от какого набора инструкций это происходит от:

  • для инструкции ARM, значение , это адрес Инструкция плюс 8 байт . Биты [1: 0] этого значения всегда ноль, потому что инструкции ARM всегда являются словом.
  • Для инструкции по большому пальцам, значение READ - это адрес инструкции плюс 4 байта . Бит [0] этого значения всегда ноль, потому что инструкции на большим пальце всегда являются полуфабрикаты.

Этот способ чтения ПК в основном используется для быстрой, независимой от позиционирования адресации близлежащих инструкций и данных, включая независимую позицию ветвления в рамках программы.

Есть 2 причины для обращения с ПК-относительными.

  1. Независимый от позиции код, который находится в вашем случае.
  2. Получите некоторые сложные константы поблизости, которые не могут быть написаны в 1 простой инструкции, например, MOV R3, # 0x12345678 невозможно завершить в 1 инструкции, поэтому компилятор может поместить эту константу в конце функции и использовать E.G. LDR R3, [ПК, # 0x50] , чтобы загрузить его вместо этого.

Я не знаю, что MOV R3, # 0x93, 30 означает. Вероятно, это MOV R3, # 0x93, rol 30 (что дает 0xc0000024 )?

17
ответ дан 3 December 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: