Я отлаживал некоторый код 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)),
Извините за светское описание, но я просто ознакомляю с блоками.
Это правильно. Когда PC
используется для чтения, существует 8-байтовое смещение в режиме ARM и 4-байтовое смещение в режиме большого пальца.
С рукава рук:
Когда инструкция считывает ПК, чтение значения зависит от того, от какого набора инструкций это происходит от:
- для инструкции ARM, значение , это адрес Инструкция плюс 8 байт . Биты [1: 0] этого значения всегда ноль, потому что инструкции ARM всегда являются словом.
- Для инструкции по большому пальцам, значение READ - это адрес инструкции плюс 4 байта . Бит [0] этого значения всегда ноль, потому что инструкции на большим пальце всегда являются полуфабрикаты.
Этот способ чтения ПК в основном используется для быстрой, независимой от позиционирования адресации близлежащих инструкций и данных, включая независимую позицию ветвления в рамках программы.
Есть 2 причины для обращения с ПК-относительными.
MOV R3, # 0x12345678
невозможно завершить в 1 инструкции, поэтому компилятор может поместить эту константу в конце функции и использовать E.G. LDR R3, [ПК, # 0x50]
, чтобы загрузить его вместо этого. Я не знаю, что MOV R3, # 0x93, 30
означает. Вероятно, это MOV R3, # 0x93, rol 30
(что дает 0xc0000024
)?