Подтвердить что ты не робот

Как сделать встроенную сборку на IPhone?

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

4b9b3361

Ответ 1

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

Прежде всего, это __asm ​​__(), а не просто asm().

Во-вторых, по умолчанию XCode генерирует цель компиляции, которая компилирует встроенную сборку с набором команд ARM Thumb, поэтому usat не был признан в качестве правильной инструкции. Чтобы исправить это, сделайте "Получить информацию" в Target. Перейдите к разделу "GCC 4.0 - Генерация кода" и снимите флажок "Скомпилировать для большого пальца". Тогда этот следующий фрагмент будет скомпилирован просто отлично, если вы установите 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.

Ответ 2

Я пишу довольно много ассемблера 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;
}

Ответ 3

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

void foo(void) {
#if TARGET_CPU_ARM64
    __asm ("sub        sp, sp, #0x60");
    __asm ("str        x29, [sp, #0x50]");
#endif
}

Ответ 4

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

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