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 を逆アセンブルすると、アセンブリに ARM ディレクティブがあるにもかかわらず、Thumb コードのように逆アセンブルしているように見えます (上記のコードを参照)。

関数が Thumb モードで呼び出されていると思われます。Windows では、すべての関数がデフォルトで Thumb モードであると想定されています。ただし、これに関する情報を見つけることはできません。

ここで何が起こっているか知っている人はいますか?

編集:これはMicrosoft Surfaceでも発生します

4

2 に答える 2

1

VS 2012 は既定で Windows RT と Windows Phone 8 の両方のサム コードを生成するため、発生したエラーはおそらくサム コードからアーム コードを呼び出したことが原因です。2 つのオプションがあります:
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 部分に単純に分岐することができます。

いずれにせよ bx または pop {pc} で ARM 関数を終了するので、最後に Thumb モードに戻す必要はありません。これにより、切り替えが自動的に行われます。

私の答えは WAAAAAAY 遅いですが、WP で動作するかどうかは非常に興味があります。(私は何も持っていません)

于 2013-07-08T04:02:02.320 に答える