如何解决 C 中内联汇编的错误:“在重新加载 'asm' 时无法在 class 'GENERAL_REGS' 中找到寄存器”

how to solve error in inline assembly in C: 'can't find a register in class 'GENERAL_REGS' while reloading 'asm''

这是轻量级密码PRESENT算法实现的一部分,速度优化,8位,C实现,与内联汇编实现的算法的pLayer相关。

//  ****************** pLayer ******************************
        asm volatile("clr %0                \n"
                     "clr %1                \n"
                     "clr %2                \n"
                     "clr %3                \n"
                     "clr %4                \n"
                     "clr %5                \n"
                     "clr %6                \n"
                     "clr %7                \n"
                     "sbrc %8,0             \n"
                     "sbr  %0,1             \n"
                     "sbrc %8,1             \n"
                     "sbr  %2,1             \n"
                     "sbrc %8,2             \n"
                     "sbr  %4,1             \n"
                     "sbrc %8,3             \n"
                     "sbr  %6,1             \n"
                     "sbrc %8,4             \n"
                     "sbr  %0,2             \n"
                     "sbrc %8,5             \n"
                     "sbr  %2,2             \n"
                     "sbrc %8,6             \n"
                     "sbr  %4,2             \n"
                     "sbrc %8,7             \n"
                     "sbr  %6,2             \n"

                     "sbrc %9,0             \n"
                     "sbr  %0,4             \n"
                     "sbrc %9,1             \n"
                     "sbr  %2,4             \n"
                     "sbrc %9,2             \n"
                     "sbr  %4,4             \n"
                     "sbrc %9,3             \n"
                     "sbr  %6,4             \n"
                     "sbrc %9,4             \n"
                     "sbr  %0,8             \n"
                     "sbrc %9,5             \n"
                     "sbr  %2,8             \n"
                     "sbrc %9,6             \n"
                     "sbr  %4,8             \n"
                     "sbrc %9,7             \n"
                     "sbr  %6,8             \n"

                     "sbrc %10,0            \n"
                     "sbr  %0,16            \n"
                     "sbrc %10,1            \n"
                     "sbr  %2,16            \n"
                     "sbrc %10,2            \n"
                     "sbr  %4,16            \n"
                     "sbrc %10,3            \n"
                     "sbr  %6,16            \n"
                     "sbrc %10,4            \n"
                     "sbr  %0,32            \n"
                     "sbrc %10,5            \n"
                     "sbr  %2,32            \n"
                     "sbrc %10,6            \n"
                     "sbr  %4,32            \n"
                     "sbrc %10,7            \n"
                     "sbr  %6,32            \n"

                     "sbrc %11,0            \n"
                     "sbr  %0,64            \n"
                     "sbrc %11,1            \n"
                     "sbr  %2,64            \n"
                     "sbrc %11,2            \n"
                     "sbr  %4,64            \n"
                     "sbrc %11,3            \n"
                     "sbr  %6,64            \n"
                     "sbrc %11,4            \n"
                     "sbr  %0,128           \n"
                     "sbrc %11,5            \n"
                     "sbr  %2,128           \n"
                     "sbrc %11,6            \n"
                     "sbr  %4,128           \n"
                     "sbrc %11,7            \n"
                     "sbr  %6,128           \n"

                     "sbrc %12,0            \n"
                     "sbr  %1,1             \n"
                     "sbrc %12,1            \n"
                     "sbr  %3,1             \n"
                     "sbrc %12,2            \n"
                     "sbr  %5,1             \n"
                     "sbrc %12,3            \n"
                     "sbr  %7,1             \n"
                     "sbrc %12,4            \n"
                     "sbr  %1,2             \n"
                     "sbrc %12,5            \n"
                     "sbr  %3,2             \n"
                     "sbrc %12,6            \n"
                     "sbr  %5,2             \n"
                     "sbrc %12,7            \n"
                     "sbr  %7,2             \n"

                     "sbrc %13,0            \n"
                     "sbr  %1,4             \n"
                     "sbrc %13,1            \n"
                     "sbr  %3,4             \n"
                     "sbrc %13,2            \n"
                     "sbr  %5,4             \n"
                     "sbrc %13,3            \n"
                     "sbr  %7,4             \n"
                     "sbrc %13,4            \n"
                     "sbr  %1,8             \n"
                     "sbrc %13,5            \n"
                     "sbr  %3,8             \n"
                     "sbrc %13,6            \n"
                     "sbr  %5,8             \n"
                     "sbrc %13,7            \n"
                     "sbr  %7,8             \n"

                     "sbrc %14,0            \n"
                     "sbr  %1,16            \n"
                     "sbrc %14,1            \n"
                     "sbr  %3,16            \n"
                     "sbrc %14,2            \n"
                     "sbr  %5,16            \n"
                     "sbrc %14,3            \n"
                     "sbr  %7,16            \n"
                     "sbrc %14,4            \n"
                     "sbr  %1,32            \n"
                     "sbrc %14,5            \n"
                     "sbr  %3,32            \n"
                     "sbrc %14,6            \n"
                     "sbr  %5,32            \n"
                     "sbrc %14,7            \n"
                     "sbr  %7,32            \n"

                     "sbrc %15,0            \n"
                     "sbr  %1,64            \n"
                     "sbrc %15,1            \n"
                     "sbr  %3,64            \n"
                     "sbrc %15,2            \n"
                     "sbr  %5,64            \n"
                     "sbrc %15,3            \n"
                     "sbr  %7,64            \n"
                     "sbrc %15,4            \n"
                     "sbr  %1,128           \n"
                     "sbrc %15,5            \n"
                     "sbr  %3,128           \n"
                     "sbrc %15,6            \n"
                     "sbr  %5,128           \n"
                     "sbrc %15,7            \n"
                     "sbr  %7,128           \n"

                    :"=&r"  (temp_pLayer[0]),"=&r"  (temp_pLayer[1]),"=&r"  (temp_pLayer[2]),"=&r"  (temp_pLayer[3]),"=&r"  (temp_pLayer[4]),"=&r"  (temp_pLayer[5]),"=&r"  (temp_pLayer[6]),"=&r"  (temp_pLayer[7])
                    :"r"    (state[0]),"r"  (state[1]),"r"  (state[2]),"r"  (state[3]),"r"  (state[4]),"r"  (state[5]),"r"  (state[6]),"r"  (state[7])      
        );

在编译代码时出现这个错误: “can't find a register in class 'GENERAL_REGS' while reloading 'asm'

我查了一下原因,也查了一些资料,但是没有找到解决方法。

是否有任何解决方案可以为编译器定义一些寄存器或一些特殊语法来更正当前代码。除了以另一种方式重写代码之外,还有其他方法吗?

感谢您的帮助。

how to solve error in inline assembly in C: 'can't find a register in class 'GENERAL_REGS' while reloading 'asm''

并且:

asm volatile("clr %0                \n"
             "clr %1                \n"
             "clr %2                \n"
             ...
         :"=&r"  (temp_pLayer[0]),"=&r"  (temp_pLayer[1]),"=&r"  (temp_pLayer[2]),"=&r"  (temp_pLayer[3]),
          "=&r"  (temp_pLayer[4]),"=&r"  (temp_pLayer[5]),"=&r"  (temp_pLayer[6]),"=&r"  (temp_pLayer[7])
         :"r"    (state[0]),"r"  (state[1]),"r"  (state[2]),"r"  (state[3]),
          "r"  (state[4]),"r"  (state[5]),"r"  (state[6]),"r"  (state[7])      
    );

我要大胆猜测一下,你 运行 不在通用寄存器中。

也许您可以在某些地方使用 g 而不是 r。根据Machine Constraints | Simple Constraintsg描述为:

Any register, memory or immediate integer operand is allowed, except for registers that are not general registers.

有时 rm 也有效。