ошибка: не удается найти регистр в классе "GENERAL_REGS" при перезагрузке "asm" - PullRequest
2 голосов
/ 26 ноября 2011
__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)

);

Я получаю:

ошибка: не удается найти регистр в классе "GENERAL_REGS" при перезагрузке ошибки "asm": операнд "asm" имеет невозможные ограничения

1 Ответ

3 голосов
/ 26 ноября 2011

Вы должны помнить, что эти машины имеют ограниченное количество регистров.И на самом деле его можно исчерпать - вот о чем вы получаете сообщение об ошибке.

На x86 существует только 8 регистров общего назначения.esp зарезервировано для указателя стека.ebp вероятно используется в качестве базового указателя.Таким образом, остается только 6.

Однако ваш фрагмент встроенной сборки, по-видимому, требует 7 регистров?Их у вас недостаточно.

Таким образом, решение состоит в том, что вам нужно будет использовать меньше регистров.Поместите некоторые параметры в память или измените алгоритм ...

...