Re: if-Abfrage bei Datentyp long Kategorie: Programmierung (von André H. - 11.11.2004 23:10) | ||
Als Antwort auf Re: if-Abfrage bei Datentyp long von Thomas - 11.11.2004 21:54 | ||
| ||
Hallo Thomas, > ... (vorher war es ja im Wertebereich eines int - habe falsch abgetippt). Das hätte ich auch sehen müssen. Dabei habe ich schon eine neue Brille. ;-) Du hast recht. Ein Binärvergleich oberhalb des 16. Bits ist nicht möglich. Ich hab' kurz in die VM gesehen. IF-Bedingungen werden immer nur 16 Bit-weise ausgewertet. Im Falle von Longvariablen hei�t dies, da� die oberen 16Bit abgeschnitten werden. Es gibt nämlich nur einen VM-Code, der beim If zu tragen kommt: VM_BRANCH_IF_ZERO Und dieser prüft nur den letzten 16Bit-Stack-Eintrag, ob dieser 0 ist. So sieht die Routine im OS aus: 0x69d8: MOV [-R0],R12 ;VM_BRANCH_IF_ZERO 0x69da: CALLS 0x765a ;POP_R4 0x69de: MOV R12,[R0+] ;Branch-Ziel 0x69e0: CMP R4,#0x0 0x69e2: JMPR cc_NZ,0x69e8 0x69e4: ADD 0xf92c,R12 ;Branch zur aktuellen Adresse addieren 0x69e8: RETS ;Rücksprung, VM macht ab der geänderten Adresse weiter Man müsste irgendwie erkennen, ob sich im Stack ein 16Bit oder ein 32Bit-Eintrag befindet. Ob eine Erkennung möglich ist, habe ich aber noch nicht geprüft. Falls ja, könnte ich evtl. eine änderung dieser Routine für OSOPT V3.1 vornehmen. Bis dahin mu�t Du leider mit dem Konstrukt if Bedingung!=0 Anweisung; bei Long-Werten vorlieb nehmen. Denn für alle Operatoren gibt es auch CAST-Anweisungen. NAtürlich nur als VM-Code, nicht direkt in C2. (Das macht der Compiler von selbst.) Für "If" gibt es dies leider nicht. 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 (von Thomas - 12.11.2004 0:09) Re: if-Abfrage bei Datentyp long (von André H. - 19.11.2004 11:51) Re: if-Abfrage bei Datentyp long (von krassos - 12.11.2004 12:46) |