【发布时间】: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 - 正确的解决方案是弄清楚这些函数的用途以及为什么要移植的代码需要它们。