在XCode中为模拟器编译了内联asm,但未能为设备编译

在XCode中为模拟器编译了内联asm,但未能为设备编译,c,assembly,arm,port,intel,C,Assembly,Arm,Port,Intel,我在谷歌上搜索了很长时间,但仍然没有找到解决办法。我希望有人能在这方面帮助我 我有三个内联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(uint3

我在谷歌上搜索了很长时间,但仍然没有找到解决办法。我希望有人能在这方面帮助我

我有三个内联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。有人能解释一下如何重新编写代码以便为iphonecpu编译吗?它可以是汇编代码,也可以是纯C代码。提前谢谢


Leo

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

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

你需要得到那份工作。它们包含完整的指令集参考,可以帮助您解决问题。甚至
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;
}
intBSF(uint32\u t n){
{
int m;
对于(m=0;m<32;m++)
{
如果(n&(1=0;m--)
{

如果(n&(1)Carl,我会试试的。非常感谢你的帮助。我会试试你的代码,让你知道它是否有效。我想是时候学习一点汇编了。是的,你的代码工作得很好。谢谢。现在我得想办法替换“rdtsc”。我只是猜测一下,但是你发布的程序集是x86,iOS设备是基于ARM的,所以你可能需要编写ARM程序集来完成你想做的事情。@Dean。你完全正确,这实际上是我的问题。我如何为ARM cpu重新编写代码?你有什么想法吗?如果你能对我重新编写ARM程序集有所了解,我将不胜感激n无论是ARM汇编还是纯C代码。@user538220-您需要回答我两天前的问题-“您想做什么?”rdtsc指令在ARM上没有等效的指令,因此您需要向我们解释这些例程的用例以及它们的语义。
Bsf()
Bsr()
函数在C中实现起来很简单-
TimeStampCounter()
没有那么多(至少没有关于系统和问题的更多信息)@Carl.很抱歉没有回答你的问题,但我想我已经解释过了。我想把这些函数翻译成可以在ARM cpu上运行的代码。它可以是ARM汇编或C。如果你问这些函数是用来做什么的,我不太确定。我只是想把某人的代码移植到iOS系统中专家们,我想上面的函数解释得很清楚,而且很容易翻译成C或ARM汇编?如果你能为Bsf()和Bsr()写几行等效的C代码,这将非常感谢。@user538220-正确的解决方案是找出这些函数的用途,以及您正在移植的代码需要它们的原因。