Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

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
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT V3.0
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)