Условная компиляция в коде ассемблера (.s) для iPhone - как?

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

#if !TARGET_IPHONE_SIMULATOR

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

РЕШИТЬ:

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

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

#import "TargetConditionals.h"

#if !TARGET_IPHONE_SIMULATOR

... asm code here ...

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

Ответы на вопрос(2)

Решение Вопроса

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

 LearnCocos2D10 нояб. 2009 г., 20:06
На самом деле ... добавив #import "TargetConditionals.h» оно работает! Я был сбит с толку, потому что Xcode неправильно синтаксис выделяет макросы препроцессора.
 Andiih16 нояб. 2009 г., 10:34
Спасибо GH. Я отредактирую свой ответ, чтобы было понятнее, что TargetConditionals.h необходимо включить.
 LearnCocos2D10 нояб. 2009 г., 20:00
Да, конечноs там ... но директива препроцессора #if нет. Он работает в коде C / ObjC, но не в файлах .s ассемблера.

Вот код, который я использую для обнаружения 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;
}
 MoDJ10 окт. 2012 г., 21:40
Начиная с Xcode 4.5, аргумент командной строки -no-integrated-as также необходимо будет передавать в модуль компиляции, который включает встроенный AT &T asm код. Установите это в Target -> "Фазы сборки "-> foo.s целевой области в настройках сборки.

Ваш ответ на вопрос