代码之家  ›  专栏  ›  技术社区  ›  Hans Sjunnesson

如何在iPhone上进行内嵌组装?

  •  28
  • Hans Sjunnesson  · 技术社区  · 16 年前

    怎么做到的?我需要采取哪些步骤,需要考虑哪些陷阱和陷阱?

    4 回复  |  直到 7 年前
        1
  •  19
  •   plinth    15 年前

    我已经开始工作了,多亏了 Apple Devforums 如果你是一个专门的iPhone开发者,你应该注册。

    第一件事是第一,它是 α-asM*() 不是平原 ASM-() .

    其次,默认情况下,xcode生成一个编译目标,根据ARM Thumb指令集编译内联程序集,因此 乌萨特 没有被认为是正确的指示。要解决此问题,请在目标上执行“获取信息”。向下滚动到“GCC4.0-代码生成”部分,取消选中“编译为拇指”。如果您将活动的SDK设置为“device”,那么下面的代码段将编译得很好。

    inline int asm_saturate_to_255 (int a) {
      int y;
      __asm__("usat %0, #8, %1\n\t" : "=r"(y) : "r"(a));
      return y;
    }
    

    当然,现在它不能与iPhone模拟器一起工作。但是 目标条件.h 定义了您可以定义的。即 目标iPhone 目标iPhone模拟器 .

        2
  •  11
  •   Nils Pipenbrinck    16 年前

    我写了很多ARMCortex-A8汇编代码。iPhone上的CPU是ARM11(Afaik),因此核心指令集是相同的。

    你到底在找什么?如果你愿意,我可以给你举几个例子。


    编辑:

    我刚发现在iPhone上你必须使用llvm gcc编译器。据我所知,它应该理解gcc中的内联汇编程序语法。如果是这样,所有ARM内嵌汇编程序教程也将在iPhone上工作。

    这里有一个非常小的内联汇编函数(在C中)。你能告诉我它是否能在iPhone上编译和工作吗?如果它有效的话,我可以咆哮一点,如何在ARM内联汇编程序中做有用的事情,特别是对于ARMV6体系结构和DSP扩展。

    inline int saturate_to_255 (int a)
    {
      int y;
      asm ("usat %0, #8, %1\n\t" : "=r"(y) : "r"(a));
      return y;
    }
    

    应等于:

    inline int saturate_to_255 (int a)
    {
      if (a < 0) a =0;
      if (a > 255) a = 255;
      return a;
    }
    
        3
  •  1
  •   Kamil.S    7 年前

    寄存器也可以在内联asm中显式使用。

    void foo(void) {
    #if TARGET_CPU_ARM64
        __asm ("sub        sp, sp, #0x60");
        __asm ("str        x29, [sp, #0x50]");
    #endif
    }
    
        4
  •  0
  •   catlan    16 年前

    对于不需要进行大浮动操作的应用,建议使用拇指。Thumb使代码的大小变小,并使代码执行更快。

    所以你应该只对3D游戏之类的应用程序关闭拇指…