2017-06-04 55 views
0

这是轻量级加密PRESENT算法实现的一部分,针对速度,8位,由C实现,与通过内联汇编实现的算法的pLayer相关。如何解决C语言中内联汇编错误:'重新加载'asm'时无法在类'GENERAL_REGS'中找到寄存器

// ****************** 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

你的目标是什么架构? – duskwuff

+1

听起来像您要求的目标体系结构支持的寄存器数量更多。如果hw只支持(比如说)8个寄存器,那么编写一个需要16的asm语句将不起作用。至于如何解决它:使用更少的寄存器。如果不了解更多关于目标架构的信息,难以做出更具体的描述,但要将一些参数从“r”更改为“m”。 –

+0

@duskwuff其实我没有实现代码,也没有任何解释的指令。另外我对这些代码是新的,并且不知道如何改变当前的体系结构。 –

回答

0

如何解决在使用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。据Machine Constraints | Simple Constraintsg被描述为:

任何寄存器,存储器或整数立即数是允许的,除了 对于不是通用寄存器的寄存器。

有时rm也可以。

相关问题