Как сделать встроенную сборку на айфоне? - PullRequest
28 голосов
/ 26 октября 2008

Как это сделать? Какие шаги мне нужно предпринять и какие подводные камни и ошибки следует учитывать?

Ответы [ 4 ]

19 голосов
/ 30 октября 2008

Я получил это на работу, благодаря некоторой внутренней помощи на Apple Devforums , вам следует зарегистрироваться, если вы являетесь разработчиком IPhone.

Во-первых, это __ asm __ () , не просто asm () .

Во-вторых, по умолчанию XCode генерирует цель компиляции, которая компилирует встроенную сборку с набором команд ARM Thumb, поэтому usat не был распознан как правильная инструкция. Чтобы это исправить, сделайте «Get Info» в Target. Прокрутите вниз до раздела «GCC 4.0 - Генерация кода» и снимите флажок «Compile for Thumb». Затем этот следующий фрагмент будет скомпилирован очень хорошо, если вы установите Active SDK в «Устройство»

inline int asm_saturate_to_255 (int a) {
  int y;
  __asm__("usat %0, #8, %1\n\t" : "=r"(y) : "r"(a));
  return y;
}

Естественно, теперь он не будет работать с симулятором iPhone. Но TargetConditionals.h содержит определения, против которых вы можете #ifdef. А именно TARGET_OS_IPHONE и TARGET_IPHONE_SIMULATOR .

11 голосов
/ 26 октября 2008

Я пишу совсем немного ассемблерного кода ARM Cortex-A8. Процессор на iPhone - ARM11 (afaik), поэтому основной набор инструкций тот же.

Что именно вы ищете? Я могу привести несколько примеров, если хотите.


EDIT:

Я только что узнал, что на iPhone вы должны использовать компилятор llvm-gcc. Насколько я знаю, он должен понимать синтаксис встроенного ассемблера от GCC. Если так, то все учебники по встроенному ассемблеру ARM будут работать и на iPhone.

Вот очень минимальная встроенная функция ассемблера (в C). Не могли бы вы сказать мне, если он компилируется и работает на iphone? Если это сработает, я немного расскажу, как сделать полезные вещи в встроенном ассемблере ARM, особенно для архитектуры ARMv6 и расширения DSP.

inline int saturate_to_255 (int a)
{
  int y;
  asm ("usat %0, #8, %1\n\t" : "=r"(y) : "r"(a));
  return y;
}

должно быть эквивалентно:

inline int saturate_to_255 (int a)
{
  if (a < 0) a =0;
  if (a > 255) a = 255;
  return a;
}
1 голос
/ 27 мая 2017

Регистры также могут использоваться явно во встроенном asm

void foo(void) {
#if TARGET_CPU_ARM64
    __asm ("sub        sp, sp, #0x60");
    __asm ("str        x29, [sp, #0x50]");
#endif
}
0 голосов
/ 30 октября 2008

Большой палец рекомендуется для применения, которое не требует тяжелой операции плавания. Thumb уменьшает размер кода и ускоряет его выполнение.

Так что вы должны отключить большой палец только для приложений, таких как 3D-игры ...

...