Re: if-Abfrage bei Datentyp long Kategorie: Programmierung (von André H. - 19.11.2004 11:41) | ||
Als Antwort auf Re: if-Abfrage bei Datentyp long von Thomas - 11.11.2004 23:57 | ||
| ||
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: long x; thread main { if x quit 2; } Dies erzeugt foglenden VM-Code: 141 20 26 133 2 580 1 132 65527 65535 65535 65535 65535 65535 65535 65535 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 VM_CAST_LONG_TO_INT bei allen Datentypen grö�er Integer automatisch bei ein <Bedingung> != 0 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 VM_CAST_LONG_TO_INT das folgende Word auch gelesen wird, ohne den Datenzeiger zu verändern, und, sobald das folgende Word den Wert 133 hat, werden bei VM_CAST_LONG_TO_INT 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. Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | ||
Antwort schreiben Antworten: Re: if-Abfrage bei Datentyp long oder float (von krassos - 7.11.2005 15:32) |