
| 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: | ||