关于在XCode for Simulator中编译的c:inline asm,但无法在Device上编译

inline asm compiled in XCode for Simulator but failed to compile for Device

我已经搜寻了很长时间,但仍然找不到解决方案。 我希望有人可以帮助我。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
static __inline__ int Bsf(uint32_t Operand) {
  int eax;
  asm __volatile__ (
   "bsfl %0, %0""\
\\t"

    :"=a" (eax)
    :"0" (Operand)
  );
  return eax;
}

static __inline__ int Bsr(uint32_t Operand) {
  int eax;
  asm __volatile__ (
   "bsrl %0, %0""\
\\t"

    :"=a" (eax)
    :"0" (Operand)
  );
  return eax;
}

static __inline__ uint64_t TimeStampCounter(void) {
  uint32_t eax, edx;
  asm __volatile__ (
   "rdtsc""\
\\t"

    :"=a" (eax),"=d" (edx)
    :
  );
  return MAKE_LONG_LONG(eax, edx);
}

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

狮子座


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

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

您需要获得Intel吗? 64和IA-32体系结构软件开发人员手册。 它们包含完整的指令集参考,可为您提供帮助。 甚至bsf / bsr指令的伪代码都在其中,并且可以轻松地转换为它们的C等价物:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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位值:

The processor monotonically increments the time-stamp counter MSR every clock cycle and resets it to 0 whenever the processor is reset.

您需要弄清楚为什么您的程序需要该信息,以及如何最好地将其转换为ARM情况。