Home De PowerBASIC Gazette #10 in het Nederlands De PowerBASIC Gazette #24 in het Nederlands De PowerBASIC Gazette #25 in het Nederlands

PowerBASIC Gazette #25 (Nederlands)

14 February 2002

Van: Bob Zale, President
      PowerBASIC, Inc.

Aan:   PowerBASIC klant

PowerBASIC Gazette #25
======================

      ***  Waarschuwing  .....  Windows Bug  ***

Beste gebruiker,

Welkom bij de volgende Gazette van PowerBASIC! Vandaag willen we u een waarschuwing geven voor een redelijke ernstige fout in Windows. Maar met een eenvoudige manier om het te vermijden natuurlijk. Leest u aub verder.

We hebben bevestigd dat in ieder geval een aantal versies van Win2000 (en misschien ook nog andere versies) een ernstige tekortkoming hebben in het gebruik van de numerieke coprocessor. De Windows API functie MESSAGEBOX() zal bij uitvoeren de inhoud van de Numerieke Processor (de 80x87) kunnen veranderen. Natuurlijk gebruikt ook het MSGBOX commando en functie deze aanroep van de WINAPI MessageBox(), met dezelfde fatale bijverschijnselen als mogelijk gevolg.  Dit probleem treedt op bij elke programmeertaal, dus niet alleen PowerBASIC.

Zodra MessageBox() wordt uitgevoerd op één van de systemen met deze tekortkoming, worden alle interne registers op de nul-waarde ingesteld. Het precisie-nivo van alle berekeningen worden teruggezet naar een 54-bits mantissa (dit is overeenkomstig dubbele precisie). Dit is een grove schending van 'De Regels' van hoe een besturingssysteem zich zou moeten gedragen, en wordt hopelijk door Microsoft in de nabije toekomst worden gecorrigeerd.

Dus wat betekent dit voor u? In enkele gevallen: niets. Als u geen extended precisie variabelen gebruikt in uw programma, u slechts een 54-bits mantissa nodig heeft (ipv 64 bit). Dat is meestal geen probleem. Maar het andere deel van het probleem kan veel serieuzer zijn. Vaak slaan hogere programmeertalen zoals ook PowerBASIC één of meer tijdelijke variabelen op. De numerieke processor registers zijn daarbij een perfecte keus, aangezien ze een optimale snelheid bieden, dus de meeste betere compilers gebruiken deze technique vaak. Als deze waardes (of zelfs floating point register variabelen) ineens op nul worden gezet, is dit rampzalig voor uw programma.

Is het mogelijk uzelf te beschermen? Gelukkig is het antwoord een duidelijk 'JA'. Hier is de te gebruiken techniek.....


We stellen het volgende voor: maak een aparte eigen geschreven functie aan die de MSGBOX commando en functie omvatten en stel de NPX control Word op het standaard bit-masker in. Een meteen te gebruiken voorbeeld volgt in de tekst. Gebruik deze functie in elk programma dat een MSGBOX functie of statement gebruikt. Doorzoek al uw code en verander elke MSGBOX referentie naar deze nieuwe zelfgeschreven functie. En dat is alles om ervoor te zorgen dat u het Windows-probleem niet tegenkomt. We kunnen niet garanderen dat deze methode ook met andere compilers correct werkt.

Waarom is het zo eenvoudig op te lossen met powerBASIC? Nou, om de hoogste snelheid en efficiency te behalen stelt PowerBASIC automatisch alle tijdelijke variabelen in de numerieke processor veilig bij aanroep van een andere SUB of FUNCTION en herstelt deze bij terugkomst. En aangezien er slechts totaal acht registers zijn, behoren alle acht registers ter beschikking te zijn voor de aangeroepen  functie voor optimale prestatie. Indien dit niet gedaan zou worden, moet de functie misschien wel vergaande compromissen maken. Natuurlijk biedt niet elke compiler dit niveau van veiligheid en efficiëntie, maar we zijn blij deze eigenschap voor alle huidige PowerBASIC compilers te bevestigen. Als u de techniek zoals aangegeven gebruikt, zal het probleem meteen verholpen zijn.


Function MesgBox(Mesg$, MesgStyle&, MesgTitle$) as Long

    MesgBox = MSGBOX(Mesg$, MesgStyle&, MesgTitle$)
    CtrlWrd% = &B0001001100111111
    ASM FLDCW CtrlWrd% ; this guarantees extended precision

End Function

============================

De overige tekst is reclame voor andere producten van PowerBASIC, die deels al eens eerder is gestuurd

 

 

Bezoek het PB forum in het Nederlands en/of teken mijn gastenboek.

Datum laatste aanpassing:
29 december 2003 03:41:54

Email mij voor reacties,
aanvullingen en correcties