【问题标题】:How do I use the ARM assembler in XCode?如何在 XCode 中使用 ARM 汇编程序?
【发布时间】:2014-01-28 15:56:14
【问题描述】:

仅出于教育目的,我想在现有的 iPhone 应用程序中添加一个功能,用 ARM 程序集编写。一般来说,我不需要关于 ARM 汇编的教程,因为我已经读过太多了。我只是不知道如何实际运行代码!

我想做的是这样的:

无用的.h:

void useless();

无用的.s:

useless:
      bx lr

如果这也适用于模拟器,那就没问题了...在模拟器上,.s 文件将无法编译,所以我可能应该执行以下操作:

无用的.s:

#if I_AM_ARM
useless:
      bx lr
#endif

无用的.c:

#if !I_AM_ARM
void useless()
{
}
#endif

我知道我使用的语法被破坏了,但是我该如何正确地编写它呢? (仅仅因为我想尝试一些内联汇编就破坏模拟器上的应用程序是没有选择的......)

第二好的选择是使用内联汇编,但我更喜欢非内联汇编。

谢谢!

编辑:我想学习ARM汇编,所以我想找到一种方法来编译ARM汇编代码,并执行ARM汇编代码。

【问题讨论】:

  • 声明void useless(); 是正确的。 AFAIK 模拟器编译为本机代码而不是模拟 ARM,所以是的 asm 不会在那里工作。
  • 如果使用优化编译器,void useless() {} 很可能无论如何都会编译成bx lr
  • @Notlikethat:你是对的。
  • @tangrs:你也是对的。
  • 但是,大家好...我想执行 ARM 汇编代码,因为我想学习 ARM 汇编。应该不会那么难吧?如果我没有编译器来构建我的代码并且我没有一个平台来运行代码,我就无法学习 ARM 汇编。

标签: ios xcode assembly arm


【解决方案1】:

我终于自己找到了答案。其实没那么难。不过我只解决了 32 位 ARM 版本的问题。

无用的.h:

void useless();

无用的.s:

#ifdef __arm__


    .syntax        unified
    .globl         _useless
    .align         2
    .code          16
    .thumb_func    _useless

_useless:
    //.cfi_startproc
    bx    lr
    //.cfi_endproc

// CFI means Call Frame Information
// Optionally. Use for better debug-ability.


#endif

无用的.c:

#ifndef __arm__

void useless()
{
}

#endif

注意事项:

CLANG ARM 汇编器语法与您在网络上看到的示例有点不同。还支持以///* multiline comments */ 开头的评论。它还理解标准 C 预处理器。该函数必须定义为 Thumb 函数,如果您指定 arm 函数 (.code 32),程序将崩溃。可以省略.thumb_func _useless 行,它仍然可以工作。我不知道这意味着什么。如果省略.code 16 行,程序会崩溃。

关于#ifdef。对于 ARMv7,定义了 __arm__。对于 ARMv8,即 iPhone 5S 上的 64 位变体,未定义 __arm__,而是定义了 __arm64__。上述代码不适用于 64 位 ARM 版本。相反,将使用来自useless.c 的实现。 (我没有忘记 ARMv7s,我只是目前手上没有那个拱形的设备,所以我无法测试。)

【讨论】:

  • 使用 .thumb_func 将函数标记为拇指代码是其正常工作所必需的(至少在 Xcode 6 中)。
【解决方案2】:

模拟器不使用arm。如果你想让它在模拟器上运行,你必须编写 x86_64 程序集。 (可能)。

【讨论】:

  • 我知道。我想为 iPhone 编写 ARM 汇编程序,为模拟器编写一个纯 C 版本。我只想编译和执行任何 ARM 代码。
  • 来吧伙计们。真的没有人在 iPhone 上使用过 ARM 组件吗??
  • 您是否在寻找表示 arm64 的预编译器标志?如果是这样,您可以使用 __LP64__
【解决方案3】:

最好的学习方法是查看实际的工作示例,请参阅我关于 ARM iOS timing 的博客文章。这个示例 Xcode 项目展示了如何混合函数的 ARM ASM 和 C 实现。还有一个非常精确的计时模块可以让你的代码运行 N 次,因为精确计时是优化代码的难点。

【讨论】:

    【解决方案4】:

    您可以使用 QEmu 模拟 ARM-Ubuntu(它有一些 Windows 端口,例如 http://lassauge.free.fr/qemu/ )。如果你在 Windows 上,你可能需要在中间模拟 x86_64-Ubuntu。要创建 ARM 映像,您可以按照以下问题中的步骤操作:Black screen in QEmu for ARM-Ubuntu (how to get GUI?)(是的,不幸的是,这些步骤没有 GUI,只是 ARM-Ubuntu 机器的控制台,您必须从 Ubuntu 执行这些步骤) .然后您可以将您的 C++/C/Assembly 程序从 Windows/Ubuntu 主机交叉编译到 ARM-Ubuntu 目标。

    clang++.exe -Wall test1.cpp -o test1exe -std=c++14 -Ipath-to-arm-linaro/arm-linux-gnueabihf/include/c++/5.3.1 -Ipath-to-arm-linaro/arm-linux-gnueabihf/include/c++/5.3.1/arm-linux-gnueabihf -ffunction-sections -fdata-sections --sysroot=path-to-arm-linaro/arm-linux-gnueabihf/libc --target=arm-unknown-linux-gnueabihf -Bpath-to-arm-linaro/arm-linux-gnueabihf/bin/
    

    对于交叉编译,您需要下载并推出一个工具链,例如gcc-linaro-5.3-2016.02-i686-mingw32_arm-linux-gnueabihf.tar.xz (Windows/MinGW) 来自 https://releases.linaro.org/components/toolchain/binaries/latest-5/arm-linux-gnueabihf/ 并将上述命令中的“path-to-arm-linaro”替换为工具链的路径。

    【讨论】:

      【解决方案5】:

      我刚开始使用 iOS。我尝试做的第一件事是将 asm 代码添加到我的项目中并遇到了同样的问题。静态数据在 64 位模式下的处理方式略有不同。我通过查看编译器的汇编器输出发现了如何做到这一点。同一个 .S 文件在 Xcode 中会同时编译为 32 位和 64 位,所以准备如下:

              .globl         _myfunction
              .align         2
      
              my_constant_data:
                    .byte 0,1,2,3,4,5,6,7
      
          #ifdef __arm__
              .thumb_func    _myfunction 
              .syntax        unified
              .code          16
      
          //
          // call from C as my myfunction()
          //
          _myfunction:
             ldr r0,=my_constant_data
      
          < write your thumb-2 code here >
             bx lr
      
          #else // or you can use #ifdef __arm64__
          //
          // Call from C as myfunction()
          //
          _myfunction:
             adrp x0, my_constant_data@PAGE
             add x0,x0, my_constant_data@PAGEOFF
      
          < write your Armv8 code here >
             ret
      
          #endif
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多