2012-11-21 33 views
5

Sto cercando di chiamare una funzione che è codificato in assembly ARM NEON in un file .s che assomiglia a questo:ARM su Windows Phone 8 non funziona

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] 
    [....] 

e sto assemblaggio che In questo modo:

armasm.exe -32 func.s func.obj 

Sfortunatamente questo non funziona, e sto ricevendo un'eccezione di istruzioni illegali quando provo a chiamare la funzione. Quando ho usato dumpbin.exe per disassemblare il .obj, sembra che si stia disassemblando come se fosse un codice Thumb, nonostante la direttiva ARM nell'assembly (vedi il codice sopra).

Sospetto che la funzione venga richiamata in modalità Pollice e che tutte le funzioni siano presumibilmente in modalità Thumb per impostazione predefinita su Windows. Non riesco a vedere per trovare alcuna informazione su questo però.

Qualcuno sa cosa sta succedendo qui?

EDIT: Questo accade su Microsoft Surface e

+0

Ah, domanda stupida: cosa ti fa pensare che ARM Neon sia supportato su WP8? Non ho visto nulla che dicesse che è supportato su WP8 ... – JustinAngel

+0

armasm.exe si è lamentato di alcune cose , che ho risolto, ma non ha generato alcun avviso circa il NEON, e il 95% degli insns era NEON –

+1

Non so di WP8, ma ho sentito che WinRT supporta solo il codice Thumb2 (anche se la CPU accetta BRACCIO). Perché non puoi assemblare come Thumb2? –

risposta

1

VS 2012 per default produce codice pollice sia per Windows RT e Windows Phone 8 in modo da l'errore che hai è causato probabilmente da mettere in codice braccio dal codice del pollice. Sono disponibili due opzioni:
1. Passare dalla modalità pollice alla modalità braccio prima di chiamare la funzione (è possibile utilizzare le istruzioni BX asm) oppure
2. È possibile provare a riscrivere il codice NEON in C++ utilizzando ARM/NEON intrinseche - sono supportate da VS 2012. Basta includere "arm_neon.h" e il gioco è fatto.
Per gli intrinseci gruppo di riferimento che il check out il link seguente: http://msdn.microsoft.com/en-us/library/hh875058.aspx
Per intrinseche NEON riferimento controlla questo link: http://infocenter.arm.com/help/topic/com.arm.doc.dui0491c/DUI0491C_arm_compiler_reference.pdf

Questi intrinseche NEON dal link qui sopra sono generalmente sostenuto da VS 2012, ci potrebbero essere alcune piccole differenze tuttavia, se non sei sicuro, controlla l'inclusione di "arm_neon.h" per scoprirlo.

+0

Sì, ho finito con l'uso di intrinseche, ma quel codice non è veloce quanto l'assembly, perché io uso insns come VSWP che non si connette a intrinsecamente. –

+0

Inoltre, l'assemblatore non sembrava assemblare il codice ARM - sembrava bloccato sulla modalità ARMCE, qualunque esso sia. –

0

È possibile avviare il codice assembly con un'istruzione bx in modalità Thumb e passare semplicemente alla parte ARM nello stesso file sorgente.

E non è necessario tornare alla modalità Thumb alla fine poiché finirai la funzione ARM in bx o pop {pc} in ogni caso, che cambia automaticamente.

La mia risposta è WAAAAAAY tardi, ma sono davvero curioso di sapere se funziona su un WP. (Non ne ho)

+0

Ancora curioso? Vedi [qui] (http://stackoverflow.com/questions/18344419/is-arm-not-thumb-supported-on-winphone8-at-all). A breve, no. –

Problemi correlati