ARM (не Thumb) поддерживается на WinPhone8 вообще?
Я сталкиваюсь со странной проблемой, чем-то похожей наэто, У меня есть собственный проект DLL для Windows Phone 8, в основном C ++, но с источником сборки ARM. Источник находится в режиме ARM (т.е. не Thumb). C ++ скомпилирован в Thumb.
Приложение вылетает, когда C ++ пытается вызвать процедуру сборки. Команда вызова в разборке - это BLX с немедленным смещением - она должна безоговорочно переключать режим обратно в ARM, но почему-то это не так.
У меня есть детали исключения. Код исключения - 0xc000001d (недопустимая операция), а значение ПК в структуре контекста сбоя - 0x696d5985. Это невозможно в любом режиме - он смещен, бит ноль равен единице. Инструкция BLX идет1b f0 0c eb
- если вы расшифровываете, то это BLX в стиле Thumb, состоящий из двух частей, с смещением в 4 ряда. Флаг T в контексте сбоя - SET (CPSR = 0x60000010).
У меня нет устройства, но журнал сбоев от бета-тестера довольно убедителен. У меня есть запись журнала отладки прямо перед вызовом в сборку. Тогда крушение.
РЕДАКТИРОВАТЬ:Связанный , Они утверждают, однако, что сам ассемблер (armasm
) переводит ARM на большой палец. Это не так для меня - по крайней мере, не статично. DLL содержит правильный код ARM, как указано в источнике сборки (CODE32
).
РЕДАКТИРОВАТЬ: попробовал с немного другой последовательностью перехода:
ldr r12, target
and r12, r12, #0xfffffffe ; To be sure
bx r12 ;BX to a register with a cleared 0th bit. Doesn't get any more explicit than that.
Тот же результат. Похоже, что где-то в Магазине происходит какое-то странное изменение кода, или сама ОС ловит переключатели режима и предотвращает их.
Изменения кода, вероятно, могут быть обнаружены путем сброса частей исполняемого файла в журнал сбоев вместе с остальными данными сбоев. Но что я могу сделать с вмешательством ОС, если не считать преобразование всей базы кода в Thumb? Это не просто перекомпилировать.
РЕДАКТИРОВАТЬ для dwelch: вызывающая последовательность в скомпилированном C-коде выглядит следующим образом:
.text:1000A35E MOV R2, #g_Host ;Three parameters
.text:1000A366 MOV R1, R5
.text:1000A368 MOV R0, R6
.text:1000A36A BLX Func ; Code bytes 1B F0 0C EB
BLX по непосредственному адресу ДОЛЖЕН переключать режим. Это не условно, какbx register
, Цель вызова - это Thunk:
.text:10025984 B Func_Impl
И адрес сбоя - вот этот плюс один плюс: 5985.
Это разборка скомпилированной DLL, но у меня нет гарантии, что это именно то, что выполняется на устройстве. Пользователь в связанном потоке MSDN заявил, что смотрел на разборкув отладчике и увидел большой палец там, где должен был быть ARM. Microsoft, IIRC, имеет патент на изменение кода приложенияв пути от издателя к устройству; это может быть причиной.