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