Вопрос

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

Это было полезно?

Решение

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

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

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

Другие советы

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

Что именно вы ищете?Если хотите, я мог бы привести вам несколько примеров.


РЕДАКТИРОВАТЬ:

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

Вот очень минимальная встроенная функция ассемблера (на C).Скажите пожалуйста, компилируется ли он и работает ли на айфоне?Если это сработает, я могу немного разглагольствовать о том, как делать полезные вещи во встроенном ассемблере 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;
}

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top