这是轻量级加密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'
”
我搜索了它的原因并找到了一些数据,但没有得到如何解决这个问题。
是否有任何解决方案可以为编译器定义一些寄存器或某些特殊语法来纠正当前代码。某种方式,除了以另一种方式重写代码?
感谢您的帮助。
答案 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
也有效。