繁体   English   中英

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

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM