如何在iPhone上进行内联汇编?

时间:2008-10-26 13:26:18

标签: iphone assembly inline-assembly

怎么做?我需要采取哪些步骤以及需要考虑哪些陷阱和陷阱?

4 个答案:

答案 0 :(得分:19)

我已经让这个工作了,感谢Apple Devforums的一些内部帮助,如果你是一位专注的iPhone开发人员,你应该注册。

首先,它是 __ asm __(),而不是普通的 asm()

其次,默认情况下,XCode会生成一个编译目标,该目标针对ARM Thumb指令集编译内联汇编,因此 usat 不会被识别为正确的指令。要解决此问题,请在目标上执行“获取信息”。向下滚动到“GCC 4.0 - 代码生成”部分,取消选中“Compile for Thumb”。如果您将Active 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模拟器。但 TargetConditionals.h 定义了你可以#ifdef。即 TARGET_OS_IPHONE TARGET_IPHONE_SIMULATOR

答案 1 :(得分:11)

我写了很多ARM Cortex-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;
}

答案 2 :(得分:1)

寄存器也可以在内联asm中明确使用

static synchrnozed

答案 3 :(得分:0)

建议将Thumb用于不需要大量浮动操作的应用程序。 Thumb使代码大小更小,从而加快代码执行速度。

所以你应该只为3D应用程序等应用程序关闭Thumb ...