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

14

我想开始编写ARM汇编代码并在iPhone上运行。

这不是为了在应用商店发布应用程序-基本上,我想使用ARM和iPhone解决 ProjectEuler 上的问题,只是出于兴趣和教育目的。

我该如何开始?我一直没有找到一种方法来使用任何手写的ARM代码运行项目。

4个回答

9
我找不到有关如何编写iPhone汇编代码的任何信息,但就像其他人在这里说的那样,你可以:
1)在C / C ++ / ObjC代码中编写内联汇编语句,或 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和Thumb-2快速参考卡(6页长),以及适用于您的确切CPU的两个完整文档。
例如,iPhone 3GS和iPhone 4都具有ARMv7-A Cortex-A8 CPU,因此您可以下载ARM架构参考手册ARMv7-A和ARMv7-R版(2000页长),该手册告诉您可用的指令以及它们的确切工作方式,以及Cortex™-A8技术参考手册,该手册解释了您特定CPU的指令时序等。

1
为什么你会推荐使用x86汇编器来编写ARM汇编代码? - WinterMute
1
是啊,我刚意识到NASM不支持ARM,它只支持x86!我对ARM汇编还比较新,不知道有没有一个好用的且免费的ARM汇编器,抱歉。 - Shervin Emami

6

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

你可能会对使用自定义Makefile感兴趣,但是Xcode项目对于大多数任务也应该足够了。


3
iPhone开发工具包含汇编器,无需单独获取。您可以在XCode项目中包含.s文件,它将“正常工作”。 - Stephen Canon

4
请注意,在应用商店提交应用时,包含汇编语言是没有问题的。他们反对使用非公共的框架。
只要二进制代码可以正常运行,外观还算不错,并遵循上述规则,他们就不会介意生成二进制代码的方式。

嗯,我认为他们确实关心它是如何生成的 - 应该是通过Xcode/Objective-C,但你可能可以用一些汇编语言来解决。 - Alex Brown
现在有很多可供选择的代码生成器,比如Adobe编译器或者Mono... 它不必使用XCode或Objective-C进行编译。 - Kendall Helmstetter Gelner

1

以下是如何将ARM汇编代码包含到Xcode项目中的快速说明,这在Xcode版本4.3及以下版本中经过测试。对于我的特定项目,我想定义一个以“decode_arm.s”命名的ASM代码函数。当在模拟器下运行时,我已经有了相同功能的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

使用Xcode 4.5 (clang 4)时,您现在需要包含-no-integrated-as命令行参数才能使此内联AT&T内联汇编正常工作。将其添加到.s目标“Target”->“Build Phases”。 - MoDJ
我还创建了这篇博客文章,为iOS下的ARM汇编执行时间提供了一个计时框架。请查看示例Xcode项目:http://www.modejong.com/blog/post10_arm_timing_framework/index.html - MoDJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接