代码之家  ›  专栏  ›  技术社区  ›  CodeSmile Paul Beusterien

iPhone汇编程序(.s)代码的条件编译-如何?

  •  2
  • CodeSmile Paul Beusterien  · 技术社区  · 16 年前

    我在一个.s文件中有几行汇编程序ARM代码。我只需要打几个电话。它在为设备构建时工作正常,但是当我切换到iPhone模拟器时,我会得到“无此类指令”错误。我试图有条件地编译.s文件的部分内容,我知道:

    #if !TARGET_IPHONE_SIMULATOR
    

    但是汇编程序无法识别这些预处理器指令(当然),而且汇编程序的所有条件编译技术我都记不起来,也没有发现它们起作用,所以我现在正绞尽脑汁想在为模拟器构建时如何避免编译汇编程序代码。我在Xcode中也没有看到允许我编译文件或不依赖于目标平台的项目选项。

    解决了的:

    我所缺少的只是汇编程序文件中的正确导入。我没有考虑添加它,因为Xcode语法以绿色突出显示了任何预处理器指令(comment),这使我假设这些命令实际上工作正常时无法识别。

    这工作:

    #import "TargetConditionals.h"
    
    #if !TARGET_IPHONE_SIMULATOR
    
    ... asm code here ...
    
    #endif
    
    2 回复  |  直到 14 年前
        1
  •  2
  •   Andiih    16 年前

    你可以用预处理宏来完成。它们在targetconditionals.h中定义。 TARGET_IPHONE_SIMULATOR 应该在那里!(但是,您需要将其包括在内。)

        2
  •  1
  •   MoDJ    14 年前

    以下是我用来检测ARM与Thumb与模拟器的代码:

    #include "TargetConditionals.h"
    
    #if defined(__arm__)
    # if defined(__thumb__)
    #  define COMPILE_ARM_THUMB_ASM 1
    # else
    #  define COMPILE_ARM_ASM 1
    # endif
    #endif
    
    #if TARGET_IPHONE_SIMULATOR
      // Simulator defines
    #else
      // ARM or Thumb mode defines
    #endif
    

    //你可以这样使用它

    uint32_t
    test_compare_shifted_operand(uint32_t w1) {
      uint32_t local;
    #if defined(COMPILE_ARM_ASM)
      const uint32_t shifted = (1 << 8);
      __asm__ __volatile__ (
                            "mov %[w2], #1\n\t"
                            "cmp %[w2], %[w1], lsr #8\n\t"
                            "moveq %[w2], #10\n\t"
                            "movne %[w2], #11\n\t"
                            : \
                            [w1] "+l" (w1),
                            [w2] "+l" (local)
                            : \
                            [shifted] "l" (shifted)
                            );
    #else // COMPILE_ARM_ASM
      if ((w1 >> 8) == 1) {
        local = 10;
      } else {
        local = 11;
      }
    #endif // COMPILE_ARM_ASM  
      return local;
    }