【问题标题】:Workflow for writing ARM assembly code on the iphone在 iphone 上编写 ARM 汇编代码的工作流程
【发布时间】:2010-12-07 11:42:33
【问题描述】:

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

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

我该怎么做呢?我一直无法想出一种方法来使用任何手写的手臂来运行项目。

【问题讨论】:

    标签: iphone assembly arm


    【解决方案1】:

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

    您可能对使用自定义 Makefile 感兴趣,但 Xcode 项目也应该足以完成大部分任务。

    【讨论】:

    • iPhone 开发工具自带一个汇编器,无需单独出去找。您可以在 XCode 项目中包含 .s 文件,它会“正常工作”。
    【解决方案2】:

    所以,这里是关于如何将 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
    

    【讨论】:

    • 在 Xcode 4.5 (clang 4) 中,您现在需要包含 -no-integrated-as 命令行参数才能使这个内联 AT&T 内联 asm 工作。将其添加到 .s 目标“Target”->“Build Phases”
    • 我还创建了这篇博文,为 iOS 下的 ARM asm 执行时间提供了一个计时框架。请参阅modejong.com/blog/post10_arm_timing_framework/index.html 处的示例 Xcode 项目
    【解决方案3】:

    我还没有找到任何关于如何专门为 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 页长),它会准确地告诉您哪些指令可用以及它们是如何工作的, Cortex™-A8 Technical Reference Manual 解释了特定 CPU 的指令时序等。

    【讨论】:

    • 为什么推荐使用 x86 汇编器来编写 ARM 汇编?
    • 是的,实际上我刚刚意识到 NASM 不支持 ARM,它只支持 x86!我对 ARM 汇编还很陌生,所以我不知道有什么好的 ARM 汇编也是免费的,抱歉。
    【解决方案4】:

    还要注意,在应用商店提交中包含程序集并没有错。它只使用他们不喜欢的不公开的框架。

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

    【讨论】:

    • 嗯,我认为他们确实关心它是如何生成的——它应该是由 Xcode/objective-C 生成的,但你可能会使用一些 asm。
    • 它们现在允许许多替代代码生成器,例如 Adob​​e 编译器或单声道...它不必使用 XCode 或 Objective-C 进行编译。
    猜你喜欢
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多