2012-11-21 23 views
5

Próbuję wywołać funkcję, która jest kodowana w montażu ARM NEON w pliku .S który wygląda tak:ARM NEON montaż na Windows Phone 8 nie działa

AREA myfunction, code, readonly, ARM 
    global fun 
    align 4 
fun 
    push {r4, r5, r6, r7, lr} 
    add r7, sp, #12 
    push {r8, r10, r11} 
    sub r4, sp, #64 
    bic r4, r4, #15 
    mov sp, r4 
    vst1.64 {d8, d9, d10, d11}, [r4]! 
    vst1.64 {d12, d13, d14, d15}, [r4] 
    [....] 

a ja go montażu tak:

armasm.exe -32 func.s func.obj 

Niestety to nie działa, a otrzymuję wyjątek od instrukcji niezgodnej z instrukcją, gdy próbuję wywołać funkcję. Kiedy użyłem dumpbin.exe do zdemontowania pliku .obj, wydaje się, że jest on demontowany tak, jakby był kodem Thumb, pomimo dyrektywy ARM w zestawie (zobacz kod powyżej).

Podejrzewam, że funkcja jest wywoływana w trybie Kciuk i że wszystkie funkcje domyślnie są w trybie Kciuk w systemie Windows. Nie widzę jednak żadnych informacji na ten temat.

Czy ktoś wie, co się tutaj dzieje?

EDIT: To się dzieje na Microsoft Surface oraz

+0

Ah, Głupie pytanie: Co sprawia, że ​​myślisz, że ARM Neon jest obsługiwany na WP8? Nie widziałem nic mówiącego, że jest obsługiwane na WP8 ... – JustinAngel

+0

armasm.exe narzekało na kilka rzeczy , które naprawiłem, ale nie podniosło to żadnych ostrzeżeń na temat NEON, a 95% z nich to NEON –

+1

Nie wiem o WP8, ale słyszałem, że WinRT obsługuje tylko kod Thumb2 (nawet jeśli CPU akceptuje RAMIĘ). Dlaczego jednak nie możesz połączyć się z Thumb2? –

Odpowiedz

1

VS 2012 domyślnie generuje kod kciuk zarówno dla systemu Windows RT i Windows Phone 8, więc masz błąd jest prawdopodobnie spowodowane przez wywołanie do kodu ramienia z kodu kciuka. Masz dwie opcje:
1. Przełącz się z trybu kciuka do trybu uzbrojenia przed wywołaniem funkcji (możesz użyć do tego instrukcji BX asm) lub
2. Możesz spróbować przepisać swój kod NEON w C++ za pomocą ARM/NEON intrinsics - są obsługiwane przez VS 2012. Wystarczy dołączyć "arm_neon.h" i gotowe.
Dla intrinsics ramienia odniesienia sprawdzić poniższy link: http://msdn.microsoft.com/en-us/library/hh875058.aspx
Dla intrinsics NEON odwoływać sprawdź ten link: http://infocenter.arm.com/help/topic/com.arm.doc.dui0491c/DUI0491C_arm_compiler_reference.pdf

Te intrinsics NEON z linku powyżej są ogólnie obsługiwanej przez VS 2012 nie mogą być pewne niewielkie różnice choć - jeśli nie jesteś pewien, sprawdź "arm_neon.h", aby się dowiedzieć.

+0

Tak, skończyło się na zastosowaniu wewnętrznego kodowania, ale ten kod nie jest tak szybki jak złożenie, ponieważ używam insot tak jak VSWP, które nie są mapowane na wewnętrzne. –

+0

Ponadto, asembler nie wydawał się składać kodu ARM - wydawało się, że utknął w trybie ARMCE, cokolwiek to jest. –

0

Można uruchomić kod zespołu za pomocą instrukcji bx w trybie Kciuk i po prostu rozgałęziać do części ARM w tym samym pliku źródłowym.

I nie musisz przełączać się z powrotem do trybu Kciuk na końcu, ponieważ ukończysz funkcję ARM w trybie bx lub pop {pc}, mimo że przełączanie odbywa się automatycznie.

Moja odpowiedź brzmi: WAAAAAAY późno, ale jestem bardzo ciekawy, czy działa na WP. (Nie mam żadnych)

+0

Nadal ciekawy? Zobacz [tutaj] (http://stackoverflow.com/questions/18344419/is-arm-not-thumb-supported-on-winphone8-at-all). Krótko, nie. –