Как это делается? Какие шаги мне нужно предпринять и какие подводные камни и ловушки нужно учитывать?
Как сделать встроенную сборку на IPhone?
Ответы (4)
Я заставил это работать, благодаря некоторой внутренней помощи на яблочных форумах разработчиков, вы должны зарегистрироваться, если вы преданный разработчик 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 Simulator. Но TargetConditionals.h содержит определения, против которых можно использовать #ifdef. А именно TARGET_OS_IPHONE и TARGET_IPHONE_SIMULATOR.
Я пишу довольно много ассемблерного кода ARM Cortex-A8. Процессор на iPhone — это ARM11 (афаик), поэтому основной набор инструкций тот же.
Что именно вы ищете? Я могу привести несколько примеров, если хотите.
РЕДАКТИРОВАТЬ:
Я только что узнал, что на 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;
}
Регистры также можно явно использовать во встроенном ассемблере.
void foo(void) {
#if TARGET_CPU_ARM64
__asm ("sub sp, sp, #0x60");
__asm ("str x29, [sp, #0x50]");
#endif
}
Thumb рекомендуется для применений, не требующих тяжелой работы с поплавком. Thumb уменьшает размер кода и приводит к более быстрому его выполнению.
Таким образом, вы должны отключать Thumb только для таких приложений, как 3D-игры...