30

それはどのように行われますか?どのような手順を踏む必要がありますか? また、考慮すべき落とし穴や落とし穴はありますか?

4

5 に答える 5

20

Apple Devforumsの内部ヘルプのおかげで、これが機能するようになりました。熱心な iPhone 開発者であれば、サインアップする必要があります。

まず最初に、プレーンなasm( ) ではなく __asm__( )です。

次に、XCode はデフォルトで、ARM Thumb 命令セットに対してインライン アセンブリをコンパイルするコンパイル ターゲットを生成するため、usatは適切な命令として認識されませんでした。これを修正するには、ターゲットで「Get Info」を実行します。「GCC 4.0 - コード生成」セクションまでスクロールし、「Thumb 用にコンパイル」のチェックを外します。次に、Active SDK を "Device" に設定すると、この次のスニペットは正常にコンパイルされます。

inline int asm_saturate_to_255 (int a) {
  int y;
  __asm__("usat %0, #8, %1\n\t" : "=r"(y) : "r"(a));
  return y;
}

当然、iPhone Simulator では動作しなくなります。しかし、TargetConditionals.hには #ifdef できる定義があります。つまり、 TARGET_OS_IPHONETARGET_IPHONE_SIMULATORです。

于 2008-10-29T22:56:21.950 に答える
12

ARM Cortex-A8 アセンブリ コードをかなり書いています。iPhone の CPU は ARM11 (afaik) であるため、コア命令セットは同じです。

正確には何を探していますか?必要に応じて、いくつかの例を挙げます。


編集:

iPhone では llvm-gcc コンパイラを使用する必要があることがわかりました。私の知る限り、GCC のインライン アセンブラ構文を理解する必要があります。その場合、すべての ARM インライン アセンブラー チュートリアルは iPhone でも機能します。

これは非常に最小限のインライン アセンブラ関数です (C で記述)。iPhoneでコンパイルして動作するかどうか教えてください。それが機能する場合、特に ARMv6 アーキテクチャと DSP 拡張機能について、ARM インライン アセンブラで便利なことを行う方法を少し怒鳴ることができます。

inline int saturate_to_255 (int a)
{
  int y;
  asm ("usat %0, #8, %1\n\t" : "=r"(y) : "r"(a));
  return y;
}

次と同等である必要があります。

inline int saturate_to_255 (int a)
{
  if (a < 0) a =0;
  if (a > 255) a = 255;
  return a;
}
于 2008-10-26T13:35:59.057 に答える
2

レジスターは、インライン asm で明示的に使用することもできます

void foo(void) {
#if TARGET_CPU_ARM64
    __asm ("sub        sp, sp, #0x60");
    __asm ("str        x29, [sp, #0x50]");
#endif
}
于 2017-05-27T13:53:28.650 に答える
0

重いフロート操作を必要としないアプリケーションには、Thumbをお勧めします。Thumbを使用すると、コードサイズが小さくなり、コードの実行も速くなります。

したがって、3DゲームなどのアプリケーションではThumbをオフにする必要があります...

于 2008-10-30T13:31:02.293 に答える