J'ai écrit un compilateur lua minimal à des fins éducatives en traduisant le code lua en assembly inline en C avec gcc. Après un certain temps lorsque ma sortie générée a commencé à s'allonger avec plus d'opérandes pour les variables et les fonctions déclarées en C, cette erreur a commencé à se produire.Comment éviter l'erreur "plus de 30 opérandes dans 'asm'" avec inline assesmbly avec gcc
test.c: In function ‘int main()’:
test.c:100:6: error: more than 30 operands in ‘asm’
);
Lorsque googler la seule autre information que j'ai trouvé some gcc mailing list from 2008, mais ils ont dit qu'il n'y avait pas de solution à l'exception de gcc recompiler (que je ne suis pas intéressé). Le point ironique est que souvent je n'ai même pas 30 opérandes et j'ai toujours cette erreur!
Voici un exemple minimal (avec 19 opérandes, me donne encore cette erreur)
// Standard functions
void io_read(){}
void io_write(){}
void print(){}
int main(){
// Working vars decl
long _t0, _t1, _t2, _t3, _t4, _t5, _t6, _t7, _t8;
long factorial, i, n, x;
// Strings decl
const char* _s0 = "enter a number:";
const char* _s1 = "*number";
const char* _s2 = "factorial of ";
const char* _s3 = " is ";
asm("" // My inline asm code
: // Output symbols
[_s0] "+g" (_s0),
[_s1] "+g" (_s1),
[_s2] "+g" (_s2),
[_s3] "+g" (_s3),
[_t0] "+g" (_t0),
[_t1] "+g" (_t1),
[_t3] "+g" (_t3),
[_t4] "+g" (_t4),
[_t5] "+g" (_t5),
[_t6] "+g" (_t6),
[_t7] "+g" (_t7),
[_t8] "+g" (_t8),
[factorial] "+g" (factorial),
[i] "+g" (i),
[n] "+g" (n),
[x] "+g" (x)
: // Input symbols
[io_read] "r" (io_read),
[io_write] "r" (io_write),
[print] "r" (print)
: // Clobbers
"cc", "rax", "rbx", "rcx", "rdx"
);
}
Ma version gcc est 6.2.1 20.160.830
Merci à l'avance!
Réutilisez des variables ou créez des tables (tableaux) et utilisez des offsets dans ces tableaux pour obtenir des variables (insérées dans le code d'assemblage par votre compilateur). –
Envisager d'émettre un assemblage correct au lieu de l'assemblage en ligne. gcc a une limite de 30 opérandes pour l'assemblage en ligne et il n'est pas prévu de supprimer cette limite. – fuz
Ne pas générer du code C serait beaucoup plus facile et plus simple à déboguer? Et pourquoi ne générez-vous pas directement un fichier Assmbler? Pas d'infraction, mais cette étape intermédiaire C ressemble beaucoup à un non-sens pour moi. – Olaf