在XCode for Simulator中编译的内联asm,但无法编译为Device

我一直在Google上搜索很长时间,但仍然找不到解决方案。 我希望有人能帮助我。

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

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

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

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

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

狮子座


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

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

您需要获得英特尔®64和IA-32架构软件开发人员手册。 它们包含一个完整的指令集引用,它可以帮助你。 即使伪代码为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案例。

链接地址: http://www.djcxy.com/p/59741.html

上一篇: inline asm compiled in XCode for Simulator but failed to compile for Device

下一篇: foreach loop not returning values from $