在iphone上编写ARM汇编代码的工作流程

时间:2009-10-16 19:26:21

标签: iphone assembly arm

我想开始编写ARM汇编程序并在iPhone上运行它。

这不是为了在应用程序中使用以发布到应用程序商店 - 基本上我想使用ARM和iPhone解决ProjectEuler上的问题,仅用于业余爱好和教育目的。

我该怎么做呢?我无法想出办法让任何一个手写的手臂运行项目。

4 个答案:

答案 0 :(得分:9)

我无法找到有关如何专门为iPhone编写汇编代码的任何信息,但就像其他人在这里所说的那样,你可以:

1)在C / C ++ / ObjC代码中编写内联asm语句,或者 2)在'.s'文件中编写独立的汇编函数,然后将其添加到XCode源中,或者 3)为外部汇编程序(如NASM)编写独立的汇编函数。您在'.s'文件中编写汇编代码并使用NASM生成'.o'目标文件,并将目标文件与您在XCode中的项目链接。

因此,如果您只是尝试编写一些汇编指令,那么内联汇编程序将是最简单的方法,但如果您计划编写多个汇编函数,那么我建议使用独立的汇编文件。如果您计划使用宏编写许多汇编函数并希望跨平台兼容性等,那么我建议使用NASM将汇编代码编译为目标文件。因为我使用的是XCode gcc汇编程序,与NASM相比它非常缺乏。您可以http://www.nasm.us/

免费获得NASM

设置汇编程序环境后,需要学习如何编写ARM汇编代码!因为iPhone(以及许多其他便携式设备和智能手机)使用ARM指令集。在http://www.coranac.com/tonc/text/asm.htm处有一个非常好但很旧的ARM组装介绍。

在汇编编程方面,官方指令集参考手册通常是您要编写的所有内容的主要信息来源,因此您应该访问ARM网站并下载ARM and Thumb-2 Quick Reference Card(6页长)以及确切CPU的2个完整文档。

例如,iPhone 3GS和iPhone 4都有一个ARMv7-A Cortex-A8 CPU,因此您可以下载ARM Architecture Reference Manual ARMv7-A and ARMv7-R Edition(2000页长),它可以准确地告诉您哪些指令可用,以及它们究竟是如何使用的工作,以及解释特定CPU的指令时序等的Cortex™-A8 Technical Reference Manual

答案 1 :(得分:6)

您可以使用gcc通过__asm__制作asm内联,或者只为获取gnu as并在单独的文件中编写代码。稍后将它们链接到您的项目应该没有问题,但我建议您使用c / Objective-C代码来包装您的asm存根,因为在汇编程序中编写整个iPhone应用程序有点困难(您需要在ObjC运行时内部非常好。)

您可能对使用自定义Makefile感兴趣,但Xcode项目也应该足以满足大多数的需求。

答案 2 :(得分:4)

另请注意,在应用商店提交中包含程序集没有任何问题。它只使用他们不恭维的框架。

他们不关心二进制文件是如何生成的,只要它有效,看起来不错,并遵循上述规则。

答案 3 :(得分:1)

因此,这里有一个如何在Xcode项目中实际包含ARM asm代码的快速描述,这是在高达4.3的Xcode版本中测试的。对于我的特定项目,我想在ASM代码中定义一个用“decode_arm.s”这样的文件名保存的函数。我已经有一个在模拟器下运行时编译的相同函数的C实现,因此这里的条件cpp逻辑确保ARM ASM代码仅在实际编译器件时编译到项目中。

// 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
相关问题