2017-06-04 3 views
0

Ceci fait partie de l'implémentation de l'algorithme de cryptographie légère PRESENT, optimisé pour la vitesse, 8 bits, implémenté par C, lié à pLayer de l'algorithme implémenté par l'assemblage en ligne.comment résoudre une erreur dans l'assemblage en ligne dans C: 'impossible de trouver un registre en classe' GENERAL_REGS 'lors du rechargement' asm '

// ****************** 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])  
     ); 

dans la compilation du code de cette erreur: « can't find a register in class 'GENERAL_REGS' while reloading 'asm' »

je cherchais à ce sujet et la raison et trouvé des données, mais n'a pas obtenu la façon de résoudre ce problème.

Existe-t-il une solution pour définir certains registres pour le compilateur ou une syntaxe particulière pour corriger le code actuel? d'une certaine façon, sauf réécrire le code d'une autre manière?

merci pour votre aide.

+1

Quelle architecture ciblez-vous? – duskwuff

+1

Il semble que vous demandiez plus de registres que l'architecture cible ne le permet. Si le hw ne supporte que (disons) 8 registres, écrire une instruction asm qui nécessite 16 ne fonctionnera pas. Comme pour la réparer: Utilisez moins de registres. Difficile d'être plus précis sans en savoir plus sur l'architecture de votre cible, mais en changeant certains paramètres de "r" à "m". –

+0

@duskwuff en fait je n'ai pas implémenté le code et il n'avait aucune instruction à expliquer. en plus je suis nouveau sur ces codes et je ne sais pas comment changer l'architecture actuelle. –

Répondre

0

comment résoudre l'erreur dans l'assemblage en ligne dans C: 'ne peut pas trouver un registre dans la classe 'GENERAL_REGS' en rechargeant 'asm''

Et:

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])  
    ); 

I Je vais hasarder une supposition et dire que vous avez manqué de registres à usage général.

Peut-être que vous pouvez utiliser g plutôt que r dans certains endroits. Selon Machine Constraints | Simple Constraints, g est décrit comme:

Tout registre, la mémoire ou opérande entier immédiat est autorisé, à l'exception des registres qui ne sont pas des registres généraux.

Parfois, le rm fonctionne également.