Hallo liebes Forum,
mein Schulprojekt ist nun etwas weiter vorangeschritten. Ich habe
mittlerweile den Kern des SnakeGame soweit fertig, zwar sind dort einige
wirklich seltsame Bugs drinne, aber das ist erstmal egal.
Da ich noch eine kleine grafische Menüführung eingeplant hatte, habe ich
mich zuerst mit dem ausgeben eines grafischen Textes befasst. Das
funktioniert auch überraschend gut, wie ich finde.
Das Problem welches ich nun habe ist, dass ich ein paar Fehler beim
Kompilieren bekomme und zwar 4x diesen hier:
1
"ccB6mnpQ.s|2153|Error: invalid use of register|"
Betreffende Zeile im Assembler Listing:
1
2153 lea rax, sP[rip]
Glücklicherweise lasse ich mir Assemblerlistings mitausgeben beim
Debuggen, sonst hätt ich die Problematik nie erkannt.
Was dieser Fehler bedeutet ist mir relativ klar(nach Recherche), würde
ich sagen, es bedeutet soviel wie:
Ich habe ein oder mehrere Prozessorregister benutzt, die eig. für andere
Sachen vorgesehen sind. Z.b. RIP(Index Pointer?)
Jedoch ist mir nicht klar, wie ich das beeinflussen soll mit meinem
C-Code.
In in der Datei SnakeSymbols.c - Funktion: SS_AddChar() - Ab Zeile: 419
befindet sich in der ellen langen Abfrage, 4 Auskommentierte Abfragen,
die, wenn ich diese normal nutzen will, zu diesem besagten Fehler
führen.
Hat jemand vielleicht eine Idee?
Konstruktive Kritik zum Code ansich, ist auch willkommen, solange die
nicht bösartig rüberkommt! :)
Vielen lieben Dank!!
Gruß Müller
P.S. Es ist für Windows gemcht.
P.P.S. Ich habe mal einige meiner Dateien angehängt.
P.P.P.S. Ich bin kein Profi, wir machen es zurzeit in der
Technikerschule, und müssen ein Projekt zum Ende des ersten Schuljahres
machen. Bitte keine Flamings über meinen Stil oder sonstiger Sachen.
Müller schrieb:> Ich habe ein oder mehrere Prozessorregister benutzt, die eig. für andere> Sachen vorgesehen sind.
Nein. Wenn Du in reinem C programmierst, dann benutzt Du selbst bzw.
Dein C-Code überhaupt keine Register. Das erledigt alles der Compiler.
Welchen Compiler in welcher Version verwendest Du?
Hier oder bei einem ähnlichen Konstrukt dürfte wohl der Fehler liegen.
Konnte es leider nicht herausfinden, da dein Code nicht wirklich
portabel ist.
Sind denn die ganzen intrinsics notwendig?
Möglicherweise sind die Flags für den Compiler/Assembler bezüglich der
Streaming SIMD Extensions nicht richtig gesetzt. Das könnte erklären,
dass der Code nicht korrekt übersetzt werden kann.
Aber wie Rufus schon sagte: Braucht man das SSE Geraffel hier überhaupt?
Ich würde das probeweise einfach mal auskommentieren und schauen ob es
so geht.
Hallo Zusammen,
vielen Dank für das Feedback.
Jedoch liegt der Fehler nicht darin, dass ich SSE Instruktionen
verwende, weil ich in meiner main.c nur die Funktionen meiner
SnakeSymbols.c nutze und nicht die der SnakeGame.c. Jedoch habe ich dort
alles ausgeklammert(auch die Includes) was mit den SSE Instruktionen zu
tuen.
Resultat ist der selbe Fehler.
Um nochmal ganz konkret zu werden, der Compiler meckert wegen diesem
Abschnitt(abgeleitet aus meinem Assembly-Listing)
SnakeSymbols.c - Zeile: 419
Dort kann man sehen, dass ich 4 Abfragen ausgeklammert habe. Wenn ich
die Ausklammerung weg mache, kommt der oben genannte Fehler. Wenn ich
alles normal lasse, sind es dementsprechend 4 dieser Fehler.
Der Grund warum ich im SnakeGame.c SSE Instruktionen verwende, ist
einfach nur weil ich testen wollte, ob man eine IF-Abfrage in SSE
nachbilden kann, was offensichtlich funktioniert, da ich in diesem Fall
auch 4 Abfragen in der IF-Abfrage habe, ist das in diesem Falle ja schon
super "Vectorized".
Ich hatte ja noch vor, die ganzen (x*y+z) Rechnungen in meinem Code,
mittels XOP(_mm_macc_epi32) nachzubilden und später zu "Vectorizieren".
Zum Glück hab ich das noch nicht gemacht, sonst hättet ihr mich
gehasst^^
Warum sollte man solche Instruktionen nicht verwenden, wenn Sie
vorhanden sind? Dafür sind die doch gemacht worden^^
Egal, zurück zum Thema. Jemand eine Idee woran es liegt? Ich habe im
Internet gelesen, dass das auch häufiger Compiler Bugs sind?!
Vielen lieben dank!
Gruß Müller
Hallo nochmal,
ich habe den Fehler behoben!!
Unglaublich aber war, ich denke es war definitiv ein Compiler-Bug!
Und zwar habe ich das Problem wie folgt gelöst(^^):
Ich habe einfach den Variablen Namen von den angemeckerten Symbolen
einfach geändert, in diesem Falle von "sP" -> "sPP".
Vielleicht war der Compiler irritiert und hat gedacht "sP" würde
stackpointer bedeuteten oder so.
Danke sehr an alle!!
Gruß Müller
Müller schrieb:> ich habe den Fehler behoben!!> Unglaublich aber war, ich denke es war definitiv ein Compiler-Bug!
Die Wahrscheinlichkeit dafür geht stark gegen 0%.
Müller schrieb:> Warum sollte man solche Instruktionen nicht verwenden, wenn Sie> vorhanden sind? Dafür sind die doch gemacht worden^^
Die sind dafür gemacht worden, um Programme, die Millionen von
Vektoroperationen pro Sekunde machen müssen, zu beschleunigen.
Die nutzt man daher eigentlich nur, wenn man durch sie auch tatsächlich
einen signifkanten Geschwindigkeitsgewinn hat.
Man geht ja auch nicht extra in einen Operationssaal und nimmt den
Chefarzt mit, um sich ein Pflaster auf den Finger zu kleben.
Ich würde die Symbole bzw. Zeiger darauf in ein Array packen und in
SS_AddChar einfach den Index ausrechnen (sign - 'A'). Damit wird aus der
ewigen if/else-Kette eine Zeile.
@Hans
Vielen Dank für den Hinweis. Hat super funktioniert.
Macht den Code auch etwas kürzer.
@Rolf
Du hast natürlich recht, aber wer würde nicht gern vom Chefarzt eine
Behandlung bekommen?^^
@Physiker
Dann erkläre mir woran es sonst liegt? Steht irgendwo dass ich z.B. den
Variablennamen "sP" nicht benutzen darf?
Anbei nochmal die aktuellste Variante.
Gruß
physiker schrieb:> Die Wahrscheinlichkeit dafür geht stark gegen 0%.
nee, je nach Verbreitung des Compilers, is das nicht so
unwahrscheinlich.
In Blackfin oder TriCore C-Compilern, hab ich auch schon Bugs gefunden
^^.
Nur is das ja normalerweise das Letzte, wo man einen Bug vermutet -
entsprechend lange heben die Suchen jeweils gedauert.