Как это делается? Какие шаги я должен предпринять, и какие подводные камни и ошибки будут рассмотрены?
Как сделать встроенную сборку на IPhone?
Ответ 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-игры...