【问题标题】:inline asm compiled in XCode for Simulator but failed to compile for Device在 XCode for Simulator 中编译的内联 asm 但无法为 Device 编译
【发布时间】:2011-05-23 15:52:55
【问题描述】:

我已经在谷歌上搜索了很长时间,但仍然没有找到解决方案。我希望有人可以帮助我。

我有如下三个内联 asm 函数:

static __inline__ int Bsf(uint32_t Operand) {
  int eax;
  asm __volatile__ (
    "bsfl %0, %0" "\n\t"
    : "=a" (eax)
    : "0" (Operand)
  );
  return eax;
}

static __inline__ int Bsr(uint32_t Operand) {
  int eax;
  asm __volatile__ (
    "bsrl %0, %0" "\n\t"
    : "=a" (eax)
    : "0" (Operand)
  );
  return eax;
}

static __inline__ uint64_t TimeStampCounter(void) {
  uint32_t eax, edx;
  asm __volatile__ (
    "rdtsc" "\n\t"
    : "=a" (eax), "=d" (edx)
    :
  );
  return MAKE_LONG_LONG(eax, edx);
}

他们都在 XCode for Simulator 中成功编译,但是当我切换到为 Device - 4.1(for iPhone)构建时失败了。我得到的消息是“asm 中的不可能约束”。我相信问题是上面的汇编代码不适用于基于 ARM 的 cpu。有人可以阐明如何重新编写代码以便为 iPhone cpu 编译吗?它可以是汇编代码或纯 C 代码。提前致谢!

狮子座

【问题讨论】:

  • 只是猜测,但您发布的程序集是 x86 并且 iOS 设备是基于 ARM 的,因此您可能需要编写 ARM 程序集来执行您想要的操作。
  • @Dean。你是绝对正确的,这实际上是我的问题。如何重新编写 ARM cpu 的代码?你有什么主意吗?如果您能阐明用 ARM 程序集或纯 C 代码重写它,那将不胜感激。
  • @user538220 - 你需要回答我两天前的问题 - “你想做什么?” rdtsc 指令在 ARM 上没有等效指令,因此您需要向我们解释这些例程的用例以及您希望它们的语义是什么。 Bsf()Bsr() 函数在 C 中实现起来很简单 - TimeStampCounter() 没有那么多(至少没有关于系统和您遇到的问题的更多信息)。
  • @Carl。很抱歉没有回答你的问题,但我想我已经解释过了。我想把这些函数翻译成可以在 ARM cpu 上运行的代码。它可以是 ARM 程序集或 C。如果您要问这些函数的用途,我不太确定是否诚实。我只是想将某人的代码迁移到 iOS 系统中。对于汇编专家,我猜上面的函数解释得很清楚,而且很容易被翻译成C或ARM汇编?如果您可以为 Bsf() 和 Bsr() 写几行等效的 C 代码,将不胜感激。
  • @user538220 - 正确的解决方案是弄清楚这些函数的用途以及为什么要移植的代码需要它们。

标签: c assembly arm port intel


【解决方案1】:

您可以尝试使用 ARM clz 指令来替换 bsr。我不知道其他两个有什么好的替代品。

编辑:OP 澄清了一些上下文。

您需要获取Intel® 64 and IA-32 Architectures Software Developer's Manuals。它们包含完整的指令集参考,可以帮助您。甚至bsf/bsr 指令的伪代码也在其中,并且可以很容易地翻译成它们的 C 等价物:

int Bsf(uint32_t n) {
{
    int m;

    for (m = 0; m < 32; m++)
    {
        if (n & (1 << m))
            return m;
    }

    return 32;
}

int Bsr(uint32_t n) {
{
    int m;

    for (m = 31; m >= 0; m--)
    {
        if (n & (1 << m))
            return m;
    }

    return 32;
}

rdtsc 指令读取处理器的时间戳计数器,该计数器是每个时钟周期递增的 64 位值:

处理器在每个时钟周期单调递增时间戳计数器 MSR,并在处理器重置时将其重置为 0。

您需要弄清楚为什么您的程序需要这些信息,以及如何最好地将其转化为您的 ARM 案例。

【讨论】:

  • 谢谢卡尔。我会试试的。
  • 非常感谢您的帮助。我将尝试使用您的代码,并让您知道它是否有效。我想是时候学习一点组装了。 :)
  • 是的,您的代码运行良好。谢谢。现在我得想办法替换“rdtsc”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多