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, имеет патент на изменение кода приложенияв пути от издателя к устройству; это может быть причиной.

Ответы на вопрос(3)

Ваш ответ на вопрос