Ich habe einen minimalen Lua-Compiler für Bildungszwecke geschrieben, indem Sie den Lua-Code in Inline-Assembly in C mit gcc übersetzen.Wie man Fehler "mehr als 30 Operanden in 'asm'" mit Inline assembly mit gcc
Nach einer Weile, als meine generierte Ausgabe begann, mit mehr Operanden für deklarierte Variablen und Funktionen in C länger zu werden, begann dieser Fehler aufzutreten.
test.c: In function ‘int main()’:
test.c:100:6: error: more than 30 operands in ‘asm’
);
Wenn die einzige andere Infos googeln ich war some gcc mailing list from 2008 gefunden, aber sie sagte, dass es keine Korrekturen mit Ausnahme neu zu kompilieren gcc waren (was ich nicht interessiert bin).
Die ironische Sache ist, dass ich oft nicht einmal 30 Operanden habe und ich immer noch diesen Fehler bekomme!
Hier ist ein minimales Beispiel (mit 19 Operanden, mir nach wie vor, dass Fehler gibt)
// 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"
);
}
Meine gcc Version 6.2.1 20.160.830
Vielen Dank im Voraus!
Verwenden Sie Variablen entweder erneut, oder erstellen Sie Tabellen (Arrays), und verwenden Sie Offsets in diesen Arrays, um Variablen zu erhalten (die vom Compiler in den Assemblycode eingefügt werden). –
Ziehen Sie in Erwägung, eine ordnungsgemäße Montage anstelle einer Inline-Montage auszugeben. gcc hat ein Limit von 30 Operanden für die Inline-Assembly und es ist nicht geplant, dieses Limit zu entfernen. – fuz
Wäre das Generieren von C-Code nicht viel einfacher und einfacher zu debuggen? Und warum generieren Sie nicht direkt eine Assembler-Datei? Nichts für ungut, aber diese C-Zwischenstufe sieht für mich wie Unsinn aus. – Olaf