2009-11-10 2 views
2

У меня есть несколько строк кода ассемблера в файле .s. Всего несколько процедур, которые мне нужно вызвать. Он отлично работает при создании устройства, однако, когда я переключаюсь на iPhone Simulator, я получаю ошибки «без такой инструкции». Я попытался собрать части .s файла условно с тем, что я знаю:Условная компиляция в коде ассемблера (.s) для iPhone - как?

#if !TARGET_IPHONE_SIMULATOR 

Но ассемблер не признает эти директивы препроцессора (конечно), и ни один из условных методов компиляции для ассемблера, что я не мог вспомнить, или найти работу, так что теперь я почесываю голову о том, как избежать компиляции кода ассемблера при создании для Simulator. Я также не вижу вариант проекта в Xcode, который позволит мне скомпилировать файл или нет в зависимости от целевой платформы.

РЕШИТЬ:

Все, что я не хватало надлежащего #import в файле ассемблера. Я не думал добавлять его, потому что синтаксис Xcode выделял любую директиву препроцессора в зеленом (комментарий), что заставило меня предположить, что эти команды не распознаются, когда на самом деле они работают нормально.

Это работает:

#import "TargetConditionals.h" 

#if !TARGET_IPHONE_SIMULATOR 

... asm code here ... 

#endif 
+0

Я считаю, что инструменты, вызываемые XCode, используют один и тот же препроцессор для файлов .s и .c (если вы не изменили значения по умолчанию); вы уверены, что не ошиблись, когда попробовали это? –

ответ

2

Вы делаете это с предварительно макропроцессор. Они определены в TargetConditionals.h TARGET_IPHONE_SIMULATOR должны быть там! (Вы должны #include его, однако.)

+0

Да, конечно, там есть ... но директива препроцессора #if - нет. Он работает в коде C/ObjC, но не в файлах ассемблера .s. – LearnCocos2D

+0

На самом деле ... добавив #import «TargetConditionals.h», он работает! Я был смущен, потому что Xcode не правильно синтаксис выделил макросы препроцессора. – LearnCocos2D

+0

Спасибо GH. Я отредактирую свой ответ, чтобы уточнить, что TargetConditionals.h необходимо включить. – Andiih

1

Вот код я использую для обнаружения ARM против Thumb против Simulator:

#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 также должен быть передан модулю компиляции, который включает встроенный код asm AT & T. Установите в Target -> «Build Phases» -> foo.s целевую область в настройках сборки. – MoDJ

 Смежные вопросы

  • Нет связанных вопросов^_^