2009-11-10 54 views
2

我在.s文件中有几行汇编程序代码。只需要拨打几个例程。它在为设备构建时工作正常,但是当我切换到iPhone模拟器时,我得到“没有这样的指令”错误。我试图编译.s文件的部分有条件什么我知道:针对iPhone的汇编程序(.s)代码的条件编译 - 如何?

#if !TARGET_IPHONE_SIMULATOR 

但汇编不承认这些预处理指令(当然),没有的条件编译技术汇编,我能记得或找到工作,所以我现在抓我的脑袋,如何避免编译模拟器时编译该汇编代码。我也没有看到Xcode中的项目选项,它允许我编译文件或不依赖于目标平台。

解决:

所有我缺少的是在所有的汇编文件正确的#import。我没有考虑添加它,因为Xcode语法突出显示了绿色(注释)中的任何预处理器指令,这使我认为这些命令在实际上它们工作得很好时不会被识别。

这工作:

#import "TargetConditionals.h" 

#if !TARGET_IPHONE_SIMULATOR 

... asm code here ... 

#endif 
+0

我相信XCode调用的工具对.s和.c文件使用相同的预处理器(如果您没有更改默认值);你确定你试过这个时不会犯错吗? – 2009-11-10 17:55:52

回答

2

你做一个预处理器宏做到这一点。它们在TargetConditionals.h中定义。TARGET_IPHONE_SIMULATOR应该在那里! (你需要但是#包括它)。

+0

是的,当然它在那里......但#if预处理器指令不是。它在C/ObjC代码中工作,但不在汇编器的.s文件中。 – LearnCocos2D 2009-11-10 19:00:39

+0

其实...通过添加#import“TargetConditionals.h”它的工作原理!我很困惑,因为Xcode没有正确地语法突出显示预处理器宏。 – LearnCocos2D 2009-11-10 19:06:17

+0

谢谢GH。我将编辑我的答案,使其更清晰,TargetConditionals.h需要包含在内。 – Andiih 2009-11-16 09:34:29

1

下面是代码,我用它来检测ARM VS拇指VS模拟器:

#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; 
} 
+0

从Xcode 4.5开始,还需要将-no-integrated-as命令行参数传递给包含内联AT&T asm代码的编译模块。在构建设置中的目标 - >“构建阶段” - > foo.s目标特定区域中进行设置。 – MoDJ 2012-10-10 19:40:00