[英]ARM NEON assembly on Windows Phone 8 not working
我试图在一个.s文件中调用一个在ARM NEON程序集中编码的函数,如下所示:
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]
[....]
我正在这样组装:
armasm.exe -32 func.s func.obj
不幸的是,这不起作用,当我尝试调用该函数时,我收到非法指令异常。 当我使用dumpbin.exe反汇编.obj时,它看起来像是Thumb代码一样反汇编,尽管程序集中有ARM指令(参见上面的代码)。
我怀疑在Thumb模式下调用该函数,并且默认情况下在Windows上假定所有函数都处于Thumb模式。 虽然看不到任何关于此的信息。
有谁知道这里发生了什么?
编辑:这也发生在Microsoft Surface上
默认情况下,VS 2012会为Windows RT和Windows Phone 8生成缩略图代码,因此您可能会因从拇指代码调用arm代码而导致错误。 您有两种选择:
1.在调用函数之前从拇指模式切换到手臂模式(可以使用BX asm指令),或者
2.您可以尝试使用ARM / NEON内在函数在C ++中重写NEON代码 - 它们受VS 2012支持。只需包含“arm_neon.h”即可。
有关ARM内在函数参考,请查看以下链接: http : //msdn.microsoft.com/en-us/library/hh875058.aspx
有关NEON内在参考,请查看此链接: http : //infocenter.arm.com/help/topic/com.arm.doc.dui0491c/DUI0491C_arm_compiler_reference.pdf
来自上述链接的这些NEON内在函数通常由VS 2012支持,但可能存在一些小的差异 - 如果不确定,请查看“arm_neon.h”包含以查找。
您可以在Thumb模式下使用bx指令启动汇编代码,并简单地分支到同一源文件中的ARM部分。
并且您不必在最后切换回Thumb模式,因为您将完成bx中的ARM功能或者无论如何都会自动切换{pc}。
我的答案是WAAAAAAY,但我真的很好奇它是否适用于WP。 (我没有)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.