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

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

#if !TARGET_IPHONE_SIMULATOR

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

РЕШИТЬ:

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

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

#import "TargetConditionals.h"

#if !TARGET_IPHONE_SIMULATOR

... asm code here ...

#endif

Ответы [ 2 ]

2 голосов
/ 10 ноября 2009

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

1 голос
/ 31 мая 2011

Вот код, который я использую для обнаружения 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;
}
...