错误:重新加载'asm'时无法在类'GENERAL_REGS'中找到寄存器

时间:2011-11-26 02:30:34

标签: c inline-assembly

__asm__ (       
    "loop:\n\t"
    "movl   $1,%3\n\t"
    "movl   $0, %6\n"
    "start:\n\t"

    "movl   (%1,%3,4),%4\n\t"       
    "movl   -4(%1, %3, 4), %5\n\t"  
    "cmpl   %4, %5\n\t"         
    "jle    next\n\t"

    "xchgl  %4, %5\n\t"     
    "movl   %4, (%1, %3, 4)\n\t"    
    "movl   %5, -4(%1, %3, 4)\n\t"  
    "movl   $1, %6\n"

    "next:\n\t"
    "incl   %3\n\t" 

    "cmpl   %3, %2\n\t" 
    "jge    start\n\t"  

    "cmpl   $0, %6\n\t"
    "je end\n\t"

    "jmp    loop\n" 
    "end:    \n\t"


:"=r"(input_array)
:"r"(input_array), "r"(size-1), "r"(1), "r"(0), "r"(0), "r"(0)

);

我明白了:

  

错误:在重新加载'asm'错误时找不到类'GENERAL_REGS'中的寄存器:'asm'操作数有不可能的约束

1 个答案:

答案 0 :(得分:3)

您必须记住,这些机器的寄存器数量有限。它实际上可能耗尽 - 这就是你所得到的错误告诉你的。

在x86上,只有8个通用寄存器。 esp保留给堆栈指针。 ebp可能被用作基指针。所以只剩下6个。

但是,您的内联汇编代码段似乎需要7个寄存器?你没有足够的。

因此解决方案是您需要使用更少的寄存器。将一些参数放入内存或更改算法......