如何解决 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 Constraints,g
描述为:
Any register, memory or immediate integer operand is allowed, except
for registers that are not general registers.
有时 rm
也有效。
这是轻量级密码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 Constraints,g
描述为:
Any register, memory or immediate integer operand is allowed, except for registers that are not general registers.
有时 rm
也有效。