Рабочий процесс для написания кода сборки 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
для arm и писать код в отдельных файлах. У вас не должно возникнуть проблем с последующим связыванием их с вашим проектом, но я бы посоветовал вам использовать код 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