2009-11-10 67 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