Windows Phone 8上的ARM NEON程序集无法正常工作

Ant*_*ake 5 windows arm visual-studio neon windows-phone-8

我试图在一个.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]
  [....] 
Run Code Online (Sandbox Code Playgroud)

我正在这样组装:

armasm.exe -32 func.s func.obj
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用,当我尝试调用该函数时,我收到非法指令异常.当我使用dumpbin.exe反汇编.obj时,它看起来像是Thumb代码一样反汇编,尽管程序集中有ARM指令(参见上面的代码).

我怀疑在Thumb模式下调用该函数,并且默认情况下在Windows上假定所有函数都处于Thumb模式.虽然看不到任何关于此的信息.

有谁知道这里发生了什么?

编辑:这也发生在Microsoft Surface上

小智 1

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”包含文件来找出答案。