ARM (не Thumb) поддерживается на WinPhone8 вообще?

я сталкиваюсь со странной проблемой, чем-то похожей наэтот, У меня есть собственный проект DLL для Windows Phone 8, в основном C ++, но с источником сборки ARM. Источник находится в режиме ARM (т.е. не Thumb). C ++ скомпилирован в Thumb.

Приложение вылетает, когда C ++ пытается вызвать процедуру сборки. Команда вызова в разборке - BLX с немедленным смещением - это 'предполагается переключить режим обратно в ARM, безусловно, но как-то это не такт.

У меня есть детали исключения. Код исключения - 0xc000001d (недопустимая операция), а значение ПК в структуре контекста сбоя - 0x696d5985. Тот'невозможно в любом режиме - этоs смещен, бит ноль равен единице. Инструкция BLX идет1b f0 0c eb - если вы расшифруете, этоХорошо, с двумя частями в стиле Thumb BLX, со смещением в 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)

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