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

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


person Hans Sjunnesson    schedule 26.10.2008    source источник
comment
Хороший вопрос, мне очень интересно увидеть ответы.   -  person mdec    schedule 26.10.2008


Ответы (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.

person Hans Sjunnesson    schedule 29.10.2008
comment
Я думаю, вы имеете в виду __asm__() вместо простого asm(). - person Quinn Taylor; 24.06.2009
comment
Почему это не работает с Симулятором iPhone? Дело в том, что на симуляторе не работает сборка, или у вас должен быть другой набор инструкций по сборке, потому что он работает на i386? - person Roberto; 07.07.2012
comment
@ Роберто: Ты понял. Симулятор работает на x86, поэтому вы не можете запустить сборку ARM. Он просто не будет компилироваться. - person Dietrich Epp; 11.07.2012

Я пишу довольно много ассемблерного кода 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;
}
person Nils Pipenbrinck    schedule 26.10.2008
comment
У меня не получилось это скомпилировать. Я пытался через Apple XCode. Компилятор фактически установлен на GCC 4 по умолчанию. Если я скомпилирую его, используя это, он жалуется на недопустимую инструкцию «usat», а если я настрою его на использование llvm-gcc, он жалуется на недопустимую архитектуру «armv6». - person Hans Sjunnesson; 26.10.2008
comment
попробуйте gcc -O3 -march=armv6 test.c - person Nils Pipenbrinck; 26.10.2008
comment
разве llvm-gcc на самом деле не является компилятором, предназначенным для виртуальной машины llvm? - person artificialidiot; 26.10.2008
comment
да, но у llvm есть бэкенд генератора кода ARM, поэтому вы можете использовать его для компиляции реального кода, а также байт-кода llvm. - person Nils Pipenbrinck; 26.10.2008
comment
Это работает без проблем при компиляции с помощью цепочки инструментов. Я был бы рад услышать немного разглагольствований о полезном встроенном ассемблере! - person Max Stewart; 27.10.2008
comment
@Max Stewart Было бы здорово, если бы вы могли опубликовать ответ с подробным описанием того, как вы скомпилировали приведенный выше пример с помощью XCode. Я не слишком долго возился с ним, но я не заставил его работать должным образом. - person Hans Sjunnesson; 28.10.2008
comment
будьте в восторге, ребята, я кое-что напишу (в котором говорилось: если вы можете сказать мне, где вы хотите asnm и где вы сфокусированы на исследованиях, я могу адаптировать свой пост к вашим требованиям): - person Nils Pipenbrinck; 28.10.2008
comment
Эй, Ганс, на самом деле я разрабатываю с помощью открытой цепочки инструментов в Linux - у меня пока нет опыта работы с XCode, поэтому я действительно не знаю, с чего бы вы начали. - person Max Stewart; 29.10.2008

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

void foo(void) {
#if TARGET_CPU_ARM64
    __asm ("sub        sp, sp, #0x60");
    __asm ("str        x29, [sp, #0x50]");
#endif
}
person Kamil.S    schedule 27.05.2017

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

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

person catlan    schedule 30.10.2008
comment
На самом деле, как правило, использование набора инструкций Thumb значительно медленнее, чем использование набора инструкций ARM. Как правило (без каламбура), вы получаете 1/3 размера кода и теряете 1/3 скорости. См. например. arm.com/pdfs/Thumb-2CoreTechnologyWhitepaper-Final4.pdf - person gc.; 26.04.2009