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

时间:2009-11-10 17:47:15

标签: iphone assembly compilation conditional arm

我在.s文件中有几行汇编程序臂代码。我只需要调用几个例程。它在为设备构建时工作正常,但是当我切换到iPhone模拟器时,我得到“没有这样的指令”错误。我尝试使用我所知道的有条件地编译部分.s文件:

#if !TARGET_IPHONE_SIMULATOR

但是汇编程序不能识别这些预处理程序指令(当然)并且没有任何我能记住或找到的汇编程序的条件编译技术,所以我现在正在摸索如何避免编译汇编程序构建模拟器时的代码。我也没有在Xcode中看到一个项目选项,允许我根据目标平台编译文件。

解决:

我失踪的是汇编程序文件中正确的#import。我没有考虑添加它,因为Xcode语法突出显示绿色(注释)中的任何预处理器指令,这使我假设这些命令在实际上工作正常时无法识别。

这有效:

#import "TargetConditionals.h"

#if !TARGET_IPHONE_SIMULATOR

... asm code here ...

#endif

2 个答案:

答案 0 :(得分:2)

您使用预处理器宏执行此操作。它们在TargetConditionals.h中定义TARGET_IPHONE_SIMULATOR应该在那里! (但你确实需要#include它。)

答案 1 :(得分:1)

以下是我用于检测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;
}