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

时间:2017-06-04 22:34:03

标签: c algorithm gcc cryptography inline-assembly

这是轻量级加密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'

我搜索了它的原因并找到了一些数据,但没有得到如何解决这个问题。

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

  

如何在C中解决内联汇编中的错误:'无法在班级' GENERAL_REGS'中找到一个寄存器在重新加载' 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。根据{{​​3}},g被描述为:

  

允许使用任何寄存器,内存或立即整数操作数,但   对于非通用寄存器的寄存器。

有时rm也有效。