Czy ARM (nie Thumb) w ogóle obsługuje WinPhone8?

Stoję przed dziwnym problemem, trochę podobnym doto. Mam natywny projekt DLL Windows Phone 8, głównie C ++, ale ze źródłem ARM. Źródło jest w trybie ARM (tj. Nie Thumb). C ++ jest skompilowany do Thumb.

Aplikacja ulega awarii, gdy C ++ próbuje wywołać procedurę składania. Polecenie wywołania w demontażu to BLX z natychmiastowym przesunięciem - powinno bezwarunkowo przełączyć tryb z powrotem na ARM, ale jakoś nie.

Mam szczegóły wyjątku. Kod wyjątku to 0xc000001d (nieprawidłowa operacja), a wartość komputera w strukturze kontekstu awarii to 0x696d5985. To niemożliwe w obu trybach - jest źle wyrównane, bit zero to jeden. Instrukcja BLX idzie1b f0 0c eb - jeśli rozszyfrujesz, jest to dwuczęściowy BLX w stylu Thumb w porządku, z przesunięciem 4-stopniowym. Flaga T w kontekście awarii to SET (CPSR = 0x60000010).

Nie mam urządzenia, ale dziennik awarii testera beta jest dość rozstrzygający. Mam rekord dziennika debugowania tuż przed wywołaniem do złożenia. Potem katastrofa.

EDYTOWAĆ:związane z . Twierdzą jednak, że sam asembler (armasm) tłumaczy ARM na Thumb. W moim przypadku tak nie jest - przynajmniej nie statycznie. DLL zawiera prawidłowy kod ARM, jak określono w źródle zespołu (CODE32).

EDYCJA: wypróbowano z nieco inną sekwencją skoku:

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.

Ten sam wynik. Wygląda na to, że gdzieś w Sklepie zachodzi jakieś dziwne morfowanie kodu lub sam system przechwytuje przełączniki trybu i zapobiega im.

Morfowanie kodu można prawdopodobnie wykryć przez zrzucenie części pliku wykonywalnego do dziennika awarii wraz z pozostałymi danymi o awarii. Ale co mogę zrobić z zakłóceniami systemu operacyjnego, z wyjątkiem konwersji na cały kod na Thumb? To nie tylko rekompiluje.

EDIT for dwelch: sekwencja wywołująca w skompilowanym kodzie C wygląda następująco:

.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 natychmiastowy adres HAS, aby przełączyć tryb. To nie jest warunkowebx register. Cel wywołania jest głupi:

.text:10025984                 B               Func_Impl

A adres awarii jest taki plus jeden: 5985.

Jest to demontaż skompilowanej biblioteki DLL, ale nie mam gwarancji, że jest to dokładnie to, co wykonuje się na urządzeniu. Użytkownik w połączonym wątku MSDN twierdził, że spojrzał na demontażw debuggerze i zobaczyłem Thumb, gdzie powinien być ARM. Microsoft, IIRC, posiada patent na modyfikację kodu aplikacjiw drodze od wydawcy do urządzenia; to może być powód.

questionAnswers(3)

yourAnswerToTheQuestion