5

我正在尝试在 .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 上

4

2 回答 2

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

于 2013-02-17T19:32:17.710 回答
0

您可以在 Thumb 模式下使用 bx 指令开始您的汇编代码,然后简单地分支到同一源文件中的 ARM 部分。

而且您不必在最后切换回 Thumb 模式,因为您将在 bx 或 pop {pc} 中完成 ARM 功能,它会自动进行切换。

我的回答是 WAAAAAAY 晚了,但我真的很好奇它是否适用于 WP。(我没有)

于 2013-07-08T04:02:02.320 回答