Invalid Opcode - cmovlne
-
Das ist jetzt erstmal ein wenig theorethisch, aber vielleicht kann jemand damit ja ne praktische Lösung entwerfen.
Es müsste eigentlich funktionieren, wenn ein Exception-Handler installiert wird, der prüft ob der InvalidOpcode ein cmovCC ist, und dann diese Funktion "emuliert".
Ist zwar lahm könnte aber gehen, ansonsten bugreport senden, vielleicht tut euch da ein Entwickler den gefallen und jagt den Source nochmal durch den Compiler aber dann mit nem geringeren Befehlssatz.
Oder gibt es die Firma nicht mehr?
-
Original erstellt von kingruedi:
**http://x86.ddj.com/secrets/opcodes/cmov.htmvielleicht hilft dir das. Das solltest du aber patchen können**
die seite ist gut :p
-
Naja, patchen mach ich eigentlich nicht so gerne... wegen der rechtslage...
Ich hab mal getestet im inline assembler von vc++ diese Anweisung auszuführen. Kompiliert wird es ohne Probleme, nur beim Starten kommt wieder "ungültige Anweisung".
Es bleibt mir wohl nichts anderes übrig als auf ein Update zu warten.
-
Wieso? Du hast ja auch alles mit nop's ersetzt, ist doch auch patchen
Versuch's doch einfach mal.
-
Eine andere Idee für nen Patch wäre hinten an den original Code CMOVcc "Emulationen" anzuhängen, und dann die entsprechenden CMovccs durch calls zu ersetzen.
Ein CMovcc ist 3 byte groß, ich nehme an das wird kaum reichen.
In dem Fall, dass es nicht reich, müßtest du den Code gut analysieren, und hoffen, das nach jedem CMovcc die gleiche Operation folgt. Die könntest du dann mit in deine "Emulation" aufnehmen.Das "könnte" funktionieren, CMovccs haben sonst nämlich noch die Eigenschaft der Atomarität, die du nur mit viel aufwand "emulieren" könntest. Ich nehme jedoch an, dass sich darauf vorerst verzichten lassen könnte.
mfg
-bg-
-
Wenn es nicht zu viele cmov's gibt, könnte man für jeden auch seine eigene Routine schreiben (das wäre eine Lösung, wenn auf jeden cmov nicht die gleiche Anweisung folgt).
Wenn total kompliziert wird (es folgt nicht immer die gleiche Anweisung nach den cmov's und es gibt auch noch recht viele davon) könnte man ein Programm schreiben, dass dies automatisch macht. Nur die Frage ob hier der Aufwand nicht langsam unnötig hoch wird
-
Ich glaube das mit den exceptions funktioniert wohl noch am besten.
Bin gerade am erarbeiten einer Lösung.
Denn Code könnte mensch dann einfach hinten dran pflanzen und den Startvektor passend umbiegen (ala Virus), dann müsste es gehen.
Problematisch könnte es allerdings mit dem Stack-frame werden, aber ich glaube das krieg ich noch hin.mfg
-bg-
-
Okay. Bitte nicht weitererzählen:
Ich hab mir in der exe einfach eine Stelle gesucht, die ziemlich sicher nie ausgeführt wird. Da habe ich dann emulationscode reingeschrieben. Jeden cmovCC habe ich dann durch einen far call dorthin ersetzt. Das ging ganz gut weil nach jedem cmovCC dieselben Befehle standen.Nach ein paar dummen Fehlern (jaja, ret und retf) habe ich es geschafft:
Jetzt läuft das Spiel endlich!
-
Ist das eigentlich ein DOS Spiel?
-
Nein. Ein recht aktuelles Windowsspiel.
Es hat eine 2D-Isometrische Ansicht, vom Stil ungefähr wie "Die Sims". Damit keine falschen Vermutungen aufkommen: Die Sims mag ich nicht.