Für dieses Forum muß Javascript im Browser aktiviert werden!
Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C2 Quellcode formatieren: <code>Quellcode</code> ASM Quellcode formatieren: <asm>Quellcode</asm> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! > Hallo Thomas, > > > Wenn die VM einen Long oder Float auf dem Stack hat, muss sie das doch wissen? Sonst kein korrekter "pop" und damit > > keine korrekter "return", oder? Oder wird bei einem einfachen Ausdruck / Literal, egal ob long oder float > > nur ein Wort (die unteren 16 Bit) übergeben. Dann wäre die VM / das OS bereits zu spät, um den > > Fehler zu fixen. Wie schaut der VM-Code für einen einfachen Ausdruck aus? > > Ich hab' mit einmal den VM-Code genauer angesehen: > Bsp: > <code>long x; > thread main > { > if x quit 2; > }</code> > Dies erzeugt foglenden VM-Code: > <code>141 20 26 133 2 580 1 132 65527 65535 65535 65535 65535 65535 65535 65535</code> > Für die, die den VM-Code so nicht lesen können: > 141 20: VM_LOAD_FLOAT = Lade Float an Adresse 20 in den Stack > 26 : VM_CAST_LONG_TO_INT = Mache aus dem Float im Stack einen Integer ! > 133 2: VM_BRANCH_IF_ZERO = Springe, wenn letzter Stackeintrag 0 ist, zwei Words weiter > 580 = 0x244: VM_LOAD_IMMEDIATE_BYTE = Lade Bytewert "2" auf den Stack > 1 : VM_QUIT = Führe Quit aus > 132 65527: VM_BRANCH = Springe 8 Words zurück (Thread-Schleife) > > Man sieht also, daß der Compiler die IF-Anweisung von selbst auf Integer kürzt. > Also kommt es nicht zu einem Stackfehler. > > Jedoch ist der Compiler hier etwas unglücklich geschrieben. > Man hätte statt einem einfachen <code>VM_CAST_LONG_TO_INT</code> bei allen > Datentypen größer Integer automatisch bei ein <code><Bedingung> != 0</code> einfügen können. > > Tja, aber das hilft jetzt nichts, da der Compiler in dieser Hinsicht nicht gepatcht werden kann. > Also muß man sich hier diese Schreibweise angewöhnen. > Denn auch die VMC-Datei per Hand(oder Tool) nachzubearbeiten, bringt auch nichts, da das > Konstrukt mit Prüfung auf ungleich 0 ein VM-Code mehr benötigt. > Das einzige, was ginge, wäre eine des OS, damit VM_BRANCH_IF_ZERO einen zusätzlichen > Parameter bekommt, und gleichzeitig ein Tool, welches aus der Folge "26 133" (0x1A, 0x85) > z.B. diese Folge macht: 0 389 (0x0=NOP, 0x185 = Paramter 1 zusätzlich zu 0x85) > > Die nächste Möglichkeit wäre natürlich dies rein OS-seitig zu lösen. > Dies ginge, indem bei <code>VM_CAST_LONG_TO_INT</code> das folgende Word auch gelesen wird, > ohne den Datenzeiger zu verändern, und, sobald das folgende Word den Wert 133 hat, > werden bei <code>VM_CAST_LONG_TO_INT</code> eben nicht einfach die oberen 16 Bit > abgeschnitten, sondern eine Oder-Verknüpfung zwischen Hi-Word und Lo-Word gemacht. > Mal sehen, ob ich dies in OSOPT V3.1 irgendwie implementieren kann. > > Aber, ob sich der Aufwand lohnt ? > > MfG André H.