Как выполнить встроенную сборку на iPhone?
-
04-07-2019 - |
Вопрос
Как это делается?Какие шаги мне нужно предпринять и какие подводные камни и подводные камни следует учитывать?
Решение
Я получил это на работу, благодаря некоторой внутренней помощи на 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-игры ...