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

在iphone上编写ARM汇编代码的工作流,iphone,assembly,arm,Iphone,Assembly,Arm,我想开始编写ARM汇编程序并在iPhone上运行它 这并不是为了在将发布到应用商店的应用程序中使用,基本上我想解决使用ARM和iPhone的问题,只是出于爱好和教育目的 我该怎么做呢?我还没能想出一种方法让一个项目使用任何手写的arm运行。你可以使用gcc来制作带有\uuuuuasm\uuuuu的asm内联线,或者只需要获得gnu作为并在单独的文件中编写代码。稍后将它们链接到您的项目应该不会有问题,但我建议您使用c/Objective-c代码来包装asm存根,因为在assembler中编写整个i

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

这并不是为了在将发布到应用商店的应用程序中使用,基本上我想解决使用ARM和iPhone的问题,只是出于爱好和教育目的


我该怎么做呢?我还没能想出一种方法让一个项目使用任何手写的arm运行。

你可以使用gcc来制作带有
\uuuuuasm\uuuuu
的asm内联线,或者只需要获得gnu
作为
并在单独的文件中编写代码。稍后将它们链接到您的项目应该不会有问题,但我建议您使用c/Objective-c代码来包装asm存根,因为在assembler中编写整个iPhone应用程序有点困难(您需要非常熟悉ObjC运行时内部)


您可能对使用自定义Makefiles感兴趣,但是对于大多数TAK来说,Xcode项目也应该足够了。

请注意,在app store提交中包含程序集并没有什么错。它只使用他们不喜欢的非公共框架


他们不在乎二进制代码是如何生成的,只要它能正常工作,看起来还不错,并且遵循上述规则。

我还没有找到任何关于如何专门为iPhone编写汇编代码的信息,但正如其他人在这里所说的,您可以:

1) 用C/C++/ObjC代码编写内联asm语句,或 2) 在“.s”文件中编写独立的程序集函数,只需将其添加到XCode源中,或者 3) 为外部汇编程序(如NASM)编写独立的汇编函数。您可以在一个“.s”文件中编写汇编代码,并使用NASM生成一个“.o”对象文件,并在XCode中将该对象文件与您的项目链接起来

所以,如果您只是试图编写一些汇编指令,那么内联汇编程序将是最简单的方法,但是如果您计划编写几个汇编函数,那么我建议您使用一个独立的汇编文件。如果您计划用宏编写许多汇编函数,并希望实现跨平台兼容性等,那么我建议使用NASM将汇编代码编译成一个对象文件。因为我使用的是XCode gcc汇编程序,与NASM相比,它非常缺乏。您可以在以下位置免费获得NASM:

一旦您设置了汇编程序环境,您就需要学习如何编写ARM汇编代码!因为iPhone(以及许多其他便携式设备和智能手机)使用ARM指令集。有一个非常好的,但旧的介绍,以手臂大会在

当涉及到汇编编程时,官方的指令集参考手册通常是您将要编写的所有内容的主要信息源,因此您应该访问ARM网站,下载(6页长)以及2个完整的文档,以了解具体的CPU


例如,iPhone 3GS和iPhone 4都有一个ARMv7-A Cortex-A8 CPU,因此您可以下载(2000页长)来准确地告诉您哪些指令可用以及它们是如何工作的,以及解释特定CPU的指令计时等,下面是如何将ARM asm代码实际包含到Xcode项目中的快速描述,这在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

iphonedev工具包括一个汇编程序,无需单独购买。你可以在你的XCode项目中包含.s文件,它会“正常工作”。为什么你会推荐一个x86汇编程序来编写ARM汇编?是的,实际上我刚刚意识到NASM不支持ARM,它只支持x86!我对ARM汇编相当陌生,所以我不知道有哪个好的ARM汇编程序也是免费的,对不起。嗯,我想他们确实关心它是如何生成的——它应该是由Xcode/objective-C生成的,但你可能会得到一些asm。他们现在允许许多替代的代码生成器,比如Adobe编译器或mono。。。它不必使用XCode或Objective-C进行编译。对于XCode 4.5(clang 4),您现在需要包含-no integrated as命令行参数,此内联AT&T内联asm才能工作。将其添加到.s target“target”->“Build Phases”中,我还创建了这篇博客文章,为iOS下ARM asm的执行时间提供了一个计时框架。请参见位于的示例Xcode项目