如何解决C:';can';在类'中找不到寄存器;一般规则';重新加载时';asm&x27';

如何解决C:';can';在类'中找不到寄存器;一般规则';重新加载时';asm&x27';,c,algorithm,gcc,cryptography,inline-assembly,C,Algorithm,Gcc,Cryptography,Inline Assembly,这是轻量级加密现有算法实现的一部分,针对速度优化,8位,由C实现,与内联汇编实现的算法的播放器相关 // ****************** pLayer ****************************** asm volatile("clr %0 \n" "clr %1 \n" "clr %2

这是轻量级加密现有算法实现的一部分,针对速度优化,8位,由C实现,与内联汇编实现的算法的播放器相关

//  ****************** 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])      
        );
编译代码时发生以下错误: “
在重新加载“asm”时,在类“GENERAL\u REGS”中找不到寄存器

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

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

谢谢你的帮助

如何解决C中内联程序集中的错误:“重新加载“asm”时在类“GENERAL_REGS”中找不到寄存器”

以及:

我冒昧猜测一下,你的通用寄存器用完了

也许你可以在某些地方使用
g
而不是
r
。根据本发明,
g
被描述为:

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

有时候,
rm
也能起作用

如何解决C中内联程序集中的错误:“重新加载“asm”时在类“GENERAL_REGS”中找不到寄存器”

以及:

我冒昧猜测一下,你的通用寄存器用完了

也许你可以在某些地方使用
g
而不是
r
。根据本发明,
g
被描述为:

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


有时,
rm
也能工作。

您的目标架构是什么?听起来您要求的寄存器比目标架构支持的寄存器多。如果硬件只支持(比如)8个寄存器,那么编写需要16个寄存器的asm语句是行不通的。至于如何修复它:使用更少的寄存器。在不了解更多目标体系结构的情况下,很难说得更具体一些,但是我想到了将一些参数从“r”改为“m”。@Dashwuff事实上我没有实现代码,也没有任何说明要解释。此外,我对这些代码还不熟悉,不知道如何更改当前的体系结构。@DavidWohlferd谢谢。但我如何使用更少的寄存器?有没有办法改变编译的方式,让更多的寄存器得到?事实上,算法很复杂,我不能轻易更改这部分代码。将“r”改为“m”怎么可能?我有一些新的错误!当duskwuff和我询问体系结构时,我们试图弄清楚您是否在编译x86、x64、arm、ia64、vax等。因为(根据定义)asm是特定于体系结构的,这一点很重要。“我有一些新的错误!”如果有人向你寻求编程问题的帮助,而他们只是告诉你这些,你能帮助他们吗?或者你会问“什么错误?”你是在问别人帮你做asm,但没有说是谁的asm,你想让我们帮你纠正错误,但不告诉我们错误是什么。你不应该让人们很难帮助你。你的目标是什么体系结构?听起来你要求的寄存器比目标体系结构支持的要多。如果硬件只支持(比如)8个寄存器,那么编写需要16个寄存器的asm语句是行不通的。至于如何修复它:使用更少的寄存器。在不了解更多目标体系结构的情况下,很难说得更具体一些,但是我想到了将一些参数从“r”改为“m”。@Dashwuff事实上我没有实现代码,也没有任何说明要解释。此外,我对这些代码还不熟悉,不知道如何更改当前的体系结构。@DavidWohlferd谢谢。但我如何使用更少的寄存器?有没有办法改变编译的方式,让更多的寄存器得到?事实上,算法很复杂,我不能轻易更改这部分代码。将“r”改为“m”怎么可能?我有一些新的错误!当duskwuff和我询问体系结构时,我们试图弄清楚您是否在编译x86、x64、arm、ia64、vax等。因为(根据定义)asm是特定于体系结构的,这一点很重要。“我有一些新的错误!”如果有人向你寻求编程问题的帮助,而他们只是告诉你这些,你能帮助他们吗?或者你会问“什么错误?”你是在问别人帮你做asm,但没有说是谁的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])      
    );