Рабочий процесс для написания кода сборки ARM на iphone

Я бы хотел начать писать ARM-ассемблер и запустить его на iPhone.

Это не с целью использования в приложении, которое должно быть выпущено в хранилище приложений. В основном я хотел бы решить проблемы на ProjectEuler используя ARM и iPhone, только для хобби и образовательных целей.

Как я могу это сделать? Я не смог придумать способ запустить проект, используя любую руку, написанную руками.

Ответы

Ответ 1

Мне не удалось найти какую-либо информацию о том, как писать код сборки специально для iPhone, но, как и другие люди, упомянутые здесь, вы можете:

1) записывать inline-операторы asm в коде C/С++/ObjC или 2) написать автономные функции сборки в файле .s 'и просто добавить его в свои источники XCode или 3) записывать автономные функции сборки для внешнего ассемблера, такого как NASM. Вы пишете код сборки в файле .s 'и создаете объектный файл'.o ', используя NASM, и связываете объектный файл с вашим проектом в XCode.

Итак, если вы просто пытаетесь написать несколько инструкций по сборке, тогда простой ассемблер был бы самым простым способом, но если вы планируете писать несколько функций сборки, я бы рекомендовал отдельный файл сборки. И если вы планируете писать многие функции сборки с помощью макросов и хотите совместимость между платформами и т.д., Я бы рекомендовал использовать NASM для компиляции вашего кода сборки в объектный файл. Потому что я использую ассемблер XCode gcc, и этого недостаточно, по сравнению с NASM. Вы можете бесплатно получить NASM на http://www.nasm.us/

Как только вы настроите свою ассемблерную среду, вам нужно научиться писать код сборки ARM! Поскольку iPhone (и многие другие портативные устройства и смартфоны) используют набор инструкций ARM. Существует очень хорошее, но старое введение в сборку ARM на http://www.coranac.com/tonc/text/asm.htm.

Когда речь заходит о программировании сборки, официальное руководство по набору инструкций обычно является основным источником информации для всего, что вы напишете, поэтому вы должны перейти на сайт ARM и загрузить Краткая справочная карта ARM и Thumb-2 (6 страниц), а также 2 полных документа для вашего точного процессора.

Например, у iPhone 3GS и iPhone 4 есть процессор ARMv7-A Cortex-A8, поэтому вы можете загрузить Справочное руководство по архитектуре ARM ARMv7-A и ARMv7-R Edition (2000 страниц в длину), которая сообщает вам, какие именно инструкции доступны и как они работают, и Cortex ™ -A8 Technical Справочное руководство, которое объясняет синхронизацию инструкций и т.д. Для вашего конкретного процессора.

Ответ 2

Вы можете использовать gcc, чтобы сделать asm inlines с __asm__, или просто получить gnu as для и писать код в отдельных файлах. У вас не должно возникнуть проблем с последующим связыванием их с вашим проектом, но я бы посоветовал вам использовать код c/ Objective-C для обертывания ваших заглушек asm, поскольку запись всего приложения iPhone в ассемблере несколько затруднена (вам нужно быть довольно хорош в внутренности среды выполнения ObjC).

Вам может быть интересно использовать пользовательские Makefiles, однако проекты Xcode должны быть достаточными для большинства таков тоже.

Ответ 3

Обратите также внимание на то, что нет ничего плохого в том, что в сборку приложений в сборке есть сборка. Он использует только фреймворки, которые не являются публичными, на которых они хмурят.

Им все равно, как создается двоичный файл, пока он работает, выглядит прилично и соответствует указанному выше правилу.

Ответ 4

Итак, вот краткое описание того, как на самом деле включить ARM asm-код в проект Xcode, это проверено в версиях Xcode до 4.3. Для моего конкретного проекта я хотел определить функцию в коде ASM, сохраненную с именем файла, например "decode_arm.s". У меня уже есть реализация C той же функции, которая компилируется при запуске под симулятором, поэтому условная логика cpp здесь гарантирует, что код ASM ARM компилируется только в проект при компиляции для устройства.

// This file implements the following C functions for the ARM platform.
// Both ARM6 and ARM7 devices are supported by this implementation.
//
// maxvid_decode_c4_sample16()

#if defined(__arm__)
# define COMPILE_ARM 1
# if defined(__thumb__)
#  define COMPILE_ARM_THUMB_ASM 1
# else
#  define COMPILE_ARM_ASM 1
# endif
#endif

#if defined(COMPILE_ARM)
# define USE_GENERATED_ARM_ASM 1
#endif // COMPILE_ARM

#if defined(USE_GENERATED_ARM_ASM)
    .section __TEXT,__text,regular
    .section __TEXT,__textcoal_nt,coalesced
    .section __TEXT,__const_coal,coalesced
    .section __TEXT,__picsymbolstub4,symbol_stubs,none,16
    .text
    .align 2
    .globl _maxvid_decode_c4_sample16
    .private_extern _maxvid_decode_c4_sample16
_maxvid_decode_c4_sample16:
    @ args = 0, pretend = 0, frame = 0
    @ frame_needed = 1, uses_anonymous_args = 0
    stmfd   sp!, {r4, r5, r6, r7, lr}
    add r7, sp, #12
    stmfd   sp!, {r8, r10, r11}

    (ASM CODE HERE)

    ldmfd   sp!, {r8, r10, r11}
    ldmfd   sp!, {r4, r5, r6, r7, pc}
    .subsections_via_symbols

#else
  // No-op when USE_GENERATED_ARM_ASM is not defined
#endif