当前位置:  开发笔记 > IOS > 正文

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

如何解决《如何在iPhone上进行内联汇编?》经验,为你挑选了2个好方法。

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



1> Hans Sjunnes..:

我已经得到了这个工作,感谢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_IPHONETARGET_IPHONE_SIMULATOR.


我认为你的意思是__asm __()而不是普通的asm().

2> Nils Pipenbr..:

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

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有