我一直在谷歌搜索很长一段时间,但仍然找不到解决方案。我希望有人能帮助我。
我有三个内联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(用于iPhone)时失败了。我得到的信息是“asm中不可能的约束”。我相信问题是上面的汇编代码不适用于基于ARM的cpu。有人可以解释如何重新编写代码,以便为iPhone cpu编译吗?它可以是汇编代码,也可以是纯C代码。提前谢谢!
利奥
答案 0 :(得分:0)
您可以尝试使用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案例。